我正在编写一个系统,该系统将利用 Mongo 实现持久性,利用 RabbitMQ 进行消息总线/事件队列,并且我正在尝试找出在发布端应对故障的最佳方法。
我能想到三种情况:
- 一切正常 - 一致
- 一切都失败了 - 一致
- 部分有效,以较晚发生的为准已过时 - 不一致
最后一个案例是我感兴趣的,我很想知道其他人如何解决这个问题,因为 XA 不是一个选项(而且我也不希望有性能开销)。
我能想到几个解决方案:
- 向 Mongo 文档添加“lastEvent”(或类似的)字段。定期扫描lastEvent
- 在 Mongo 中持久化之前在 Rabbit 中触发事件,并允许安全处理可能未实际发生的事件(真的不喜欢这种方法)
其他人能否阐明如何跨持久层和消息总线提供某种一致性?
最佳答案
1 从来都不是一个好主意,一旦引入多线程或多进程系统,并且当生成该“时间”时,“最后 X 时间”的概念就会失效(如果某些请求比其他请求需要更长的时间来处理,那么“稍后”时间可能会在“较早”时间之前写入持久存储)
2 基本上是 Idempotence ,如果做得正确,这种模式非常适合设计容错系统
关于java - MongoDB 和 RabbitMQ 之间的一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28057912/