gpt4 book ai didi

linux - 持有TCP连接的大规模websocket系统的设计

转载 作者:行者123 更新时间:2023-12-02 06:59:54 25 4
gpt4 key购买 nike

假设您有一个非常大的系统(在任何给定时刻都有数亿用户活跃),并且您需要主动将消息/通知从服务器推送到其客户端端点。 拥有数千台机器专门用于与事件用户保持 TCP 连接是常见的吗?

如果是这样,我会想象这些机器前面有一个“查找服务”,它决定哪个user_id应该连接到哪台机器(例如:使用将 user_id 映射到 server_id 的哈希函数),对吗?

我的问题是,像 Facebook/Twitter 的通知层这样的大型系统就是这样构建的吗?通过使用大量专用于保持 TCP 连接的机器,并在前面有一个将 user_id 映射到 server_id 的查找服务?如果是这样,他们如何处理服务器故障的情况?当您需要添加更多服务器时会发生什么,因为服务器数量发生了变化,我们不需要重新哈希所有用户吗?

谢谢!

最佳答案

对此有许多不同的方法,但它们都归结为“分而治之”的技术。

这些技术将网络划分为“区域”,每个“区域”负责数据/网络的一个子集。

这些“区域”可以进一步分割为更小的“区域”,以便根据需求的变化进一步扩展。

此“区域”树上的每个叶节点可能包含一整堆机器(负载均衡器、缓存(即 memcache)、数据库或 API 端点),具体取决于应用程序的要求。

AWS 受欢迎的部分原因是它提供的工具可以完成很多工作,使可扩展性更易于管理。

这取决于您的用例,但按地理位置划分区域是有意义的(考虑 CDN 的工作原理)。

例如,应用程序可能会分为每个大陆的一个区域,即亚洲、欧洲、美洲、非洲、大洋洲等。

每个区域都可能按国家/州进一步划分。

由于交通繁忙(第三层路由/重定向),某些州可能需要多个(子)区域。

每个子区域都将拥有自己的(子)域、负载均衡器和许多管理该区域的连接和数据的计算机。

这个地理划分的例子可以(理论上)通过地理定位 DNS 响应来最大限度地减少网络流量和延迟。这将允许(例如)纽约市的流量保留在纽约市,除非需要“跨境”通信。

“跨境”通信有时会被延迟和聚合,以最大程度地减少流量和数据库事务(对于实时应用程序,您不会这样做)。

显然,这有很多复杂性。例如:如果美国用户在英国旅行怎么办?我们是否将他的数据移动到不同的区域,或者我们是否将连接路由到美国服务器,并带来所有延迟? ...

但最终也只能“分而治之”。即使是数据库也无法在一台机器上保存所有数据,必须将数据划分为不同数据库上的子集。

此外,某些数据(例如区域分配)非常难以划分。有些数据坚持“全局”(例如,我们如何知道用户属于哪个区域?)...这通常是使用哈希值的地方。

当使用哈希值来计算分布时,以后重新分布数据会变得更加困难。这仍然是可能的,特别是在使用对数区域划分时,但这只是多种可能解决方案中的一种方法。

关于linux - 持有TCP连接的大规模websocket系统的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58551749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com