【问题标题】:Server to client communication gRpc服务器到客户端通信 gRpc
【发布时间】:2018-04-12 19:14:17
【问题描述】:

我在尝试找到解决方案时遇到了一些麻烦,想知道是否有人可以为我指明正确的方向。

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

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

目前我考虑的选项是:

  1. 在每个客户端上设置服务器
    • 考虑到可能有多个客户端从一个外部 ip 运行,我不确定是否可以创建一个监听公共 ip、本地 ip 和端口组合的客户端?
  2. 使用 bi-directional streaming
    • 这似乎是上面的错误应用程序,您是否必须生成一个新进程才能保持打开连接?
  3. 在 gRpc 服务旁边打开一个 websocket
    • 我觉得这不是正确的解决方案,但似乎是 3 个中最简单的解决方案

对于在 C 中实现上述各项所需的工作,我也不完全有信心,因为 C 中似乎没有包含很多辅助功能

更新:

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

服务器

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

客户

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

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

【问题讨论】:

    标签: c http go websocket grpc


    【解决方案1】:

    关于您的选择:

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

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

    1. 使用双向流媒体

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

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

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

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

    到目前为止,除了 WebSocket 之外,我还没有更好的解决方案来通过 http 协议传递事件。它非常容易实现,拥有基于事件的成熟 API,支持文本和二进制数据。从开发的角度来看,您只需要担心wswss 协议的特定反向代理规则。

    【讨论】:

      猜你喜欢
      • 2020-10-18
      • 2016-10-04
      • 2017-03-30
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 2011-09-05
      相关资源
      最近更新 更多