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);.