gRPC回调与C ++中的流式传输

时间:2020-04-24 19:51:24

标签: c++ grpc

我正在编写一个应用程序,其中客户端将连接到服务器并订阅数据更新。客户端告诉服务器它感兴趣的数据项,然后使用具有流响应的方法进行订阅。效果很好。

但是,客户端还应该知道一些与数据无关的通知。我不确定处理这些问题的最佳方法。我想到了:

  1. 向现有服务添加另一种方法。这就像数据订阅,但用于事件订阅。然后,客户端可以订阅两种类型的更新。不确定服务中的方法数量或服务中的职责混合的最佳实践是什么。

  2. 使用流方法从服务器公开第二个服务以进行事件通知。这将使客户端使用多个连接来获取其数据-并使用另一个TCP端口。事件通知很少(在连接的整个生命周期中可能很少),因此不确定是否重要。再次-不确定从服务器公开的服务数量的最佳做法。

  3. 这似乎是非常规的,但是另一种方法可能是在客户端的连接序列期间将连接信息(IP地址和端口)从客户端传递到服务器。然后,服务器可以使用该服务器连接到客户端,作为发送事件通知的一种方式。因此,客户端和服务器都必须同时实现客户端和服务器角色。

有关如何解决此问题的任何建议?似乎这个问题已经解决了-但是似乎gRPC的C ++实现也落后于其他一些提供更多选择的语言。

哦-我正在Windows上执行此操作。

谢谢

1 个答案:

答案 0 :(得分:1)

我想出了另一个替代方案,它似乎更适合ProtoBuf风格。我已经为服务器应发送的每个数据/事件/等通知创建了ProtoBuf消息类型,并将它们封装在使用“ oneof”类型的常见“通知”消息中。这提供了一种具有单个流方法响应的方式,该响应可以容纳任何类型的通知。看起来像这样:

message NotificationData
{
    oneof oneof_notification_type
    {
        DataUpdate item_data_update = 1;
        EventUpdate event_data_update = 2;
        WriteResponse write_response_update = 3;
    }
}

service Items
{
    ...
    rpc Subscribe (SubscribeRequest) returns (stream NotificationData) {}
    ...
}

对此用法有任何评论或担忧吗?

谢谢