我编写了一个我在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 + "]");