![](/img/trans.png)
[英]How can I receive data on client side before calling .end() on the server side for a gRPC stream
[英]gRPC Server-Side Streaming: How to Continue Stream Indefinitely?
我在 NodeJS 中编写的轻量级 gRPC 服务器有问题。 我在这里参考了文档。 我已经能够编译代表消息和服务的 proto 文件,并且已经成功地使用服务器端流方法建立了 gRPC 服务器,我可以通过BloomRPC触发。
我有一个名为parcel
的原始消息,它有一个字段: parcel_id
。 我希望这种方法每秒传输一个数据包。 我的第一个基本通行证是一个循环,每秒执行一分钟,并通过call.write(parcel)
应用一个新包裹。 我已经包含了下面的方法,当我通过 gRPC 调用它时,它执行时没有错误。
/**
* Implements the updateParcel RPC method.
* Feeds new parcel to the passed in "call" param
* until the simulation is stopped.
*/
function updateParcels(call) {
console.log("Parcels requested...");
// Continuously stream parcel protos to requester
let i = 0;
let id = 0;
while(i < 60){
// Create dummy parcel
let parcel = new messages.Parcel();
parcel.setParcelId(id);
id++;// Increment id
// Write parcel to call object
console.log("Sending parcel...");
call.write(parcel);
// Sleep for a second (1000 millis) before repeating
sleep(1000);
}
call.end();
}
我的问题是,虽然我可以打电话给我的方法,并收到成效,其行为是,我立即收到的第一个结果在客户端(针对的NodeJS客户端代码和BloomRPC通话),但同时接收到最后59个结果所有只有在服务器执行call.end()
。 没有错误,我在客户端收到的包裹对象准确且格式正确,它们只是按照描述进行批处理。
如何实时实现连续不断的包裹流? 这可能吗? 我看过但不能确定 - 默认情况下,gRPC 服务器端流是否具有批处理行为? 我已尽力理解 gRPC 文档,但我不知道我是否只是试图强制 gRPC 服务器端流做一些他们不打算做的事情。 感谢您的帮助,如果我能提供更多信息,请告诉我,因为这是我的第一个与 gRPC 相关的 SO 问题,我可能错过了一些相关信息。
它可能与 gRPC 无关,但与那里使用的sleep
实现有关。
node 提供的默认值是一个promise,因此要使其正常工作,您可能必须将该函数声明为async
并调用await sleep(1000);
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.