处理前检查RabbitMQ消息序列

处理前检查RabbitMQ消息序列,rabbitmq,Rabbitmq,问题:正在运行多个消费者应用程序实例。如果连续通过rabbitmq队列发送与实体相关的两条消息。第二个事件将包含第一个事件中的所有更改,因此,我们根本不需要处理第一个事件。我们怎么做 想法: 对事件进行编号,并在实体表中有一列表示事件。当处理一个事件时,事件的seq会再次与表seq num匹配。如果它大于表seq num,我们将保留实体更改。如果没有,就放弃它 有没有办法通过RabbitMQ检查是否存在与已发送或确认的同一实体相关的新事件?如果是,请检查它的seq num并进行验证。仍然存在覆盖

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

想法:

  • 对事件进行编号,并在实体表中有一列表示事件。当处理一个事件时,事件的seq会再次与表seq num匹配。如果它大于表seq num,我们将保留实体更改。如果没有,就放弃它

  • 有没有办法通过RabbitMQ检查是否存在与已发送或确认的同一实体相关的新事件?如果是,请检查它的seq num并进行验证。仍然存在覆盖新更改的风险


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

    Rabbitmq队列按发布顺序排序

    如果您与一个消费者使用直接交换,应该不会有问题。但若你们使用更多的消费者来扩展,消费的顺序是无法保证的

    所以你必须手动处理

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

    例如:

    第一个事件:SomethingHappenedEvent{entityId:y,dataVersion:x,otherPayloads…}

    第二个事件:SomethingHappenedEvent{entityId:y,数据版本:x+1,其他有效负载…}

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

    另一个解决方案是将分布式锁与redis之类的东西结合使用。您可以在使用同一实体的事件时锁定使用者。因此,一个消费者一次为特定实体做一项工作

    我不知道这对你的情况是否是一个有用的解决方案,但它可能会给出一个想法