[英]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()
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.