假设我有一个执行此操作的REST端点:
接收一个json主体,进行一些映射,然后通过消息传递生成器发送消息。 (RabbitMQ)
生产者是异步的。
我有2个生产者的消费者,它将执行一些业务逻辑并发布回复。
现在,我在其余端点中进行了一些交互后,需要收到回复。
由于我的休息呼叫的客户端正在等待答复,因此想到的解决方案是让端点在较短的超时时间内侦听答复队列,以便我可以通过REST返回响应。
我是在考虑正确的方法还是应该只是一个阻塞的生产者并使用RPC,如此处所述:https://www.rabbitmq.com/tutorials/tutorial-six-java.html
我想找到最理想的解决方案。
注意:我不使用Spring,因为我正在学习所有这些概念以具有清晰的理解。
答案 0 :(得分:1)
通过服务器上的HTTP调用在队列中进行生产是可以的。
等待队列并在响应时回复HTTP调用不是首选方法。
答复队列上可能有很多消息。如果您消费一条消息意味着针对不同的客户呼叫会怎样?您是否将消息传递给适当的消费者?您如何找到合适的消费者?您可以重新排队浪费时间的消息。一条消息可能会永远留在队列中。
如果请求队列已满,您可能必须轮询多次才能得到结果。如果您在客户投票之前收到答复,则需要存储答复,以便下次呼叫时可以将其传递给客户。
这些只是解决可能出现的问题的表面。如果您的客户端确实是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”属性为路由密钥和空交换。
希望这对将来的人有所帮助。