实现回拨队列功能的 Rabbitmq 建议



我在 RMQ 中遇到了回拨队列功能。而且它也很花哨。整个想法是我已经创建了一个消息队列(queue1(,它的回调队列(queue1_cb(和它的dlq(queue1_dlq(。我正在实现具有 2 个节点的 HA 功能。

当我部署应用程序的 2 个实例时出现问题(我在Spring 启动中有一个发送方和一个接收方应用程序(。两者都在侦听同一个 HA 群集。场景如下。

  1. 发件人将消息发布到 RMQ。
  2. 接收方应用使用消息。接收器应用程序必须调用第三方API,该API是基于套接字的API及其异步,因此我在同一连接中没有得到响应。所以我存储频道和消息的对象,我需要确认消息。(请注意,我正在延迟确认,直到我收到来自第三方 API 的响应。
  3. 当我部署 2 个接收器应用程序实例时,任何实例都会从第三方 API 获得响应。并且两者都没有通道和消息的对象来确认消息并将消息发送到回调队列。

谁能给我一个关于proiority的解决方案? 下面是我的代码。

在接收器侧:

@Override
public void onMessage(Message arg0, Channel arg1) throws Exception {
String msg = new String (arg0.getBody());
AppObject obj = mapper.readValue(msg, AppObject.class);
Packet packet = new Packet();
packet.setChannel(arg1);
packet.setMessage(arg0);
packet.setAppObject(obj);
AppParam.objects.put(
String.valueOf(key , packet);
//Call third party API
}

在请求和发送回调消息时:

public boolean pushMessageToCallBack(String key , AppObject packet, Channel channel, Message message){
RabbitTemplate replyRabbitTemplate =  //Get the RabbitTemplate object. It is handled properly.
replyRabbitTemplate.convertAndSend(packet);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}

您需要为每个实例使用不同的回调队列,或者更简单地说,只需使用根本不需要队列的直接回复。

最新更新