Убедитесь, что клиенту поступило двунаправленное потоковое сообщение gRPC

#java #grpc #grpc-java #bidirectional

Вопрос:

Я создаю небольшой проект Java gRPC, в котором я использую несколько сервисов gRPC. Одной из таких услуг является двунаправленный поток. Я хотел бы знать, как я могу быть уверен, что сообщение с «сервера» поступит всем клиентам. Например, допустим, я отправил сообщение «привет» с сервера всем клиентам, есть ли способ убедиться, что все клиенты получили сообщение «привет»? Для меня крайне важно продолжать работу с сервером только тогда, когда я уверен, что все клиенты получили это сообщение.

Ответ №1:

Используйте другое сообщение. Клиенты, по сути, должны подтвердить сообщение сервера, и это лучше всего сделать с помощью сообщения от клиента на сервер. Способ идентификации сообщения сервера варьируется в разных системах, иногда с использованием отдельных уникальных идентификаторов, иногда с использованием идентификаторов версий, которые подразумевают, что «все до этого момента» обрабатывается, а иногда просто требуются сообщения «ACK» по порядку без дополнительных сведений.

Однако вам следует опасаться случайных гонок. Например, если вы используете простое сообщение ACK, сервер не должен считать, что все сообщения сервера в этом потоке были подтверждены. Вместо этого ACK должен применяться только к самому старому неподтвержденному сообщению.