簡體   English   中英

如何從 gRPC AIO python 客戶端檢測 gRPC 服務器已關閉

[英]How to detect gRPC server is down from gRPC AIO python client

我一直面臨這個問題,我有一個 gRPC AIO python 客戶端向 gRPC 服務器發送一堆配置更改,盡管它是雙向 RPC,客戶端不期望來自 gRPC 服務器的任何消息。 因此,只要有配置更改,客戶端就會發送包含配置的 gRPC 消息。 它保持通道打開並且不關閉(不調用 done_writing())。 但是當它沒有任何東西要發送時,它會在一個緊密的循環中輪詢隊列以尋找任何新消息。 在此期間,如果服務器出現故障,客戶端將無法檢測到。 但是,只要隊列中有一些數據可用,在將其推送到服務器時,客戶端就能夠檢測到服務器已關閉(拋出異常)。

當沒有數據要發送並且客戶端正在等待數據可用時,如何檢測服務器宕機。 是否有任何 gRPC API 我可以在客戶端等待數據發送時在通道上調用,以檢測通道故障(基本上如果有任何 api 調用在服務器關閉時拋出異常對我也有好處,我找不到任何有用的 API)? 我嘗試了 gRPC keepalive,但它對我的場景不起作用。



            async with grpc.aio.insecure_channel('127.0.0.1:51234') as channel:
            stream = hello_pb2.HelloStub(channel).Configure()
            await stream.wait_for_connection()
            while True:
                if queue.empty():
                    continue
                if not queue.empty():
                    item = queue.get()
                    await asyncio.sleep(0.001)
                    queue.task_done()
                    await stream.write(item)
                await asyncio.sleep(0.01)
            await stream.done_writing()


  1. 我試圖在形成 insecure_channel 時啟用 gRPS keepalive。 它沒有達到預期的效果。
  2. 隨后我嘗試在隊列為空期間在緊密循環內調用 channel_ready() ,期望拋出一些異常並從該循環中出來,但它沒有用。
async with grpc.aio.insecure_channel('127.0.0.1:51234',
                  options = [
                      ('grpc.keepalive_time_ms', 60000),
                      ('grpc.keepalive_timeout_ms', 600000),
                      ('grpc.keepalive_permit_without_calls', 1),
                      ('grpc.http2.max_pings_without_data', 0),
                      ('grpc.http2.min_time_between_pings_ms', 10000),
                      ('grpc.http2.min_ping_interval_without_data_ms', 60000),
                      ('grpc.max_connection_age_ms', 2147483647),
                  ]) as channel:

我能夠使用 channel.get_state() 解決它。 下面是代碼片段

if queue.empty():
                    if channel.get_state() != grpc.ChannelConnectivity.READY:
                        break
                    time.sleep(5)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM