【问题标题】:Retryable grpc-web server-streaming rpc可重试 grpc-web server-streaming rpc
【发布时间】:2020-10-08 08:47:29
【问题描述】:

我正在尝试使用 rxjs.Observable 包装一个 grpc-web 服务器流客户端,并且如果说服务器返回错误,则能够执行重试。

考虑下面的代码。

  // server
  foo = (call: (call: ServerWritableStream<FooRequest, Empty>): void => {
    if (!call.request?.getMessage()) {
      call.emit("error", { code: StatusCode.FAILED_PRECONDITION, message: "Invalid request" })
    }

    for (let i = 0; i <= 2; i++) {
      call.write(new FooResponse())
    }
    call.end()
  }
 
  // client 
  test("should not end on retry", (done) => {
    new Observable(obs => {
      const call =  new FooClient("http://localhost:8080").foo(new FooRequest())
      call.on("data", data => obs.next(data))
      call.on("error", err => {
        console.log("server emitted error")
        obs.error(err)
      })
      call.on("end", () => {
        console.log("server emitted end")
        obs.complete()
      })
    })
    .pipe(retryWhen(<custom retry policy>))
    .subscribe(
        _resp => () => {},
        _error => {
          console.log("source observable error")
          done()
        },
        () => {
          console.log("source observable completed(?)")
          done()
        })
  })
  
  // output
  server emitted error
  server emitted end
  source observable completed(?)

服务器在(?)发出“错误”之后发出“结束”事件,所以看来我必须从源 observable 中删除“结束”处理程序。

结束/完成流的“Rx​​-y”方式是什么?

【问题讨论】:

    标签: rxjs grpc grpc-web


    【解决方案1】:

    对于任何感兴趣的人,我最终删除了“end”事件处理程序并将其替换为“status”,如果服务器返回OK 状态代码(表示流结束),则可观察对象完成。

    new Observable(obs => {
      const call =  new FooClient("http://localhost:8080").foo(new FooRequest())
      call.on("data", data => obs.next(data))
      call.on("error", err => obs.error(err))
      call.on("status", status: grpcWeb.Status => {
        if (status.code == grpcWeb.StatusCode.OK) {
          return observer.complete()
        }
      })
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-24
      • 2019-07-16
      • 2021-06-26
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      相关资源
      最近更新 更多