我有一个用于读写操作的sqlserver数据库,我正在实现cqrs模式以实现代码分离和可维护性,这样我就可以将读操作分配给团队中的少数资源,将写操作分配给其他资源,我认为使用cqrs似乎是一种干净的方法。
现在,每当在我的数据库中的表上发生插入/更新/删除操作时,我都需要向其他系统发送消息,这些系统需要了解我的系统中的更改,因为我的数据库是主数据,所以这里发生的任何更改都需要投影到下游系统,以便它们获得最新的数据并在系统中维护它。为此,我可以使用mq或kafka,因此每当发生更改时,我都可以生成关键消息并将其放入mq或使用kafka进行消息传递。
到目前为止,我还没有像我所想的那样使用事件源,因为我没有用于读/写的多个数据库,所以我可能不需要事件源,我的假设是否正确,如果我们有单个数据库,我们就不需要事件源?或者事件源在使用mq或kafka时可以发挥任何作用,我的意思是,如果我使用事件源模式,我可以先将数据保存在主数据库中,然后使用事件源模式将更改写入mq或使用kafka编写消息如果我们可以使用mq或kafka的事件源模式,我在这里就不知道了。
将消息写入mq或使用kafka需要事件源吗?或者在我的例子中根本不需要它,因为我只有一个数据库,我不需要知道发生在记录系统上的一系列更新,我只关心主数据库中记录的最终状态,然后使用mq或kafka将更改发送到下游系统,在那里有crud操作,这样它们就可以运行了有最新的变化。
1条答案
按热度按时间eulz3vhy1#
我的假设是正确的,如果我们有一个数据库,我们不需要事件源?
不,这个假设是错误的。
在cqrs“传统”中,事件源是指在持久数据结构中维护信息;当新信息到达时,我们会把这些信息附加到我们已经知道的东西上。换句话说,它描述了我们用来记忆信息的模式。见福勒2005。
当你开始谈论像kafka或rabbit这样的消息传递解决方案时,你会遇到一个不同的问题空间:如何在系统之间共享信息?好吧,我们将信息放入一条消息中,并将消息从生产者传递给消费者。由于历史的原因,这种信息被称为事件(见hohpe等人)。
两种不同的想法,容易混淆。当cqrs的人谈论事件源时,他们的意思和kafka的人谈论事件源并不相同。
将消息写入mq或使用kafka需要事件源吗?
即使你选择了其他的记忆策略而不是事件来源,没有消息仍然有效。
它是完全合理的修改您的模型“原地”,因为它是,然后还发布一条消息,宣布事情已经改变。
当我只有一个数据库时,我不关心记录的一系列更改,只关心数据的最终状态,为什么我需要事件源呢,
你没有。
事件源的两个最常见的动机是:(a)事件历史与您正在工作的域自然一致(例如:记帐),或者(b)需要支持时态查询。
如果你没有这些问题,那你就不需要了。