多个后端服务器之间的消息传递机制



不确定是否有特定的stackexchange门户来回答这个问题,但我正在努力了解人们/企业在多台服务器之间异步通信时主要使用什么。以下是我迄今为止的建筑。

服务器1-我有一个运行socketIO和HTTP端点的flask服务器(目前正在测试,将放在Gunicorn后面(。此服务器负责维护客户端套接字连接,并在客户端和服务器之间中继消息。

服务器2-我有另一个";处理服务器";它应该根据从客户端接收到的消息进行计算,并且可能会也可能不会在这些消息的背面产生输出。这是另一个flak/http服务器,它承载服务器1可以调用的端点。

对于我的用例,我希望将消息从服务器1发送到服务器2,但不等待任何响应(因为服务器2可能不会产生任何响应(,稍后如果服务器2决定产生一些东西,我需要服务器1获得该输出,并通过套接字连接将其中继回客户端。

以下是我现在的想法

  1. 我在想,我可以以某种方式从服务器1到服务器2进行异步请求后调用(如果有类似异步请求的东西(,然后从服务器2返回到服务器1(当/如果它产生一些输出(。当将来我有多个服务器1和服务器2时,我可以确保某些客户端是由特定服务器提供的服务,以保持一致性
  2. 将服务器2更改为启用socketio,然后在服务器1和服务器2之间创建一个长期的套接字连接。同样,对于规模,我需要确保客户端由特定的服务器提供服务,以便所有消息都能到达同一服务器
  3. 我正在阅读有关消息队列(kafka等(的文章,所以也许可以使用它

我想了解你对如何设计这个的看法。

如果我理解正确,服务器1用于将请求路由到正确的端点。但是,客户端感兴趣的是服务器2的输出。那么,服务器1是否可能完全被负载均衡器取代呢?

  1. 这是S1的很多责任,我会制作一个事件驱动的系统,而不是让你的客户端等待一个可能永远不会到来的请求。因此,如果消息被正确地发送到S2,S1可以立即返回成功。然后让其他服务器将实际响应返回给客户端。

  2. 我认为你走在正确的轨道上。要在服务器1和服务器2之间进行通信,通常采用消息队列。它是异步的,因为服务器1不会等待来自服务器2的结果。一个很好的选择是RabbitMq(自托管(或SQS(AWS云(。

  3. 为什么所有邮件都需要路由到同一台服务器?考虑使您的系统";"无状态"-因此,来自客户端的每个请求都需要包含完成请求所需的所有信息。这通常通过会话存储来实现,因此用户会话数据可以存储在缓存/DB上;客户端发送对存储数据的引用,然后服务器获取并进行计算。

知道谁是你的"客户是";前端应用程序还是另一台服务器?

最新更新