Co chcesz osiągnąć? Jak chcesz mieć strumień i mieć subskrypcje na otwrate połączenie cały czas nie lepszym rozwiązaniem będzie web socket?
Te rozwiązanie są podobne. gRPC jest lepsze, bo jest silniej typowane dzięki protobufom (włącznie z tym, czy jest to strumień w jedną stronę, obie czy pojedyńcze zapytanie) oraz możesz pytać ten sam serwer o wiele metod np. możesz zaimplementować chat za pomocą komunikacji dwustronnej a np. takie informacje o użytkowniku możesz wywołać za pomocą zwykłego blokującego zapytania. W websocketach musisz sam zaimplementować która wiadomość odnosi się do którego strumienia/zapytania
. Oczywiście websockety mają taką zaletę, że działają w webie i są koncepcyjnie i technologicznie prostsze
Zastanawiam się nad koncepcja strumienie w gRPC,
czy zamiast odpytywać w nieskończonej pętli serwer
można zrobić jedno zapytanie które trwa w nieskończoność ?
Możesz, ale musisz być gotowy na ponowienie transmisji, jeśli serwer się w wywali albo połączenie zostanie zerwane. Nie będziesz też miał skalowania z uwagi na to, że dany klient jest przyspawany do danego serwera, gdy rozpoczniesz transmisję. Jeśli zależy ci na skalowaniu albo mniejszym couplingu pomiędzy dwiema stronami to możesz pomysleć o użyciu kolejek (np. RabbitMQ), gdzie wiadomości przechodzą przez pośrednika (brokera kolejki)
Warto też się zainteresować nad alternatywami. Dobrym przypadkiem do użycia takiego streamingu jest wysyłanie poleceń i komunikatów np. w grach.
Niewłaściwym przypadkiem jest np. streamowanie danych, jeśli da się to ogarnąć w sposób synchroniczny. Np. utworzenie streamu na potrzeby wyciągnięcia danych z bazy SQL brzmi słabo, bo to samo można ogarnąć przy pomocy dobrej paginacji (https://www.cockroachlabs.com/docs/stable/pagination). W takim podejściu klient dostaje tyle informacji ile chce a dzięki użyciu paginacji (która trzyma stan pomiędzy kolejnymi batchami) nie ma potrzeby trzymania otwartego połączenia (mogę np. zapytać inny serwer co pozwala na lepsze skalowanie i availability)