簡體   English   中英

服務器到客戶端通信 gRpc

[英]Server to client communication gRpc

我在試圖找到解決方案時遇到了一些麻煩,想知道是否有人可以指出我正確的方向。

我正在實現一個系統,其中多個客戶端使用 gRpc 與服務器進行通信。 服務是用 golang 編寫的,客戶端是用 C 編寫的。

我試圖找出如何最好地處理從服務器到客戶端的通信。

到目前為止,我考慮過的選項是:

  1. 在每個客戶端上設置一個服務器
    • 考慮到可能有多個客戶端從一個外部 ip 運行,我不確定是否可以創建一個客戶端來監聽公共 ip、本地 ip 和端口的組合?
  2. 使用雙向流
    • 這似乎是上面的錯誤應用程序,您是否必須生成一個新進程來保持打開連接?
  3. 在 gRpc 服務旁邊打開一個 websocket
    • 我覺得這不是正確的解決方案,但似乎是 3 個中最簡單的

我也不完全相信在 C 中實現上述每一項所需的工作,因為 C 中似乎沒有包含很多輔助功能

更新:

所以我使用go客戶端+服務器實現了一個解決方案。 利用雙向 rpc 流,

服務器

  • 為每個連接的客戶端創建一個 chan 並將其存儲在服務的地圖中
  • 在流方法中運行一個 for
    • 檢查 chan 是否有任何消息並調用 stream.sen
    • 如果 stream.Context().Err() 刪除客戶端 chan

客戶

  • 為從流方法返回的消息創建一個通道
  • 在流服務上啟動一個 goroutine 調用 stream.Recv

這是保持連接對連接的客戶端開放的合理方法嗎?

關於您的選擇:

  1. 在每個客戶端上設置一個服務器

我不知道你的用例,但通常你不能要求或保證用戶可以打開偵聽器。 正常的方式是客戶端連接到服務器並保持通道打開。

  1. 使用雙向流

gRPC可用作流接收服務器端事件 (SSE)。 所以這可能是一個不錯的選擇。 https://docs.servicestack.net/server-events-grpc#streamserverevents

這是保持連接對連接的客戶端開放的合理方法嗎?

我看不出這種方法有什么問題。

  1. 在 gRpc 服務旁邊打開一個 websocket

到目前為止,我不知道通過 WebSocket 以外的 http 協議來通信事件的更好解決方案。 它很容易實現,有一個基於事件的成熟API,支持文本和二進制數據。 從開發的角度來看,您只需要擔心wswss協議的特定反向代理規則。

暫無
暫無

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

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