Каков наилучший способ определить, когда сеанс RPC заканчивается с использованием StreamClientInterceptor?
При написании функции StreamClientInterceptor, как лучше всего определить, когда вызывающая сторона заканчивает RPC? Это достаточно просто для унарных перехватчиков или на стороне сервера, где вы передаете обработчик, выполняющий RPC, но неясно, как лучше всего сделать это на стороне клиента, где вы возвращаете ClientStream, с которым затем взаимодействует вызывающий объект,
Одним из вариантов использования этого является инструментарий OpenTracing, где цель состоит в том, чтобы начать и закончить отрезок, чтобы отметить начало и конец RPC.
Стратегия, которую я изучаю, заключается в том, чтобы потоковый перехватчик возвращал оформленный ClientStream. Этот новый ClientStream считает, что RPC завершен, если какой-либо из методов интерфейса Header
, CloseSend
, SendMsg
, RecvMsg
вернуть ошибку или если Context
отменено Кроме того, он добавляет эту логику RecvMsg
:
func (cs *DecoratedClientStream) RecvMsg(m interface{}) error {
err := cs.ClientStream.RecvMsg(m)
if err == io.EOF {
// Consider the RPC as complete
return err
} else if err != nil {
// Consider the RPC as complete
return err
}
if !cs.isResponseStreaming {
// Consider the RPC as complete
}
return err
}
Это будет работать в большинстве случаев, но я понимаю, что вызывающий не обязан звонить Recv
если он знает, результат будет io.EOF
(См. Требуется ли вам вызывать Recv, пока вы не получите io.EOF при взаимодействии с grpc.ClientStreams?), Поэтому он не будет работать во всех случаях. Есть ли лучший способ сделать это?
1 ответ
У меня была очень похожая проблема, когда я хотел отследить потоковые вызовы gRPC. Кроме украшения потока, как вы упомянули сами, я не смог найти хороший способ обнаружить конец потоков. То есть, пока я не наткнулся на хуки статистики, предоставленные grpc-go ( https://godoc.org/google.golang.org/grpc/stats). Хотя API статистики предназначен для сбора статистики о вызовах RPC, предоставляемые им хуки также очень полезны для отслеживания.
Если вы все еще ищете способ отслеживания потоковых вызовов, я написал библиотеку для инструментария OpenTracing gRPC, используя ловушки статистики: https://github.com/charithe/otgrpc. Однако имейте в виду, что этот подход, вероятно, не подходит для систем, которые создают долгоживущие потоки.