MongoDB 和 RabbitMQ 之间的一致性

Consistency Between MongoDB and RabbitMQ

我正在编写一个系统,该系统将利用 Mongo 实现持久化并利用 RabbitMQ 实现消息 bus/event 排队,并且我正在尝试找出最好的方法来恢复故障出版方。

我能想到的场景有以下三种:

  1. 一切正常 - 一致
  2. 一切都失败了 - 一致
  3. 部分有效,以较晚发生的为准 - 不一致

最后一个案例是我感兴趣的,我很想知道其他人是如何解决这个问题的,因为 XA 不是一个选项(而且我不希望性能开销).

我能想到几个解决方案:

  1. 向 Mongo 文档添加一个 "lastEvent"(或一些类似的)字段。在一个周期性的时间间隔内,扫描 lastEvent < lastUpdated 的文档,并触发一个事件(这需要对每个更改进行额外的更新,并且在更新的情况下会丢失 "old" 文档的上下文)
  2. 在 Rabbit 之前 持续 Mongo 触发事件,并允许安全处理可能实际上没有发生的事件(真的不喜欢这种方法)

其他人能否阐明如何跨持久层和消息总线提供某种一致性?

1 从来都不是一个好主意,一旦引入多线程或多进程系统,"last X time" 的概念就会失效,并且当 "last X time" =20=] 生成(如果某些请求比其他请求需要更长的时间来处理,那么 "later" 时间可能会在 "earlier" 次之前写入持久存储)

2 基本上是 Idempotence,如果处理得当,它是一种非常适合设计容错系统的模式