Python 如何在集中式消息传递应用程序中处理连接到不同服务器的在线用户?

Python 如何在集中式消息传递应用程序中处理连接到不同服务器的在线用户?,python,messaging,centralized,Python,Messaging,Centralized,我正在用Python构建一个集中式消息传递程序,类似于旧的msn messenger或whatsapp。 假设现在,我的服务器可以处理大约50000名在线用户,其工作原理如下: user1希望向user2发送消息,因此user1将消息发送到服务器,服务器在内存中维护一个庞大的列表,映射用户及其ip地址,因此,如果user2在线,服务器将消息转发给user2,如果user2不在线,消息将保存在服务器中,直到user2再次在线并请求新的msg 现在我的问题是:假设程序的用户数量在增长,现在我必须处理

我正在用Python构建一个集中式消息传递程序,类似于旧的msn messenger或whatsapp。 假设现在,我的服务器可以处理大约50000名在线用户,其工作原理如下:

user1希望向user2发送消息,因此user1将消息发送到服务器,服务器在内存中维护一个庞大的列表,映射用户及其ip地址,因此,如果user2在线,服务器将消息转发给user2,如果user2不在线,消息将保存在服务器中,直到user2再次在线并请求新的msg

现在我的问题是:假设程序的用户数量在增长,现在我必须处理20万用户,所以我需要4台服务器。处理“查找”user2连接到哪个服务器的过程的最简单方法是什么,以便将消息转发给他? 可能是一个“路由器服务器”,它将所有服务器中的所有用户映射为在线,以便连接user1的服务器将消息转发到连接user2的serverX?如果这是最好的方法,那么当用户离线、返回在线并向随机服务器“询问”新消息时,我该怎么办?如何检索其所有新MSG

另一种可能的方式是,当user1连接时,服务器向其余服务器广播搜索,询问user2是否连接到它们


提前感谢各位

我将分离关注点(以及各自的技术/协议):

  • 与用户的消息传递协议(非顺序发送,传入消息日志的顺序复制)
  • 按收件人分发的分类帐持久性
  • #1和#3的桥接
  • 并单独解决它们(但当然知道它们要插在一起,所以它们之间的性能特征和协议不应该相差很远)

    对于#1,#3,您应该能够与
    asyncio
    zeromq
    等一起快速破解某些东西

    对于#2,我将尝试找到一些能够作为集群扩展的现有中间件(
    Kafka
    Ignite
    ,等等)

    这种方法的美妙之处在于,在第一个原型中,您可以用一个集中式数据库模拟#2,因此整个过程将立即启动并运行,同时您将学习如何启动、调优、监视分布式持久性等


    这是一篇来自LinkedIn engineering的优秀文章,它应该能让你进入正确的思维方式来解决手头的问题-。

    这是一个非常有趣的架构问题,但你可能需要将其重新表述为仅与架构有关,或者与你选择的架构中的某些特定技术问题有关。否则,它会觉得有点太宽,很可能会被否决而死亡。