在处理之前检查RabbitMQ消息序列

时间:2018-08-03 15:28:00

标签: rabbitmq

问题:正在运行多个消费者应用程序实例。如果与实体相关的两个消息是连续通过Rabbitmq队列发送的。第二个事件将具有第一个事件的所有更改,因此,我们根本不需要处理第一个事件。我们该怎么做?

想法:

  1. 为事件编号,并在实体表中具有表示该事件的列。处理事件后,该事件的seq与表seq num再次匹配。如果它大于表seq num,我们将保留实体更改。如果没有,请将其删除。

  2. 是否可以用RabbitMQ检查是否存在与已发送或确认的同一实体相关的新事件?如果是,请检查它的序列号并进行验证。仍然有可能覆盖新的更改。

不确定是否有更好的方法。请提供您的想法。

1 个答案:

答案 0 :(得分:1)

Rabbitmq队列按发布顺序排序。

如果您与一个消费者进行直接交换,应该没有问题。但是如果您使用更多的消费者来缩放消费顺序,则无法保证。

所以您必须手动处理它。

我认为您的事件是在您的数据发生更改时发生的。因此,您可以使用数据版本控制。

例如:

第一个事件:SomethingHappenedEvent {实体ID:y,dataVersion:x,otherPayloads ...}

第二个事件:SomethingHappenedEvent {实体ID:y,dataVersion:x + 1,otherPayloads ...}

当一个消费者获得第一事件时,另一个消费者获得第二。 第一个使用者使用版本x搜索数据,但找不到,因此您可以丢弃该事件。因为发生了数据更新,并发生了第二个事件。

另一种解决方案是将分布式锁与redis等一起使用。您可以在使用同一实体的事件时锁定使用者。因此,一个消费者一次为一个特定实体完成一项工作。

我不知道这些解决方案是否适合您的情况,但可能会给出一个主意。