【问题标题】:How to run standalone java with RabbitMQ and nodejs如何使用 RabbitMQ 和 nodejs 运行独立的 java
【发布时间】:2013-11-21 10:14:59
【问题描述】:

我一直在努力将 node.js 放在我们的 java web 服务器前面,以利用 node 的异步处理——做一些轻量级的处理和其他任务,最后是 socket.io。该应用程序的大部分实际工作都是在 java 中完成的,到目前为止,我们一直在使用 jetty 网络服务器来处理所有请求。我最初一直在考虑使用 node-http-proxy 来转发(可能是修改过的请求)。经过进一步考虑,我意识到我可以使用 RabbitMQ 和 node-amqp 库之类的东西来实现更健壮的通信协议,而不是转发 http 请求。这也将更好地支持从 java 通过 node 和 socket.io 推送回浏览器。

我的问题是:现在使用节点处理所有传入请求,是否有任何理由继续在码头内运行 java?如果不是,我是否应该从命令行的 main 方法中直接运行 java 代码?最后,这种方法是否存在重大缺陷?

我们的应用程序是一个单页应用程序,除了最初加载页面的第一个请求之外,所有进一步的调用都只是 restful json 调用,应该很容易通过 amqp 传输。

【问题讨论】:

  • 为什么不能在 Java 中只使用多线程?您希望通过添加消息代理的所有额外复杂性和另一种语言的代码来获得什么?
  • 在不深入了解为什么的情况下,我们想要获得的大部分是异步处理请求的好处,特别是廉价地保持请求(socket.io/节流)。我们探索了码头延续,但 java 代码非常依赖于线程。目前,尽管复杂,这似乎更清晰。我们还计划在其他领域利用 AMQP。

标签: java node.js rabbitmq amqp


【解决方案1】:

根据使用情况,使用Jetty或Tomcat作为java程序容器没有任何优势。 Jetty 或 Tomcat 的优势在于接收 HTTP 请求并将其转发给 worker java 程序。但是在您的情况下,请求由 NodeJS 接收并转发到 MQ,java worker 将主动连接到 MQ 并获取任务并在完成后发送结果。所以最好在这里使用独立的Java。并且当请求变得很多时,当worker集群处理更多任务时,很容易启动许多独立的Java程序。 NodeJS 和 MQ 可以异步缓存多个请求,Java 工作者可以同步处理它们。例如:1 个 NodeJS 服务器、1 个 MQ 服务器、3 个 Java 工作服务器。

【讨论】:

  • 由于我习惯于使用容器(除非我正在编写一个小型实用程序,或者只是在本地运行),那么将这些 java 工作者设置为健壮、处理错误的最佳方法是什么没有完全崩溃等。我显然可以在顶层尝试捕获任何东西并转储到日志中,但似乎应该有更好的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2021-05-05
相关资源
最近更新 更多