谁能给我一些关于同步写入和读取数据库的各种方法的指导?
有哪些不同的技术,你如何评估每一种技术,包括可靠性、性能、实施成本等。
通常在 CQRS 中,写入 DB 用于存储长时间运行的进程 (sagas) 的过渡数据。如果您正在同步读写数据库(我假设您的意思是两种方式),您可能做错了什么。
对于一个服务需要多条消息的长时间运行的进程,它需要一种在所有消息到达之前临时存储数据的方法。这方面的一个例子是客户注册,需要经理批准,这需要一周的时间来处理。该服务需要一种在批准到达之前临时存储客户信息的方法。这是写入数据库用于存储这段临时数据的地方。请注意,在客户获得批准之前,尚未将任何内容写入读取数据库。
当批准最终到达时,服务将从写入数据库中获取客户信息,完成注册过程并将其写入读取数据库。此时,写入数据库中的临时客户信息已完成工作,可以从写入数据库中删除。请注意,不涉及任何双向同步。
对于更简单的过程,例如更改客户名字,可以立即将更改写入读取的数据库。不需要写入写入 DB,因为在这种情况下没有临时数据。
如果您像我一样将读取存储视为查询服务使用(及其非规范化)的数据库,而将写入数据库视为存储域事件的数据库,那么如果您需要将它们同步到特定时刻,那么您可以做的只是重播您存储的事件。如果您希望尽可能保持最新,则无需受版本限制
如果您使用的是 CQRS,那么您可能会有一个看起来像这样的存储库
public interface IRepository<T> where T : AggregateRoot, new()
{
void Save(AggregateRoot aggregate, int expectedVersion);
T GetById(Guid id);
T GetById(Guid id, int version);
}
希望这有助于干杯
查询模型不需要一致。它需要最终一致。查询模型也是视图模型,即表已经按照用户界面的要求加入。所以你甚至可以使用内存缓存,或者像 Redis。
命令端就像命令对象,其中包含更新数据库的所有相关信息。这些对象可能会填满消息队列。命令对象由命令处理器处理,该处理器以事务方式更新查询缓存和写入数据库。写入数据库可以是 RDBMS .. 但很明显,应该像 MongoDB 一样进行写入优化。
您也可以通过消息系统更新读取数据库。
用于此目的的一些好的消息传递系统是 RabbitMQ 和 0MQ。