MongoDB和RabbitMQ之间的一致性

时间:2015-01-21 01:01:06

标签: java mongodb rabbitmq

我正在编写一个将Mongo用于持久性的系统和用于消息总线/事件排队的RabbitMQ,并且我试图找出在出版方面对失败具有弹性的最佳方法。

我可以想到三种情况:

  1. 一切正常 - 一致
  2. 一切都失败了 - 一致
  3. 部分工作,以较晚者为准,已过期 - 不一致
  4. 最后一个案例是我感兴趣的案例,我很想知道别人如何解决这个问题,因为XA不是一个选择(而且我不会这样做)。无论如何都要想要性能开销。)

    我能想到几个解决方案:

    1. 添加" lastEvent" (或类似的)字段到Mongo文档。在定期间隔内,扫描lastEvent< lastUpdated,并触发一个事件(这需要对每个更改进行额外更新,并在更新的情况下丢失"旧"文档的上下文)
    2. 在Mongo中坚持之前中的事件,并允许安全处理可能没有发生的事件(真的不喜欢这种方法)。
    3. 其他人是否可以阐明如何在持久层和消息总线之间提供某种一致性?

1 个答案:

答案 0 :(得分:2)

1 永远不是一个好主意,"过去X时间的概念"一旦你引入了多线程或多进程系统,那么它就会崩溃,并且当这个时间和#34;生成(如果某些请求需要更长时间来处理其他请求,那么"以后"时间可能会在"之前和#34;时间之前写入持久性存储)

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