为什么使用Sync调用的node.js + node-java比使用非同步更快?

时间:2016-10-04 03:00:33

标签: java node.js multithreading node-java

我编写了一个我在node.js中编写的小型Web服务器,它使用node-java来调用商业产品API。我最初使用(主要是所有)异步(非同步)调用来调用该API,如下所示:

Critique for node.js+node-java application that interfaces with a COTs product?

但是上周我注意到了API的一些令人费解的问题(测试结束时Jmeter测试会挂起一段时间,而商业产品需要一段时间来处理最后几个请求),同时测试,我&# 39;一直在努力解决这些问题。

那么,今天,我决定尝试修改node.js + node-java代码,只使用Sync调用来调用API。

我改变了这部分代码:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    TDateTime dt = Date();

    IdHTTP1->Head("http://dsrt.dyndns.org/files/MAIN.zip");
    if (IdHTTP1->Response->Date < dt)
    {
            // older than today...
    }
    if (IdHTTP1->Response->Expires < dt)
    {
            // expired prior to today...
    }
    if (IdHTTP1->Response->LastModified < dt)
    {
            // last modified prior to today...
    }
}

将其替换为此(即我使用同步调用调用API方法):

// The following also now works, and this invokes the PDP in Asynch mode!!
var x = java.callStaticMethod("OesPdp", "DoAtzRequest", "xxx", function (err, data) {
        if (err) {
                console.log("In handleRequest: err = [" + err + "}");
                return;
                }
        console.log("In handleRequest: In callback-good-path, data=[" + data + "]");

        // NOTE that the 'data' is what is being returned from the DoAtzRequest method of the OesPdp Object!!
        response.end("THE DATA IS: [" + data + "]");
        return "AAAAAAAAAAAAAAAA";
        } // end CALLBACK function
);

我使用Jmeter进行负载测试,我的基本测试连续运行10个并发线程,之前当我使用异步调用时,我假设应用程序正在处理10个请求&#34;同时&#34;,所以我认为当我将所有方法调用切换到同步调用时,Web服务器应用程序将按顺序处理所有请求,并且我会得到更糟/更差的结果。

但是,令我惊讶的是,在我将方法调用切换到Sync调用之后,我的Jmeter测试结果变得更好了,我在60秒的测试运行中处理~9000个请求到60秒内的~35K请求: (!!

此外,当我使用同步调用的新代码时,我之前提到的问题不会发生!

我很高兴使用Sync方法调用它可以更好地工作,但我现在真的很困惑/困惑,为什么负载测试结果会更好,而且,当我使用Sync方法时,更好调用,比我使用Async方法时调用??

任何人都可以解释为什么会这样吗?

谢谢, 吉姆

P.S。我应该提到的一件事是,在旧代码和新代码中,实例化API Java对象的调用是同步调用(即使用&#34; java.newInstanceSync&#34;):

// The following WORKS, but it invokes/runs the PDP in Sync mode...
var x = java.callStaticMethodSync("OesPdp", "DoAtzRequest", "xxx");

console.log("x=[" + x + "]");
console.log("THE DATA that was returned from the OES PDP, 'x', IS: [" + x + "]");
response.end("THE DATA that was returned from the OES PDP, 'x', IS: [" + x + "]");

0 个答案:

没有答案