RabbitMQ+;MassTransit:如何从处理中取消排队消息?
在某些特殊情况下,我需要在接收点告诉消费者某些消息不应该被处理。否则,两个系统将变得不同步(我们处理一些过时的外部系统,例如,如果断开连接,我们必须放弃该连接范围内的所有排队操作) 冒险并手动解决问题消息?赔偿行动(在我的情况下,这可能很难支持)?还有别的吗?有几种方法:RabbitMQ+;MassTransit:如何从处理中取消排队消息?,rabbitmq,nservicebus,masstransit,message-bus,Rabbitmq,Nservicebus,Masstransit,Message Bus,在某些特殊情况下,我需要在接收点告诉消费者某些消息不应该被处理。否则,两个系统将变得不同步(我们处理一些过时的外部系统,例如,如果断开连接,我们必须放弃该连接范围内的所有排队操作) 冒险并手动解决问题消息?赔偿行动(在我的情况下,这可能很难支持)?还有别的吗?有几种方法: 您可以在发送消息时设置生存时间:wait endpoint.Send(myMessage,c=>c.TimeToLive=TimeSpan.FromHours(1)),但这将适用于像这样发送(或发布)的所有消息。在考虑你的要
- 您可以在发送消息时设置生存时间:
wait endpoint.Send(myMessage,c=>c.TimeToLive=TimeSpan.FromHours(1))代码>,但这将适用于像这样发送(或发布)的所有消息。在考虑你的要求后,我会考虑这个问题。这是技术性的,但它是一种适当的消息传递模式
- 为消息本身设置TTL和生成时间戳属性,并让消费者决定消息是否仍然值得处理。这是一种更为商业化的方式,而且可能是最正确的方式
- 将技术和业务结合起来-将时间戳和TTL保留在消息头中,这样它们就不会污染消息契约,并使用自定义中间件将它们过滤掉。在这种情况下,您需要小心地记录这些删除,这样您就不会感到奇怪,为什么消息会时不时地消失
- 几乎任何不可靠的集成都可以使用sagas进行监控,并带有超时。例如,我们使用传奇故事与Twilio进行整合。因为我们无法为他们打开webhook,所以我们会在一段时间后进行轮询以检查消息状态。当您收到一条消息并安排一条消息以检查处理是否仍在等待时,您可以开始一个传奇。正如在评论中所讨论的,您可以使用“需要人工干预”的方式来解决问题,也可以让传奇故事决定放弃该消息
- 类似的方法可以是使用查找表,在其中放置与处理无关的消息列表。这样的表格类似于传奇故事的列表。这种方式似乎也需要安排时间。无论是在这里还是在这个故事中,我都建议对
消息使用一个单独的接收端点(队列),只有一个消费者。它可以防止DropIt
消息卡在等待处理的集成消息后面(有些消息应该已经被丢弃)DropIt
- 使用RMQ管理API从队列中删除消息。这是最糟糕的方法,我不推荐
- 您可以在发送消息时设置生存时间:
wait endpoint.Send(myMessage,c=>c.TimeToLive=TimeSpan.FromHours(1))代码>,但这将适用于像这样发送(或发布)的所有消息。在考虑你的要求后,我会考虑这个问题。这是技术性的,但它是一种适当的消息传递模式
- 为消息本身设置TTL和生成时间戳属性,并让消费者决定消息是否仍然值得处理。这是一种更为商业化的方式,而且可能是最正确的方式
- 将技术和业务结合起来-将时间戳和TTL保留在消息头中,这样它们就不会污染消息契约,并使用自定义中间件将它们过滤掉。在这种情况下,您需要小心地记录这些删除,这样您就不会感到奇怪,为什么消息会时不时地消失
- 几乎任何不可靠的集成都可以使用sagas进行监控,并带有超时。例如,我们使用传奇故事与Twilio进行整合。因为我们无法为他们打开webhook,所以我们会在一段时间后进行轮询以检查消息状态。当您收到一条消息并安排一条消息以检查处理是否仍在等待时,您可以开始一个传奇。正如在评论中所讨论的,您可以使用“需要人工干预”的方式来解决问题,也可以让传奇故事决定放弃该消息
- 类似的方法可以是使用查找表,在其中放置与处理无关的消息列表。这样的表格类似于传奇故事的列表。这种方式似乎也需要安排时间。无论是在这里还是在这个故事中,我都建议对
消息使用一个单独的接收端点(队列),只有一个消费者。它可以防止DropIt
消息卡在等待处理的集成消息后面(有些消息应该已经被丢弃)DropIt
- 使用RMQ管理API从队列中删除消息。这是最糟糕的方法,我不推荐
- 有几种方法:
总之,这是分布式系统的一个问题,即保持一切同步。补偿行动是解决这一问题的方法。如果无法采取补偿措施,您将处于非常困难的境地。试着通过变得更灵活,接受你需要补偿的事实,看看业务是否能有所帮助,他们会告诉你这是不可能的。据我所知,你正在建立一个