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从队列中删除消息。这是最糟糕的方法,我不推荐


      据我所知,您正在构建一个向第三方系统发送消息的系统。换句话说,你无法控制的系统。它有一个API,但补偿操作并不总是可能的,因为API没有提供它,或者因为操作是在第三方系统内执行的,无法补偿或回滚

      如果可能的话,试着通过传说来解决这个问题。确保saga以正确的顺序执行不同的步骤(发送消息)。因此,无法补偿的消息将最后发送。这样,如果失败可以得到补偿的信息,将通过传奇故事得到补偿。那些不能得到补偿的应该在最后发送,当你尽可能确定他们不需要得到补偿的时候。因为最后一条消息是同步所有系统的最后一步


      总之,这是分布式系统的一个问题,即保持一切同步。补偿行动是解决这一问题的方法。如果无法采取补偿措施,您将处于非常困难的境地。试着通过变得更灵活,接受你需要补偿的事实,看看业务是否能有所帮助,他们会告诉你这是不可能的。

      据我所知,你正在建立一个