如何在集中式消息传递应用程序中处理连接到不同服务器的在线用户?
how to handle online users connected to different servers in a centralized messaging application?
我正在使用 Python 构建一个类似于旧的 msn messenger 或 whatsapp 的集中式消息传递程序。
假设现在,我的服务器可以处理大约 50.000 个在线用户,并且它的工作方式如下:
user1 想给 user2 发送一条消息,所以 user1 将消息发送给服务器,服务器在内存中维护一个巨大的列表,映射用户和他们的 ip 地址,所以如果 user2 在线,服务器将消息转发给user2,如果 user2 不在线,消息将保存在服务器中,直到 user2 再次在线并请求新消息。
现在我的问题是:假设程序在用户数量方面增长,现在我必须处理 20 万用户,所以我需要 4 台服务器。为了将消息转发给他,处理 "finding" user2 连接到哪个服务器的过程的最简单方法是什么?
也许 "router Server" 映射所有服务器中的所有在线用户,以便 user1 连接的服务器将消息转发到 user2 连接的 serverX?如果这是最好的方法,当用户离线、重新上线并 "asks" 向随机服务器发送新消息时,我该怎么办?我怎样才能检索它的所有新消息?
也许另一种方式是当用户 1 连接时,服务器向其余服务器广播搜索,询问用户 2 是否连接到它们?
提前谢谢大家
我会分开关注点(以及各自的 technologies/protocols):
- 与用户的消息传递协议(非顺序发送,传入消息日志的顺序复制)
- 分布式每个接收者分类帐持久性
- 桥接#1 和#3
并单独解决它们(但由于知道它们将被插入在一起,因此它们之间的性能特征和协议不应相差甚远)。
对于#1、#3,您应该能够与 asyncio
、zeromq
等一起快速破解某些东西
对于 #2,我会尝试找到一些现有的能够作为集群扩展的中间件(Kafka
、Ignite
等)。
这种方法的美妙之处在于,在第一个原型中,您可以使用单个集中式数据库模拟 #2,因此整个过程都会立即启动 运行,同时您将学习如何启动、调整、监控分布式持久性等
来自 LinkedIn 工程师的一篇很棒的文章,应该让您进入解决手头问题的正确心态 — The Log: What every software engineer should know about real-time data's unifying abstraction。
我正在使用 Python 构建一个类似于旧的 msn messenger 或 whatsapp 的集中式消息传递程序。 假设现在,我的服务器可以处理大约 50.000 个在线用户,并且它的工作方式如下:
user1 想给 user2 发送一条消息,所以 user1 将消息发送给服务器,服务器在内存中维护一个巨大的列表,映射用户和他们的 ip 地址,所以如果 user2 在线,服务器将消息转发给user2,如果 user2 不在线,消息将保存在服务器中,直到 user2 再次在线并请求新消息。
现在我的问题是:假设程序在用户数量方面增长,现在我必须处理 20 万用户,所以我需要 4 台服务器。为了将消息转发给他,处理 "finding" user2 连接到哪个服务器的过程的最简单方法是什么? 也许 "router Server" 映射所有服务器中的所有在线用户,以便 user1 连接的服务器将消息转发到 user2 连接的 serverX?如果这是最好的方法,当用户离线、重新上线并 "asks" 向随机服务器发送新消息时,我该怎么办?我怎样才能检索它的所有新消息?
也许另一种方式是当用户 1 连接时,服务器向其余服务器广播搜索,询问用户 2 是否连接到它们?
提前谢谢大家
我会分开关注点(以及各自的 technologies/protocols):
- 与用户的消息传递协议(非顺序发送,传入消息日志的顺序复制)
- 分布式每个接收者分类帐持久性
- 桥接#1 和#3
并单独解决它们(但由于知道它们将被插入在一起,因此它们之间的性能特征和协议不应相差甚远)。
对于#1、#3,您应该能够与 asyncio
、zeromq
等一起快速破解某些东西
对于 #2,我会尝试找到一些现有的能够作为集群扩展的中间件(Kafka
、Ignite
等)。
这种方法的美妙之处在于,在第一个原型中,您可以使用单个集中式数据库模拟 #2,因此整个过程都会立即启动 运行,同时您将学习如何启动、调整、监控分布式持久性等
来自 LinkedIn 工程师的一篇很棒的文章,应该让您进入解决手头问题的正确心态 — The Log: What every software engineer should know about real-time data's unifying abstraction。