gRPC 服务器端流:如何无限期地继续流?
gRPC Server-Side Streaming: How to Continue Stream Indefinitely?
我在使用 NodeJS 编写的轻量级 gRPC 服务器时遇到问题。我正在参考文档 here. I have been able to compile my proto files representing messages and services, and have successfully stood up a gRPC server with a server-side stream method I am able to trigger via 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 调用),但仅在服务器执行 call.end()
后才一次 接收最后 59 个结果 。没有错误,我在客户端收到的包裹对象准确且格式正确,它们只是按照描述进行了批处理。
如何实现我的包裹实时源源不断?这可能吗?我看过但不能确定 - 默认情况下,gRPC 服务器端流是否具有批处理行为? 我已尽力理解 gRPC 文档,但我无法确定我是否我只是试图强制 gRPC 服务器端流做一些他们不打算做的事情。感谢您的帮助,如果我可以提供更多信息,请告诉我,因为这是我的第一个 gRPC 相关 SO 问题,我可能错过了一些相关信息。
它可能与 gRPC 无关,但与那里使用的 sleep
实现无关。
node 提供的默认是一个 promise,因此要使其正常工作,您可能必须将函数声明为 async
并调用 await sleep(1000);
.
我在使用 NodeJS 编写的轻量级 gRPC 服务器时遇到问题。我正在参考文档 here. I have been able to compile my proto files representing messages and services, and have successfully stood up a gRPC server with a server-side stream method I am able to trigger via 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 调用),但仅在服务器执行 call.end()
后才一次 接收最后 59 个结果 。没有错误,我在客户端收到的包裹对象准确且格式正确,它们只是按照描述进行了批处理。
如何实现我的包裹实时源源不断?这可能吗?我看过但不能确定 - 默认情况下,gRPC 服务器端流是否具有批处理行为? 我已尽力理解 gRPC 文档,但我无法确定我是否我只是试图强制 gRPC 服务器端流做一些他们不打算做的事情。感谢您的帮助,如果我可以提供更多信息,请告诉我,因为这是我的第一个 gRPC 相关 SO 问题,我可能错过了一些相关信息。
它可能与 gRPC 无关,但与那里使用的 sleep
实现无关。
node 提供的默认是一个 promise,因此要使其正常工作,您可能必须将函数声明为 async
并调用 await sleep(1000);
.