Framing: опытный инженер / разработчик, впервые работающий с GRP C и HTTP2 и впервые за долгое время занимавшийся потоковым программированием.
О каких событиях мне нужно знать, чтобы успешно обнаружить «сбой» (сервер неожиданно отключается, сервер неожиданно отключается, сервер имеет тайм-аут и отключается, и т. Д. c.) на сервере GRP C при использовании пакета @grpc/grpc-js
?
То есть - у нас есть служба GRP C, использующая протобуферы, и мы можем вызвать / настроить поток как-то так
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
объектом , который имеет собственный узел Duplex
в качестве родительского класса / объекта.
Объект Duplex
реализует потоковые интерфейсы writable
и readable
, что означает, что он может излучать close
, drain
, error
, finish
, pipe
, unpipe
события (доступные для записи) или close
, data
, end
, error
, pause
, readable
, resume
события (доступные для чтения) ). Похоже, что для объекта ClientDuplexStreamImpl
также есть metadata
и status
событие .
Что я хочу сделать, это настроить поток, который является устойчивым. На мой взгляд, это так просто: «Если по какой-либо причине поток отключится, я уничтожу объект и попробую снова подключиться с помощью алгоритма отката».
Проблема, с которой сталкивается мой наивный разум, заключается в том, что неясно, в чем разница между close
и end
, или если канал error
просто сообщает мне произошла ошибка или если произошла ошибка и все прошло.
Кроме того, поскольку это потоковые события, также неясно, будут ли отражаться все виды отключения сервера в потоке и нужно ли мне смотреть на разные объекты (какие это будут объекты?), Чтобы обнаружить фактическое состояние соединения с сервером.
Стоит также упомянуть, что это для сервера, реализацией которого я не управляю.
Итак, повторяю вопрос: что мне делать, как клиент / потребитель службы GRP C, нужно ли убедиться, что я обнаружил, что сервер "ушел" и что я должен попытаться восстановить соединение?