Scala和Node.js

Scala和Node.js,node.js,scala,serialization,socket.io,marshalling,Node.js,Scala,Serialization,Socket.io,Marshalling,我们选择Node.js作为我们的web项目,但是有许多计算任务我们更喜欢Scala。我们非常关注速度,从Node.js以异步非阻塞方式调用Scala“worker”的最佳方式是什么?在对作业进行排队时,最好使用消息队列或作业队列之类的代理。Redis是一种流行的选择,因为它还可以用于缓存和在内存中存储数据。RabbitMQ是另一种常见的选择。拥有一个代理的好处是,它可以保留作业,直到工作人员在有可用资源时将其从队列中拉出。从某种意义上说,代理还充当负载平衡器,它持有作业,您可以让多个工作节点获取

我们选择Node.js作为我们的web项目,但是有许多计算任务我们更喜欢Scala。我们非常关注速度,从Node.js以异步非阻塞方式调用Scala“worker”的最佳方式是什么?

在对作业进行排队时,最好使用消息队列或作业队列之类的代理。Redis是一种流行的选择,因为它还可以用于缓存和在内存中存储数据。RabbitMQ是另一种常见的选择。拥有一个代理的好处是,它可以保留作业,直到工作人员在有可用资源时将其从队列中拉出。从某种意义上说,代理还充当负载平衡器,它持有作业,您可以让多个工作节点获取作业,从而实现高可用性、可伸缩性和并行处理。

您可能不应该如此关注速度;根据我的经验,可读性和可维护性等问题在几乎所有项目中都更为重要

对于最多几秒钟的短期“远程过程调用”,我倾向于使用,它有Javascript和JVM库(是一种替代Scala实现,面向使用Twitter的Finagle futures库编写异步后端),允许非阻塞调用;通过使用Thrift,您可以获得为前向兼容性而设计的强类型接口定义,并且您确切地知道在不破坏兼容性的情况下可以对接口进行哪些更改

或者可以使用普通的HTTP(“REST”)接口;node面向异步HTTP调用,Spray之类的库使得在Scala中提供高性能异步HTTP接口变得容易


对于运行时间较长的“批处理”任务,您不太关心延迟,更关心可靠性,最好使用@tsutrzl建议的专用任务队列。

那么您想从Node.js调用Scala(在JVM上)?在这种情况下,我想最好还是留在JVM上:或者基于Rhino/Nashorn()的东西。在worker上运行长时间运行的作业并不少见,如果worker正在进行大量处理,那么您可能会从脱离javascript中获益。您需要更加明确和具体。当Scala可以执行更高性能的I/O时,为什么要让节点处理所有I/O?您的实际约束条件和标准是什么?(没有人能在不知道你关心什么的情况下告诉你什么是“最好的”)