【问题标题】:REST Endpoint with RabbitMQ Producer带有 RabbitMQ 生产者的 REST 端点
【发布时间】:2018-09-25 08:40:41
【问题描述】:

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

  1. 接收一个 json 正文,做一些映射,然后通过消息生产者发送消息。 (RabbitMQ)

    1. 生产者是异步的。

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

现在,我需要在我的休息端点中进行一些交互后收到回复。

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

我的想法是否正确,或者我应该有一个阻塞生产者并使用 RPC,就像这里所说的那样:https://www.rabbitmq.com/tutorials/tutorial-six-java.html

我想找到最优解。

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

【问题讨论】:

    标签: java rabbitmq


    【解决方案1】:

    通过服务器上的 HTTP 调用在队列中生成很好。

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

    1. 回复队列中可能包含许多消息。如果您使用一条用于不同客户端调用的消息会发生什么?您是否将消息传递给适当的消费者?如何找到合适的消费者?您可以重新排队浪费周期的消息。一条消息可能永远留在队列中。

    2. 如果请求队列被淹没,您可能需要多次轮询才能获得结果。如果您在客户投票之前收到回复,则需要存储回复,以便在下次通话时将其传递给客户。

    这些只是可能出现的问题的皮毛。如果您的客户端确实是 HTTP 客户端,则可以使用上述内容来涵盖应用程序的重要基础。

    更好的解决方案是在回复队列中编写一个消费者,该消费者将调用消费者的某个端点。但是,它仍然需要您考虑服务器和客户端的失败和重试等情况。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-11-21
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多