2010-07-13 61 views
3

任何人都可以请给我的问候各种方式 一些方向同步写入和读取数据库?CQRS:同步写入和读取数据库

有什么不同的技术在那里,您如何评价每个在realiability,性能,以实现成本的 条件等

+0

你能解释它如何与DDD? – 2010-07-13 07:05:01

+0

对不起!我的坏...我应该把CQRS放在那里...感谢提到哥们! – Mosh 2010-07-13 07:26:22

回答

6

通常在CQRS,写入数据库用于存储过渡数据长时间运行的过程(sagas)。如果您正在同步读取和写入数据库(我假设您的意思是两种方式),那么您可能会出错。

对于长时间运行的过程,其中一个服务需要多条消息,它需要一种方法来临时存储数据的所有消息之前到达。这方面的一个例子是客户注册,需要经过一周处理的经理批准。该服务需要在批准到达之前临时存储客户信息的方法。这是写数据库用来存储这段临时数据的地方。请注意,在客户获得批准之前,尚未向读取的数据库写入任何内容。

当审批终于来临,服务将采取从写DB的客户信息,完成注册过程,并将其写入读取数据库。此时,写入数据库中的临时客户信息已完成其作业并可从写入数据库中删除。注意,没有涉及任何双向同步。

对于比较简单的过程,如更改客户的名字,改变可以被写入读取数据库的时候了。写入数据库不是必需的,因为在这种情况下没有临时数据。

1

如果您像我一样将读取存储看作查询服务使用(及其非规范化) 和将写入数据库作为存储域事件的数据库的数据库,那么如果您需要将它们同步到特定的时刻,那么你可以做的只是重放你存储的事件。 在这种情况下,你想为最新尽可能那么你不必如果使用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); 
    } 

希望这有助于 干杯

0

查询模型不需要一致..它需要最终一致。查询模型也是视图模型,即按照用户界面的要求已经连接了表。所以你甚至可以使用内存缓存,或者像Redis一样。
命令端就像命令对象,它包含所有相关信息来更新数据库。这些对象可能会填满消息队列。命令对象由事务性更新查询缓存和写入数据库的命令处理器处理。写入数据库可以是一个RDBMS ..但很明显,应该像MongoDB一样进行写入优化。
您也可以通过消息传递系统更新读取数据库。
于此目的的一些好消息系统的RabbitMQ和0MQ。