RabbitMQ Producer的REST端点

时间:2018-09-25 08:40:41

标签: java rabbitmq

假设我有一个执行此操作的REST端点:

  1. 接收一个json主体,进行一些映射,然后通过消息传递生成器发送消息。 (RabbitMQ)

    1. 生产者是异步的。

    2. 我有2个生产者的消费者,它将执行一些业务逻辑并发布回复。

现在,我在其余端点中进行了一些交互后,需要收到回复。

由于我的休息呼叫的客户端正在等待答复,因此想到的解决方案是让端点在较短的超时时间内侦听答复队列,以便我可以通过REST返回响应。

我是在考虑正确的方法还是应该只是一个阻塞的生产者并使用RPC,如此处所述:https://www.rabbitmq.com/tutorials/tutorial-six-java.html

我想找到最理想的解决方案。

注意:我不使用Spring,因为我正在学习所有这些概念以具有清晰的理解。

2 个答案:

答案 0 :(得分:1)

通过服务器上的HTTP调用在队列中进行生产是可以的。

等待队列并在响应时回复HTTP调用不是首选方法。

  1. 答复队列上可能有很多消息。如果您消费一条消息意味着针对不同的客户呼叫会怎样?您是否将消息传递给适当的消费者?您如何找到合适的消费者?您可以重新排队浪费时间的消息。一条消息可能会永远留在队列中。

  2. 如果请求队列已满,您可能必须轮询多次才能得到结果。如果您在客户投票之前收到答复,则需要存储答复,以便下次呼叫时可以将其传递给客户。

这些只是解决可能出现的问题的表面。如果您的客户端确实是HTTP客户端,则可以使用上面介绍应用程序的重要基础。

更好的解决方案是在回复队列上编写一个使用者,这将在使用者上调用某个终结点。但是,仍然需要您考虑服务器和客户端上的故障和重试之类的情况。

我没有回答您的问题,但给了您一些思考的要点。请不要将此标记为可接受的答案。

答案 1 :(得分:0)

我知道这是一个旧的,但如果有人还在寻找这个。这主要与rabbitmq中的RPC有关。一种方法是在每个生成的消息上设置关联 ID(在消费者上,您收到此关联 ID 并且您可以将其匹配回来),然后检查这是否是您所期望的。您在每个请求中将其设置为唯一值(例如 UUID)并进行比较,看看这是否是您期望的响应。

还有一个叫做直接回复的功能很好解释:https://www.rabbitmq.com/direct-reply-to.html

生产者从“amq.rabbitmq.reply-to”消费并产生 ReplyTo 属性设置为“amq.rabbitmq.reply-to”,而消费者一旦收到并处理消息回复到“ReplyTo”属性为路由密钥和空交换。

希望这对将来的人有所帮助。