gRP C Потоковая передача на стороне сервера: как продолжить поток до бесконечности? - PullRequest
1 голос
/ 16 января 2020

У меня проблема с облегченным сервером gRP C, на котором я пишу NodeJS. Я ссылаюсь на документацию здесь . Я смог скомпилировать свои прототипы, представляющие сообщения и сервисы, и успешно установил сервер gRP C с потоковым методом, который я могу запустить с помощью BloomRP C.

У меня есть прото-сообщение с именем parcel, в котором есть одно поле: parcel_id. Я хочу, чтобы этот метод передавал посылку данных каждую секунду. Мой первый элементарный проход на этом этапе был oop, который выполняется каждую секунду в течение минуты и применяет новую посылку через call.write(parcel). Я включил метод ниже, он выполняется без ошибок, когда я вызываю его через gRP C.

/**
 * 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 клиентский код и (BloomRP C вызывает), но получают последние 59 результатов сразу только после того, как сервер выполнит call.end(). Нет ошибок, и объекты посылки, которые я получаю на клиенте, точны и правильно отформатированы, они просто упакованы, как описано.

Как я могу получить постоянный поток своих посылок в режиме реального времени? Это возможно? Я посмотрел, но точно не могу сказать - у серверных потоков gRP C есть режим пакетной обработки по умолчанию? Я изо всех сил пытался понять документацию gRP C, но я могу ' не могу сказать, пытаюсь ли я просто заставить gRP C серверные потоки делать то, что они не были предназначены. Спасибо за любую помощь, и дайте мне знать, если я смогу предоставить больше информации, так как это мой первый вопрос SO, связанный с gRP C, и я, возможно, пропустил некоторую соответствующую информацию.

1 Ответ

2 голосов
/ 17 января 2020

Это может быть не связано с gRP C, но с реализацией sleep, используемой там.

По умолчанию, предоставляемая узлом, является обещанием, поэтому для этого вам, вероятно, придется объявить функционировать как async и вызывать await sleep(1000);.

...