回答
通常在CQRS,写入数据库用于存储过渡数据长时间运行的过程(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。
- 1. CQRS,DDD同步报告数据库
- 2. 在PhoneGap(Android和JavaScript)中读取和写入sqlite数据库同步
- 3. CQRS - 读取端数据库的外键
- 4. 同步串行端口读取/写入
- 5. 如何同步读取/写入流?
- 6. PHP缓存 - 保持数据库写入与读取缓存同步
- 7. PHP读取XML并写入数据库
- 8. 在Firebase数据库中读取和写入数据
- 9. 同时写入和读取同一文件(磁盘异步?)
- 10. Node.js异步读取和写入
- 11. 异步写入和读取文件
- 12. 在Firebase中读取和写入数据
- 13. LDAP和数据库同步
- 14. 共享存储器C++的读取和写入同步
- 15. 无法同步阻止读取和写入FIFO
- 16. 如何从数据库读取并写入http流。 php和mysql
- 17. 如何读取和写入MP3到数据库
- 18. 如何线程安全地读取和写入数据库?
- 19. Android数据库 - 从服务器写入和读取
- 20. 通过FMDatabase读取和写入NSDate到sqlite数据库
- 21. C++写入和从MySQL数据库中读取
- 22. 如何写入/读取和操作Microsoft Access数据库
- 23. 加快从文件读取和写入数据库
- 24. C++ boost asio |同步写入异步读取|无法在第二次收到正确的数据读取
- 25. 从两个不同的Java应用程序读取和写入SQLite数据库
- 26. 从OleDb数据库读取/写入数据表LINQ
- 27. 从XML中读取数据并将其写入数据库
- 28. Android读取和写入图库
- 29. 读取和写入Java密钥库
- 30. 同时写入和读取文件
你能解释它如何与DDD? – 2010-07-13 07:05:01
对不起!我的坏...我应该把CQRS放在那里...感谢提到哥们! – Mosh 2010-07-13 07:26:22