복붙노트

[REDIS] 어떻게 gRPC에서 서버에서 클라이언트로 방송하는?

REDIS

어떻게 gRPC에서 서버에서 클라이언트로 방송하는?

내가 지금 gRPC에있는 작은 채팅 응용 프로그램을 만드는거야 나는 사용자가 클라이언트로 gRPC 서버에 연결하고자하는 경우이 문제로 실행했습니다, 나는 이벤트가 다른 모든 연결에 발생한 것을 방송을하고 싶습니다 클라이언트.

나는 관찰자의 일종을 사용하여 생각하고 있지만 "하나 또는 두 개의 서버가 연결된 사용자 알고 방법과 어떻게 모든 클라이언트에 이벤트를 방송 것이 아니라 혼동 해요.

나는 스트림을 사용하는 것이 해답의 일부 알고 있지만, 각 클라이언트가 서버와 함께 자신의 스트림을 생성하기 때문에, 나는 그것이 다른 서버 - 클라이언트 스트림에 가입 할 수있는 방법 확실 해요.

해결법

  1. ==============================

    1.그래, 나는 모든 연결된 스트림을 포함하는 글로벌 데이터 구조를 유지하고 그들을 통해 반복, 짝수 단지 발생했음을 대해 각을 말하는 것보다 다른 방법으로 표시되지 않습니다.

    그래, 나는 모든 연결된 스트림을 포함하는 글로벌 데이터 구조를 유지하고 그들을 통해 반복, 짝수 단지 발생했음을 대해 각을 말하는 것보다 다른 방법으로 표시되지 않습니다.

  2. ==============================

    2.또 다른 옵션은 긴 폴링 방식을 사용하는 것입니다. (즉, 내가 가장 익숙한있어 것입니다,하지만 매우 유사해야 이동하기 때문에, 파이썬 코드) 즉 다음과 같은 시도의 무언가이다. 이 테스트되지 않았습니다, 단지 당신에게 gRPC 긴 폴링을 수행하는 방법에 대한 아이디어를 제공하기위한 것입니다 :

    또 다른 옵션은 긴 폴링 방식을 사용하는 것입니다. (즉, 내가 가장 익숙한있어 것입니다,하지만 매우 유사해야 이동하기 때문에, 파이썬 코드) 즉 다음과 같은 시도의 무언가이다. 이 테스트되지 않았습니다, 단지 당신에게 gRPC 긴 폴링을 수행하는 방법에 대한 아이디어를 제공하기위한 것입니다 :

    .PROTO defs
    -------------------------------------------------
    service Updater {
        rpc GetUpdates(GetUpdatesRequest) returns (GetUpdatesResponse);
    }
    
    message GetUpdatesRequest {
        int64 last_received_update = 1;
    }
    
    message GetUpdatesResponse {
        repeated Update updates = 1;
        int64 update_index = 2;
    }
    
    message Update {
        // your update structure
    }
    
    
    SERVER
    -----------------------------------------------------------
    class UpdaterServer(UpdaterServicer):
        def __init__(self):
            self.condition = threading.Condition()
            self.updates = []
    
        def post_update(self, update):
            """
            Used whenever the clients should be updated about something. It will
            trigger their long-poll calls to return
            """
            with self.condition:
                # TODO: You should probably remove old updates after some time
                self.updates.append(updates)
                self.condition.notify_all()
    
        def GetUpdates(self, req, context):
            with self.condition:
                while self.updates[req.last_received_update + 1:] == []:
                    self.condition.wait()
                new_updates = self.updates[req.last_received_update + 1:]
                response = GetUpdatesResponse()
                for update in new_updates:
                    response.updates.add().CopyFrom(update)
                response.update_index = req.last_received_update + len(new_updates)
                return response
    
    
    SEPARATE THREAD IN THE CLIENT
    ----------------------------------------------
    request = GetUpdatesRequest()
    request.last_received_update = -1
    while True:
        stub = UpdaterStub(channel)
        try:
            response = stub.GetUpdates(request, timeout=60*10)
            handle_updates(response.updates)
            request.last_received_update = response.update_index
        except grpc.FutureTimeoutError:
            pass
    
  3. ==============================

    3.또 다른 방법은 너무 클라이언트 측에 grpc 서버를 생성하는 것입니다. 응용 프로그램 수준에서 당신은 고객의 grpc 서버의 IP와 포트를 교환하는 클라이언트에서 서버에 일부 핸드 셰이크가 있습니다. 당신은 아마이 시점에서 해당 주소의 클라이언트를 만들려하고 목록에서 클라이언트를 저장합니다.

    또 다른 방법은 너무 클라이언트 측에 grpc 서버를 생성하는 것입니다. 응용 프로그램 수준에서 당신은 고객의 grpc 서버의 IP와 포트를 교환하는 클라이언트에서 서버에 일부 핸드 셰이크가 있습니다. 당신은 아마이 시점에서 해당 주소의 클라이언트를 만들려하고 목록에서 클라이언트를 저장합니다.

    지금 당신은 기본 단항 RPC 호출하여 목록에서 클라이언트에 메시지를 푸시 할 수 있습니다. 아니오 [양방향] 스트림이 필요하지 않습니다. 장점 :

    단점 :

  4. from https://stackoverflow.com/questions/49580793/how-to-broadcast-in-grpc-from-server-to-client by cc-by-sa and MIT license