如何在两个应用程序之间使用RabbitMQ而我无法更改其中一个?

时间:2014-02-06 09:02:18

标签: rabbitmq message-queue

我有一个由两个节点组成的现有系统,一个客户端/服务器模型。 我想用RabbitMQ在它们之间交换消息。即客户端将其所有请求发送到RabbitMQ,服务器将无限期地侦听队列,使用任何到达的消息然后对其进行操作。

我可以根据需要更改服务器,但问题是,我无法更改客户端的行为。如何将响应发送回客户端?

客户端节点了解HTTP请求/响应,在将其他应用服务器直接配置到RabbitMQ而不是我的应用程序后,我该怎么办。

2 个答案:

答案 0 :(得分:0)

您可以使用RPC model或某些内部约定,例如将结果存储在具有已知ID的数据库(或缓存)中,并在一个周期内轮询存储以获取该结果

答案 1 :(得分:0)

您必须在中间使用代理服务器,它将节点1(您无法更改的客户端)视为实际服务器,而它只是将请求注入排队服务器。您还必须使用2个队列。

为清楚起见,让我们列举一下系统播放器:

  • 客户
  • 代理服务器,提供实际提供的相同API的服务器(但不做任何工作)
  • 实际服务器,执行实际工作的服务器
  • 输入队列,客户端请求进入的队列(代理服务器执行此操作)
  • 输出队列,服务器响应进入的队列(实际服务器执行此操作)

可能的工作方案:

  • 客户端向代理服务器发送请求
  • 代理服务器将请求放入输入队列
  • 实际服务器(侦听输入队列)将获取请求
  • 实际服务器处理消息
  • 实际服务器将响应发送到输出队列
  • 代理服务器(侦听输出队列)将获取响应
  • 代理服务器将响应返回给客户端

这可能有效,但很少会出现问题,例如:因为代理服务器不知道实际服务器何时响应,并且,它无法确定输出队列中的响应顺序,它可能必须重新注入它找到的与输出队列无关的消息,直到它找到正确的信息。

或者,代理服务器可能需要稍后通过HTTP请求将响应提供给客户端。也就是说,客户端不会对客户端的请求做出响应,而是对其发送的请求没有响应,因为它知道稍后将通过代理服务器的请求获得答案。

我不知道你的情况,但这可能会奏效!