簡體   English   中英

如何在 C++ 服務器中實現長時間運行的 gRPC 異步流數據更新

[英]How to implement long running gRPC async streaming data updates in C++ server

我正在用 C++ 創建一個異步 gRPC 服務器。 其中一種方法是將數據從服務器流式傳輸到客戶端 - 它用於向客戶端發送數據更新。 數據更新的頻率是不可預測的。 它們可能幾乎是連續的,也可能是每小時一次。 gRPC 示例中使用的帶有“CallData”類和 CREATE/PROCESS/FINISH 狀態的模型似乎不太適用。 我看過一個例子,它展示了如何創建一個“輪詢”循環,該循環會休眠一段時間然后醒來檢查新數據,但這似乎不是很有效。

有沒有另一種方法可以做到這一點? 如果我使用“CallData”方法,它是否可以阻塞在“PROCESS”狀態直到有數據(這可能不是我的第一選擇)? 或者更好的是,我可以構建我的代碼以便在數據可用時通知 gRPC 處理程序嗎?

任何想法或例子將不勝感激。

在服務器端流式傳輸示例中,您可能需要更多狀態,因為您需要跟蹤當前是否有正在進行的寫入。 我將添加兩種狀態,一種稱為 WRITE_PENDING,在寫入正在進行時使用,另一種稱為 WRITABLE,在可以立即發送新消息時使用。 新消息產生時,如果處於WRITABLE狀態,可以立即發送,進入WRITE_PENDING狀態,但如果處於WRITE_PENDING狀態,則新產生的消息需要進入隊列在當前寫入后發送完成。 寫入完成后,如果隊列非空,則可以從隊列中抓取下一條消息並立即開始寫入; 否則,您可以進入 WRITABLE 狀態並等待生成另一條消息。

應該沒有必要在此處阻塞,而且您可能無論如何都不想這樣做,因為它會占用一個線程,否則該線程應該輪詢完成隊列。 如果您的所有線程都以這種方式被阻塞,您將對新事件(例如傳入的新調用)視而不見。

這里的另一種選擇是使用 C++ 同步 API,它更易於使用。 在這種情況下,您可以簡單地編寫直線阻塞代碼。 但代價是它為每個正在進行的調用在服務器上創建一個線程,因此它可能不可行,具體取決於您處理的流量。

我希望這些信息對你有用!

暫無
暫無

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

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