rabbitmq 如何确保将消息提供给队列中的特定使用者?

lyr7nygr  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(2)|浏览(136)

我们正在微服务架构中工作,并且使用RabbitMQ作为消息代理。我们希望避免发生以下情况:
1.一个实体开始创建,但需要一段时间才能完成。
1.系统确定创建时间过长,并且由于超时而应删除实体,因此它发送消息以删除当前仍在创建的实体
1.删除消息被使用,系统检查实体是否存在,但由于实体仍在创建过程中,因此未找到该实体。
1.由于找不到实体,删除实体消息使用者返回错误。
如何确保在create消息完成后使用delete消息,而不会阻塞其他消息的使用?

iqih9akk

iqih9akk1#

如何确保在创建消息完成后使用删除消息,而不会阻塞其他消息的使用?
假设你的实体创建超时是N。负责创建实体的工作者应该知道这个超时,并且应该能够在达到N时取消实体创建。这不是严格必要的,但听起来你的实体创建可能是资源密集型的,所以取消应该是你的一个功能。
如果您的工作人员知道在达到超时N时取消实体创建,那么也许您甚至不需要删除消息?
如果保留删除消息,则工作者处理即可能执行以下操作:

  • 首先,确保队列配置了Dead Letter Exchange
  • 使用消息,并尝试删除实体
  • 如果删除成功,很好,用RabbitMQ确认消息,就完成了
  • 如果删除失败,用RabbitMQ nack(拒绝)该消息,并将requeue设置为false
  • 工作线程应从绑定到此死信交换的队列中使用。您可以有一个专用于重试实体删除的队列。当工作线程使用此队列中的消息时,它可以重试删除。如果失败,您可以再次拒绝它(当然,在延迟之后),并且如果此队列具有相同的死信设置,则会发生相同的过程
  • 最后,请确保删除工作进程遵守count属性,并且只尝试删除实体一定的次数。
    **注意:**RabbitMQ团队监控rabbitmq-users邮件列表,仅在某些时候回答StackOverflow上的问题。
uqdfh47h

uqdfh47h2#

  • 看一看CAP理论CAP理论可以帮助你确定合适的策略

  • 那么您必须实现 Saga 模式,(基于所选的CAP理论策略)对于您的事件通信,可分类为编排或编排。如果源请求并行提供事件以完成工作,则最好选择编排,如果您有一些事件按顺序触发,则编排可能是一个不错的选择。(这是我的看法). Saga 帮助您控制事件通信,并在出现故障时检查事件消耗和角色回退。
  • 断路器帮助您提供重试和超时等策略。

相关问题