框架:经验丰富的工程师/开发人员第一次处理 GRPC 和 HTTP2,并且很长时间以来第一次处理流式编程。
@grpc/grpc-js
使用软件包时,为了成功检测 GRPC 服务器中的“故障”(服务器意外断开连接、服务器意外断开连接、服务器超时并消失等),我需要注意哪些事件?
也就是说——我们有一个使用 protobuffers 的 GRPC 服务,我们可以调用/设置一个类似这样的流
const protoLoader = require('@grpc/proto-loader')
const packageDefinition = protoLoader.loadSync(
__dirname + '/path/to/v1.proto',
{keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
})
const packageDefinition = grpc.loadPackageDefinition(packageDefinition).com.foo.bar.v1
const client = new packageDefinition.IngestService(
'server.url.here.com:443',
grpc.credentials.createSsl()
)
const stream = client.recordSpan(metadata)
此时stream
是一个ClientDuplexStreamImpl
object,它以 Node 的 native Duplex
作为其父类/对象。
该Duplex
对象同时实现了writable
和readable
流接口,这意味着它可能会发出close
, drain
, error
, finish
, pipe
,unpipe
事件(可写),或close
, data
, end
, error
, pause
, readable
,resume
事件(可读)。该对象似乎也有一个metadata
和status
事件ClientDuplexStreamImpl
。
我想要做的是设置一个有弹性的流。在我的幼稚想法中,这就像“如果流因任何原因断开连接,我将销毁对象并尝试使用退避算法再次连接”一样简单。
我幼稚的头脑面临的挑战是不清楚close
和之间的区别end
是什么,或者error
频道是否只是让我知道发生了错误,或者是否发生了错误并且一切都消失了。
此外,因为这些是流事件,所以也不清楚是否每种服务器断开连接都会反映在流中,以及我是否需要查看不同的对象(这些对象是哪些对象?)来检测连接的实际状态到服务器。
还值得一提的是,这是针对我无法控制其实现的服务器。
所以——重申我的问题:作为 GRPC 服务的客户端/消费者,我需要做什么来确保我检测到服务器已经“消失”并且我应该尝试重新连接?