服务器到客户端的通信gRpc

时间:2017-10-31 14:58:37

标签: c http go websocket grpc

我试图找到一个解决方案时遇到一些麻烦,并且想知道是否有人能指出我正确的方向。

我正在实现一个系统,其中多个客户端使用gRpc与服务器通信。 该服务使用golang编写,客户端使用C语言编写。

我正在尝试研究如何最好地处理从服务器到客户端的通信。

我到目前为止考虑的选项是:

  1. 在每个客户端上设置服务器
    • 考虑到可能有多个客户端在一个外部IP上运行,我不确定是否可以创建一个侦听公共IP,本地IP和端口组合的客户端?
  2. 使用 bi-directional streaming
    • 这似乎是上面的错误应用,你是否必须生成一个新进程才能保持打开连接?
  3. 在gRpc服务旁边打开websocket
    • 我觉得这不是正确的解决方案,但似乎是最简单的3
  4. 我也不完全相信在C中实现上述每一项所需的工作,因为C中似乎没有包含很多辅助功能

    更新

    所以我使用go客户端+服务器实现了一个解决方案。利用双向rpc流,

    服务器

    • 为每个连接并将其存储在服务中的地图中的客户端创建一个chan
    • 在stream方法中运行for
      • 检查chan是否有任何消息并致电stream.sen
      • 如果是stream.Context()。Err()
      • ,请删除客户端chan

    客户端

    • 为从流方法返回的消息创建频道
    • 在流服务上启动goroutine调用stream.Recv

    这是保持连接客户端连接的合理方法吗?

1 个答案:

答案 0 :(得分:0)

关于您的选择:

  1. 在每个客户端上设置一个服务器

我不知道你的用例,但通常你不能要求或保证用户可以打开侦听器。正常的方式是客户端连接到服务器并保持通道打开。

  1. 使用双向流式传输

gRPC 可用作流接收服务器端事件 (SSE)。所以这可能是一个不错的选择。 https://docs.servicestack.net/server-events-grpc#streamserverevents

<块引用>

这是保持连接对连接的客户端开放的合理方法吗?

我看不出这种方法有什么问题。

  1. 在 gRpc 服务旁边打开一个 websocket

直到现在,我知道除了 WebSocket 之外,没有更好的解决方案通过 http 协议来通信事件。它很容易实现,有一个基于事件的成熟API,支持文本和二进制数据。从开发的角度来看,您只需要担心 wswss 协议的特定反向代理规则。