-2

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

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

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

也许另一种方式可能是服务器在连接用户 1 时向其余服务器广播搜索,询问用户 2 是否连接到它们?

提前谢谢各位

4

1 回答 1

0

我会将关注点(以及相应的技术/协议)分开:

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

并单独解决它们(但因为知道它们要连接在一起,所以它们之间的性能特征和协议不应该相差几英里)。

对于#1、#3,你应该能够用 , 等快速破解一些asyncio东西zeromq

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

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

来自 LinkedIn 工程的一篇很棒的文章,应该能让你进入解决手头问题的正确心态——日志:每个软件工程师都应该了解实时数据的统一抽象

于 2018-10-02T17:22:45.110 回答