MongoDB 和 RabbitMQ 之间的一致性
Consistency Between MongoDB and RabbitMQ
我正在编写一个系统,该系统将利用 Mongo 实现持久化并利用 RabbitMQ 实现消息 bus/event 排队,并且我正在尝试找出最好的方法来恢复故障出版方。
我能想到的场景有以下三种:
- 一切正常 - 一致
- 一切都失败了 - 一致
- 部分有效,以较晚发生的为准 - 不一致
最后一个案例是我感兴趣的,我很想知道其他人是如何解决这个问题的,因为 XA 不是一个选项(而且我不希望性能开销).
我能想到几个解决方案:
- 向 Mongo 文档添加一个 "lastEvent"(或一些类似的)字段。在一个周期性的时间间隔内,扫描 lastEvent < lastUpdated 的文档,并触发一个事件(这需要对每个更改进行额外的更新,并且在更新的情况下会丢失 "old" 文档的上下文)
- 在 Rabbit 之前 持续 Mongo 触发事件,并允许安全处理可能实际上没有发生的事件(真的不喜欢这种方法)
其他人能否阐明如何跨持久层和消息总线提供某种一致性?
1 从来都不是一个好主意,一旦引入多线程或多进程系统,"last X time" 的概念就会失效,并且当 "last X time" =20=] 生成(如果某些请求比其他请求需要更长的时间来处理,那么 "later" 时间可能会在 "earlier" 次之前写入持久存储)
2 基本上是 Idempotence,如果处理得当,它是一种非常适合设计容错系统的模式
我正在编写一个系统,该系统将利用 Mongo 实现持久化并利用 RabbitMQ 实现消息 bus/event 排队,并且我正在尝试找出最好的方法来恢复故障出版方。
我能想到的场景有以下三种:
- 一切正常 - 一致
- 一切都失败了 - 一致
- 部分有效,以较晚发生的为准 - 不一致
最后一个案例是我感兴趣的,我很想知道其他人是如何解决这个问题的,因为 XA 不是一个选项(而且我不希望性能开销).
我能想到几个解决方案:
- 向 Mongo 文档添加一个 "lastEvent"(或一些类似的)字段。在一个周期性的时间间隔内,扫描 lastEvent < lastUpdated 的文档,并触发一个事件(这需要对每个更改进行额外的更新,并且在更新的情况下会丢失 "old" 文档的上下文)
- 在 Rabbit 之前 持续 Mongo 触发事件,并允许安全处理可能实际上没有发生的事件(真的不喜欢这种方法)
其他人能否阐明如何跨持久层和消息总线提供某种一致性?
1 从来都不是一个好主意,一旦引入多线程或多进程系统,"last X time" 的概念就会失效,并且当 "last X time" =20=] 生成(如果某些请求比其他请求需要更长的时间来处理,那么 "later" 时间可能会在 "earlier" 次之前写入持久存储)
2 基本上是 Idempotence,如果处理得当,它是一种非常适合设计容错系统的模式