用Node.js进行服务器到服务器通信

7
我想知道node.js是否适用于不与浏览器通信的服务器端应用程序,或者浏览器通信只是整个应用程序中的附加部分,仅用于管理。
思路很简单:
1. 服务器接收来自另一台服务器的大量UDP流量,其中包含用户数据的短消息。
2. 对于每条消息,应用程序执行DB查找并过滤掉不在白名单上的userid的消息。
3. 处理已过滤的消息,导致另一个DB更新或将数据发送到另一台服务器。
在这种情况下,学习node.js是否是一个好的方案,还是与Java EE等相比没有优势?

3
我认为这是一个非常好的宠物项目可供编写(取决于数据库),请查阅http://nodejs.org/api/dgram.html获取文档。 - Willem D'Haeseleer
1
如果大部分时间都花在IO(数据库,磁盘,网络等)上,Node的效果最佳。当您的应用程序执行IO时,Node可以自由地处理更多请求。如果它正在进行大量的CPU密集型处理,则会被卡住,无法做其他事情。除了“过滤消息被处理”可能有问题之外,您列出的大部分内容听起来都非常适合Node。如果该处理是昂贵的,则可能会出现问题。 - BadCanyon
你在使用Java EE时遇到了性能或并发问题吗?在Java中,有很多解决并发问题的方案。除非你尝试过失败,否则是否值得添加另一种语言的不同层次来解决并发问题,我认为不值得。 - mpm
2
我是JS开发人员,而不是Java开发人员。我有两种可能性:1.将此任务委托给Java开发人员(缺点:在我的组织中需要很长时间来安排此任务),2.自己完成并将其视为学习新知识的机会。这就是为什么我要求JEE比较。如果这种情况完全没有考虑到node.js,则我会选择第一种解决方案。如果JEE和node.js在性能上可以相媲美,那么我可能会选择第二种解决方案。 - Kamil Z
1个回答

4
免责声明:我在一家贡献node.js并推广其使用的公司工作,因此我的意见可能存在偏见。
正如其他评论中提到的那样,node.js应该非常适合您的场景。实际上,这是人们使用node.js的最常见场景之一——从(可能是多个)源获取数据,进行少量CPU轻量级处理,然后发送响应或存储结果。除非消息过滤非常消耗CPU,否则node.js实现可能会优于J2EE版本。
原因在于Node.js针对服务器大部分时间都在等待解决方案进行了大量优化。等待客户端连接、等待数据库响应、等待磁盘读/写、等待客户端读取响应等。
与此相反,J2EE采用多线程,在这种情况下,你需要一个线程来处理每个请求,这是次优的。大多数线程都在等待,因此您无法获得并行运行大量代码的好处,但您仍然必须承担上下文切换和更高的内存使用率的代价。
在选择node.js之前,有一件事情需要考虑:您能否将node.js部署到生产环境中并获得许可?转移到新平台具有一些相关成本,操作您的应用程序的人将不得不学习如何处理node.js应用程序。

“Node.js 的实现可能会比 Java EE 版本表现更好” - 你有数据支持这个说法吗?例如,这个基准测试并没有完全支持你的断言:http://www.techempower.com/benchmarks/#section=data-r5 - Arjan Tijms
Java EE采用多线程技术,每个请求都有一个线程来处理,这是其中一种选项。Java EE同样支持异步HTTP处理。请参考例如http://www.javakeexample.com/2013/01/creating-asynchronous-servlets-with.html和https://blogs.oracle.com/enterprisetechtips/entry/asynchronous_support_in_servlet_3。 - Arjan Tijms
@ArjanTijms 说得好。我没有硬数据支持我关于性能的说法。然而,你所提到的基准测试是有缺陷的,他们使用已知存在性能问题的mysql客户端。关于异步J2EE - 异步servlet可能不够用,你应该使用异步来进行与数据库的通信等操作,这不是J2EE组件的常规用法,对吧? - Miroslav Bajtoš
谢谢你的回复!基准测试人员欢迎社区贡献,但更改数据库可能很困难(例如 ASP.NET 希望使用 SQL Server)。至于 Java EE(而不是 J2EE),可以通过将 @Asynchronous 注释应用于方法来进行异步数据库通信。我认为这是典型的用法,至少我个人经常使用它。 - Arjan Tijms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接