CQRS: Storing events and publishing them - how do I do this in a safe way?

寵の児 提交于 2019-11-27 10:01:20

问题


As I've learned in Why is the CQRS repository publishing events, not the event store? it's the CQRS repository's task to publish events. So far, so good.

Of course, storing the events and publishing them should be within one single transaction. Technically this means writing one (or more) records to the store, and publishing one (or more) events to a message bus. Hence, a simple database transaction is not enough, it should be a distributed one.

Now, unfortunately, many NoSQL databases (such as MongoDB) do not support ACID-compliant transactions, not even to talk of the possibility of taking place in a distributed transaction. More over, there are message queues out there that do not support distributed transactions as well.

So the question is: How do I deal with this?

Is there a recommended pattern to use?


回答1:


Your repository could publish events, it doesn't have to. The solution in this case is to use the event store as a queue. You would have a background process that monitors the event store for new events, publishes them to (for instance) a bus, and then marks them as dispatched.

As always, there are trade-offs. You'll likely have to deal with at-least-once messaging and idempotent processing. It's more complex than using a simple distributed transaction.

Jonathan Oliver has written several posts about this topic that might help you out: Removing 2PC, How I Avoid Two-Phase Commit, Idempotency Patterns



来源:https://stackoverflow.com/questions/13488982/cqrs-storing-events-and-publishing-them-how-do-i-do-this-in-a-safe-way

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!