如何在C++服务器实现long 运行 gRPC异步流数据更新

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

我正在用 C++ 创建一个异步 gRPC 服务器。其中一种方法是将数据从服务器流式传输到客户端——它用于向客户端发送数据更新。数据更新的频率是不可预测的。它们可能几乎是连续的,也可能像每小时一次一样不频繁。在 "CallData" class 和 CREATE/PROCESS/FINISH 状态的 gRPC 示例中使用的模型似乎不太适用于此。我看到一个 example 展示了如何创建一个 'polling' 循环,该循环休眠一段时间然后醒来检查新数据,但这似乎不是很有效。

还有其他方法吗?如果我使用 "CallData" 方法,它能否在 'PROCESS' 状态下阻塞直到有数据(这可能不是我的第一选择)?或者更好的是,我可以构建我的代码以便在数据可用时通知 gRPC 处理程序吗?

如有任何想法或示例,我们将不胜感激。

在服务器端流式传输示例中,您可能需要更多状态,因为您需要跟踪当前是否有写入正在进行。我会添加两种状态,一种称为 WRITE_PENDING,在写入正在进行时使用,另一种称为 WRITABLE,在可以立即发送新消息时使用。新消息产生时,如果是WRITABLE状态,可以立即发送,进入WRITE_PENDING状态,但如果是WRITE_PENDING状态,那么新产生的消息需要进入一个当前写入完成后要发送的队列。当写入完成后,如果队列非空,则可以从队列中抓取下一条消息并立即开始写入;否则,您可以进入 WRITABLE 状态并等待生成另一条消息。

这里应该没有必要阻塞,而且您可能也不想这样做,因为它会占用一个本应轮询完成队列的线程。如果您的所有线程都以这种方式阻塞,您将对新事件视而不见(例如新来电)。

另一种方法是使用 C++ sync API,它更易于使用。在那种情况下,您可以简单地编写直线阻塞代码。但代价是它会在服务器上为每个正在进行的调用创建一个线程,因此它可能不可行,具体取决于您处理的流量。

希望这些信息对您有所帮助!