我正在 node.js 中构建HTTP代理。当传入请求满足某些条件时,将执行长时间运行的作业。发生这种情况时,所有后续请求必须等待作业结束(由于节点的体系结构):
function proxy(request, response) {
if(isSpecial(request)) {
// Long running job
}
// Proxy request
}
这样做并不好。
所以让我们说长期工作可以在 Java 中实现,为此我构建了一个Java服务器应用程序来执行长时间运行的作业每次节点应用程序发出请求时都有一个单独的线程。
因此,当满足条件时,node.js与Java服务器建立连接(TCP,HTTP,无论如何)。 Java服务器为请求初始化一个新的Thread,在这个单独的线程中执行长时间运行的作业,然后返回一个JSON响应(可以是二进制,无论如何),该节点可以轻松,异步地处理:
var javaServer = initJavaServer(); // pseudo-code
function proxy(request, response) {
var special = isSpecial(request);
if (special) {
var jobResponse;
javaServer.request( ... );
javaServer.addListener("data", function(chunk)) {
// Read response
// jobResponse = ...
}
javaServer.addListener("end", function(jobResult)) {
doProxy(jobResponse, request, response);
}
} else {
doProxy(null, request, response);
}
}
通过这种方式,我可以为满足条件的请求执行长时间运行的作业,而不会阻塞整个节点应用程序。
所以这里的要求是:
也许像RabbitMQ这样的消息传递代理服务可能有所帮助(节点推送消息,Java订阅它们并推回响应)。
思想?