我正在编写一个应用程序,其中客户端将连接到服务器并订阅数据更新。客户端告诉服务器它感兴趣的数据项,然后使用具有流响应的方法进行订阅。效果很好。
但是,客户端还应该知道一些与数据无关的通知。我不确定处理这些问题的最佳方法。我想到了:
向现有服务添加另一种方法。这就像数据订阅,但用于事件订阅。然后,客户端可以订阅两种类型的更新。不确定服务中的方法数量或服务中的职责混合的最佳实践是什么。
使用流方法从服务器公开第二个服务以进行事件通知。这将使客户端使用多个连接来获取其数据-并使用另一个TCP端口。事件通知很少(在连接的整个生命周期中可能很少),因此不确定是否重要。再次-不确定从服务器公开的服务数量的最佳做法。
这似乎是非常规的,但是另一种方法可能是在客户端的连接序列期间将连接信息(IP地址和端口)从客户端传递到服务器。然后,服务器可以使用该服务器连接到客户端,作为发送事件通知的一种方式。因此,客户端和服务器都必须同时实现客户端和服务器角色。
有关如何解决此问题的任何建议?似乎这个问题已经解决了-但是似乎gRPC的C ++实现也落后于其他一些提供更多选择的语言。
哦-我正在Windows上执行此操作。
谢谢
答案 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) {}
...
}
对此用法有任何评论或担忧吗?
谢谢