java - 带有 RabbitMQ 生产者的 REST 端点
问题描述
假设我有一个 REST 端点可以执行此操作:
接收一个 json 正文,进行一些映射,然后通过消息生产者发送消息。(兔MQ)
生产者是异步的。
我在 2 中有一个生产者的消费者,它将执行一些业务逻辑并发布回复。
现在,我需要在我的休息端点进行一些交互后收到回复。
由于我的休息呼叫的客户端正在等待回复,因此想到的解决方案是让端点在短暂超时的情况下侦听回复队列,以便我可以通过 REST 返回响应。
我的想法是否正确,或者我应该有一个阻塞生产者并使用 RPC,就像这里所说的那样:https ://www.rabbitmq.com/tutorials/tutorial-six-java.html
我想找到最优化的解决方案。
注意:我没有使用 Spring,因为我正在学习所有这些概念以便有一个清晰的理解。
解决方案
从服务器上的 HTTP 调用在队列中生成很好。
等待队列并在其响应中回复 HTTP 调用不是首选方式。
一个回复队列上可能有很多消息。如果您使用一条用于不同客户端调用的消息会发生什么?您是否将消息传递给适当的消费者?如何找到合适的消费者?您可以重新排队浪费周期的消息。一条消息可能永远留在队列中。
如果请求队列被淹没,您可能需要多次轮询才能获得结果。如果您在客户投票之前收到回复,则需要存储回复,以便在下次通话时将其传递给客户。
这些只是触及可能出现的问题的表面。如果您的客户端确实是 HTTP 客户端,则可以使用上述内容来涵盖应用程序的重要基础。
一个更好的解决方案是在回复队列上写一个消费者,它会调用消费者的某个端点。但是,它仍然需要您考虑服务器和客户端的故障和重试等情况。
我没有回答你的问题,但给了你一些思考的要点。请不要将此标记为已接受的答案。
推荐阅读
- amazon-web-services - 将 Amazon SQS 用于接收相同消息的多个使用者
- javascript - 使用 MVC 检查至少一个自动生成 jquery 数据表复选框
- javascript - 类javascript画布中的线旋转
- javascript - Extjs 网格跨度和行跨度
- python - pd.to_datetime 上的未知字符串格式
- firebase - 拦截 firebase-functions 响应(中间件)
- java - 在 GET 请求中应用正则表达式过滤器使用 Java 代码,而不是 SQL
- ios - 如何为 UITabBar 徽章添加边框?
- bash - 使用 ls 和 cut 命令获取文件所有者名称
- sql - 循环矩阵(sql)的旋转