如何实施服务器到客户端的远程过程?

时间:2018-12-12 19:03:34

标签: architecture rabbitmq client client-server grpc

问题

我需要实现这种架构:

  • 客户端可以连接到远程服务器以指示它们在线并且可以运行
  • 服务器可以接收来自各种来源的请求
  • 服务器可以向客户下达订单
  • 对于每个订单,服务器需要在发送下一个订单之前等待确认(或错误)

问题在于服务器无法与客户端进行初始化通信,因为它们位于路由器后面并且端口未转发。

我考虑了两种可能的解决方案:

1)我对所有内容都使用gRPC:

  • 客户端在服务器上调用Connect过程。
  • 这是一个双向竞标流式RPC,只要客户端在线,它就会保持活动状态。
  • 服务器将其用作向客户发送订单的渠道:客户在流上侦听消息,执行订单并返回消息以指定订单成功还是失败以及一些可选参数

2)RabbitMQ / MQTT或其他一些发布/订阅系统

  • 客户端将心跳发送到服务器以通知服务器它们已在线并正在运行
  • 服务器使用RabbitMQ向客户端发布订单
  • 对于每个已发布的订单,服务器希望客户端在RabbitMQ下发送下一个订单之前先调用确认RPC

问题

您认为这些解决方案足以解决这个特定问题吗?如果是这样,您会说哪一个最好?

我特别担心:

  • 第一个解决方案由于所有开放的连接而导致网络过于密集
  • 第二种解决方案没有为服务器提供一种了解客户端是否崩溃的方法。在这种情况下,第一个解决方案就是断开连接,服务器可以做出适当的反应。
  • 这两种解决方案均提供了弱反馈系统。对我来说,理想的事情是从服务器到客户端调用一个远程过程,但是AFAIK不可能,因为RPC是如何工作的。客户端也位于NAT后面。

    我在服务器到客户端请求的这一领域没有很多知识,并且我不知道这些事情通常是如何完成的。您能帮我决定一个简单但功能强大且可扩展的体系结构,以进行服务器到客户端的过程调用吗?

0 个答案:

没有答案