【问题标题】:Retrying messages with a timeout超时重试消息
【发布时间】:2020-05-28 18:15:17
【问题描述】:

我们必须创建一个响应者应用程序作为 Windows 服务,它将消息从队列中取出,确认发送者我们收到了它们,并通过在 5 秒内发送回响应来验证它们。在我们从发件人那里得到另一个确认我们可以处理该消息后,我们处理该消息并在另一个(5 秒)内将该请求的结果发送回给他们。如果在该周期的任何时候,他们或我们没有将消息从队列中取出并在分配的时间内做出响应,则消息将过期,我们将需要重试消息。

我们无法确定消息何时过期并需要重新发送。我一直在阅读有关将它们放在死信queue 上的信息,但我不确定它的目的是否符合我们的需要。死信队列不适用于刚刚超时但传输失败的项目。我还阅读了有关在 MQMessage 本身上使用 Report 选项来生成报告并可能将其移动到可以监控的不同队列的信息。然后我们需要重试新队列中的项目。

如果我需要监控每条传入和传出消息以确保我们从正在与之通信的其他 MQ 服务器获得响应,那么我只有这两个选择吗?

【问题讨论】:

  • 您应该在代码中构建响应/确认逻辑,而不是希望以某种方式配置 MQ 基础架构来帮助您。
  • 我将使用基于 2 表数据库的机制来执行此操作。第一个表将保存来自 Q 的消息。第二个表将保存 Okay to Process 消息。我将有一个进程/线程扫描 MQ 以获取消息。选择消息并将其插入到相关表中。如果它转到第一个表,则以 ACK 消息响应。
  • 另一个进程/线程将继续查看第二个表中的新记录并处理第一表中的相应消息。如果需要,写回 ACK 以确认消息已处理。稳健性 - 理想情况下,我会从队列中窥视一条消息,确定它去哪个表,写入该表,然后提交/告诉 Q 删除该消息。这样我就可以防止消息在飞行中丢失。
  • @PrateekShrivastava 这是我们最初的想法之一,但是随着这些表的大小增加,从它们中选择数据然后确定要写入哪个表/要更新哪个记录所需的时间,我们可能非常接近我们强加给我们的时间限制。我们正在努力寻找一种方法来尽可能缩短处理/等待时间。
  • @JoshMc 这些是客户提出的要求。他们在每一步都需要承认。我想原因是因为消息中有货币交易。

标签: c# .net websphere ibm-mq message-queue


【解决方案1】:

我会在 MQ 中使用消息过期和活动报告来实现这一点,但这并不意味着您的应用程序不需要记录它们发送和接收的内容。

对于您发送的每条消息,您可以设置一个过期时间(这意味着如果该消息在该时间范围之外从队列中删除,则该消息将被丢弃)。并且通过设置在消息被丢弃时获取报告的报告选项,消息的发送者(实际上您可以为报告指定任何队列,而不仅仅是发送者监视的一个)将获得一个报告消息,标识丢弃的消息,它然后可以重新发送。

但是,丢弃的消息不会被放入任何队列,发送应用程序需要能够从头开始重新发送消息。

而处理端,当它等待第二条消息时,它需要有自己的“计时器”来处理超时。

https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.1.0/com.ibm.mq.ref.dev.doc/q097490_.htm

https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.1.0/com.ibm.mq.mon.doc/q036600_.htm

综上所述,在我看来,您并没有按预期使用 MQ,而是试图模仿同步通信。 MQ 可以保证一次交付,所以我想说,如果您在应用程序之间有一个正确配置和大小的 MQ 路由并正确设置消息监控,那么所有这些 ack/nack 都是不必要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多