Мне хотелось бы узнать, как лучше всего выполнять долгоживущие вызовы GRP C.
У меня типичный клиент -> Вызов сервера (оба golang), и обработка на сервере может занимать до 20 -30 секунд до завершения. Мне нужно, чтобы клиент дождался его завершения, прежде чем я продолжу. Опции, которые я вижу (и я не люблю ни одного из них):
- Установите время ожидания на абсурдную продолжительность (например, 1 мин) и просто подождите. Это похоже на хак, и я также ожидаю, что в моем сервисе я столкнусь со странным поведением sh с такими вещами.
- Используйте поток - мне все еще нужно сделать вариант 1 здесь, и это действительно мне не очень помогает, так как мой ответ на самом деле просто унарный, а поток мне не очень помогает обработки asyn c и мой исходный вызов GRP C возвращает идентификатор транзакции, который хранится в Redis и содержит состояние транзакции. Я создал другую конечную точку GRP C для опроса статуса транзакции в al oop.
- Очередь или Поток (например, Kafka Stream) - настройте клиент для прослушивания чего-то вроде топологии Kafka c и мой сервер уведомит (Queue || Stream), когда это будет сделано, чтобы мой клиент поднял его. Я думал, что это сработает, но мне показалось, что он слишком перегорел.
Вариант №3 работает для меня, но, конечно, чувствует себя довольно грязно. Я также на 100% зависим от Redis. Учитывая, что GRP C построен на HTTP2, я бы подумал, что, возможно, есть какая-то опция Server Pu sh, но я ее не нахожу.
Боюсь, что я упускаю простой способ справиться с этой проблемой.
Спасибо