如何解决具有事件来源的CQRS模式,具有用于读取/写入的单个数据库
我有一个用于读取和写入操作的SQL Server数据库,并且我正在实现CQRS模式以实现代码隔离和可维护性,以便可以将读取操作分配给团队中的少数资源,并将写入操作分配给其他资源, CQRS似乎是一种干净的方法。
现在,无论何时数据库中的表上发生插入/更新/删除操作,我都需要向其他需要发送系统信息的系统发送消息,因为我的数据库是主数据,因此此处发生的任何更改需要将其投影到下游系统,以便他们获取最新数据并将其维护在系统中。为此,我可以使用MQ或Kafka,以便每当有更改时,我都可以生成密钥消息并放入MQ或使用kafka进行消息传递。
直到现在,我还没有使用事件源,因为我没有多个数据库可读写,所以我可能不需要事件源,这是我的正确假设,即如果我们只有一个数据库,就不会需要事件采购?或Event Sourcing可以在利用MQ或Kafka方面发挥任何作用,我的意思是,如果我使用Event Sourcing模式,我可以先将数据保存在master数据库中,然后使用Event Sourcing模式将更改写入MQ或使用kafka编写消息,我一无所知如果我们可以对MQ或Kafka使用事件搜索模式。
我是否需要事件源才能将消息写入MQ或使用Kafka?还是完全不需要,因为我只有一个数据库,并且我不需要知道记录系统发生的一系列更新,而我所关心的只是主数据库中记录的最终状态然后使用MQ或Kafka将更改发送到有CRUD操作的下游系统,以便它们具有最新更改。
解决方法
我的假设是正确的,如果我们只有一个数据库,则不需要事件源?
不,这种假设是错误的。
在CQRS“传统”中,事件来源是指在持久数据结构中维护信息;当收到新信息时,我们会将这些信息追加到我们已经知道的地方。换句话说,它描述了我们用来记住信息的模式。参见Fowler 2005。
当您开始谈论诸如Kafka或Rabbit的消息传递解决方案时,您所处的问题空间是不同的:如何在系统之间共享信息?好吧,我们将信息放入消息中,然后将消息从生产者传递到消费者。而且出于历史原因,该消息称为事件(请参阅Hohpe等人)。
两种不同的想法,容易混淆。当CQRS人们谈论事件源时,他们的意思和Kafka人们谈论事件源时的意义不同。
我是否需要事件源才能将消息写入MQ或使用Kafka?
否-即使您选择了事件来源以外的其他记忆策略,消息传递仍然有效。
完全按原样修改模型,然后发布一条消息,宣布情况已发生变化,这是完全合理的。
当我只有一个数据库并且我不关心记录的一系列更改而只关心数据的最终状态时,为什么需要事件源
你没有。
事件来源的两个最常见动机是:(a)事件历史与您正在工作的域(例如,会计)具有自然的一致性,或者(b)支持时态查询。
如果您没有这些问题,那么就不需要它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。