【发布时间】: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消息?
谢谢
【问题讨论】: