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

2024-05-16 13:56:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

提前谢谢各位


Tags: 方法内存用户程序ip服务器消息列表
1条回答
网友
1楼 · 发布于 2024-05-16 13:56:57

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

  1. 与用户的消息传递协议(非顺序发送,传入消息日志的顺序复制)
  2. 按收件人分发的分类帐持久性
  3. #1和#3的桥接

并单独解决它们(但当然知道它们要插在一起,所以它们之间的性能特征和协议不应该相差很远)

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

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

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

LinkedIn engineering的一篇很棒的文章,应该会让你进入正确的思维方式来解决手头的问题-The Log: What every software engineer should know about real-time data's unifying abstraction

相关问题 更多 >