>  기사  >  백엔드 개발  >  gRPC에서 서버-클라이언트 브로드캐스팅을 구현하는 방법은 무엇입니까?

gRPC에서 서버-클라이언트 브로드캐스팅을 구현하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-02 02:45:30790검색

How to Implement Server to Client Broadcasting in gRPC?

gRPC에서 브로드캐스트: 서버-클라이언트 통신

gRPC 연결을 설정할 때 서버에서 서버로 이벤트나 업데이트를 브로드캐스트해야 하는 경우가 많습니다. 연결된 클라이언트. 이를 달성하기 위해 다양한 접근 방식을 사용할 수 있습니다.

스트림 관찰 가능

한 가지 일반적인 접근 방식은 서버측 스트림을 활용하는 것입니다. 연결된 각 클라이언트는 서버와 함께 자체 스트림을 설정합니다. 그러나 다른 서버-클라이언트 스트림을 직접 구독하는 것은 불가능합니다.

장기 폴링

대안 옵션은 장기 폴링 접근 방식을 구현하는 것입니다. 여기에는 클라이언트가 정기적으로 서버를 지속적으로 폴링하여 새 업데이트를 확인하도록 하는 것이 포함됩니다. 업데이트를 받으면 클라이언트는 응답을 받고 다음 폴링 간격을 기다립니다.

구현 예

다음은 장기 폴링을 구현하는 방법의 예입니다. gRPC 사용:

서버 측 코드

<code class="python">import threading

class UpdaterServer:
    def __init__(self):
        self.condition = threading.Condition()
        self.updates = []

    def post_update(self, update):
        with self.condition:
            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:]
            return GetUpdatesResponse(
                updates=new_updates,
                update_index=req.last_received_update + len(new_updates),
            )</code>

클라이언트 측 코드(별도 스레드)

<code class="python">from threading import Event

def handle_updates(updates):
    pass

event = Event()
request = GetUpdatesRequest(last_received_update=-1)

while not event.is_set():
    try:
        stub = UpdaterStub(channel)
        response = stub.GetUpdates(request, timeout=60*10)
        handle_updates(response.updates)
        request.last_received_update = response.update_index
    except grpc.FutureTimeoutError:
        pass</code>

이 접근 방식을 구현하면 연결된 클라이언트가 서버에서 지속적으로 업데이트를 검색할 수 있습니다.

위 내용은 gRPC에서 서버-클라이언트 브로드캐스팅을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.