我对
CQRS(Command and Query Responsibility Segregation)
模式有一点困惑。
我们知道,在
CQRS
中,读写操作应该发生在分离的数据库上。而在应用层面,当写操作发生时,我们需要将数据同步到读数据库。例如,下图显示了将数据写入sqlite
并将基于rabbitmq
的数据同步到mongodb 作为读取数据库的CQRS 模式。 (这里展示的基本例子是基于这篇文章谈CQRS)
而且我们也知道,生产中的数据库作为一个集群运行,由一个
replica set
组成,可以提供高可用性特性。在副本集中,primary
服务器接收写入(和读取)操作并将数据同步到 secondary
服务器(可以响应读取请求)。集群做了很多复杂的工作(比如选举算法)来保持副本集之间的一致性。
我的困惑点是,如果我们在应用程序级别使用
CQRS
模式,我们已经将数据库进行了读写分离。这里的数据库是独立服务器或集群(其中包含读/写服务器)。
本题不提供示例代码,更像是一道架构级别的题
数据库中的读写分离比CQRS更多的是一个实现细节。 CQRS 就是关于分离读取和写入的实现。但是,你怎么做取决于你。
其次,在您的图片中,我认为在读写端之间使用队列并不是最佳选择。例如:
如果要重建读取端怎么办?
如果队列中的消息乱序怎么办? (保证订购问题)
重复消息(至少一次)
如果要添加多个读边怎么办?
更简单灵活的做法是让读端从写端“拉”出自己需要的数据。这简化了写端的实现。