【问题标题】:Rabbitmq - how to handle channels when not automatically acking messagesRabbitmq - 不自动确认消息时如何处理通道
【发布时间】:2016-11-16 06:09:05
【问题描述】:

我认为 RabbitMQ 的一个常见用例是: 工作队列 - 服务器从用户获取请求并将它们存储在队列中以供以后处理。问题是某些任务可能需要一分钟,所以我决定不自动确认:

GetResponse response = channel.basicGet(queueName, false);

我想在工作完成时确认

channel.basicAck(deliveryTag, false);

据我所知: https://www.rabbitmq.com/confirms.html(“在同一频道上发送 basic.ack” - 应在接收消息的同一频道上进行确认)。

所以我决定将消息映射到通道(在我的用例中,每条消息都有一个通道)。每次消息的工作完成时,我都会确认。

我认为这个设计有很大的缺陷。它迫使我在我的服务器中保存一个状态,并迫使我为每条消息拥有一个频道,而不是重复使用频道。

我确信这是一个广泛常见的用例 - 会是什么: 1.我应该推迟使用线程本地通道吗?如果是这样,是否可以在不同的线程上确认消息? 2.有没有比保存这条消息->频道映射更好的方法来处理acking消息?

谢谢

【问题讨论】:

    标签: java rabbitmq


    【解决方案1】:

    我对 java 不太熟悉,但据我了解,每个线程只有一个通道是正确的。我不认为通道是线程安全的。

    此外,存储频道 ID(或名称或其他任何内容)并在同一频道上确认消息是必要的

    我个人认为您提供的内容的高级概述没有任何问题。

    不过,您说得对,“每条消息的频道”是个坏主意。它应该是每个线程的通道,您可以在同一个通道和同一个线程内消费多条消息。

    只要确保在消费它的通道上确认消息

    【讨论】:

    • 如果通道对象以某种方式关闭,我可以使用 connection.createChannel(channelNumber) 重新打开它并在该通道上确认它吗?
    • 还有——频道永远不会关闭吗?
    猜你喜欢
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2023-03-26
    • 2015-06-21
    • 2016-05-04
    • 2017-02-12
    • 1970-01-01
    相关资源
    最近更新 更多