推播器频道如何已传递10,000,000,000,000条消息

你好 最近,我遇到了一个关于Pusher Channels体系结构的有趣描述,并决定为您翻译它。 在我看来,作者非常容易地描述了构建高负载和可伸缩体系结构的方法。 本文很可能对初学者以及相关领域的专家有用。


在Pusher办公室,我们的小柜台数量不断增加。 它显示了存在Pusher Channels时传递的消息数。 周五UTC时间22:20,这一数字增加了一个类别,达到1000亿亿。 它有13个零-10万亿。



您可能会认为总邮件数是一个无用的度量指标。 但是这个数字是我们实时通信产品Pusher Channels成功的关键指标。 首先,该计数器反映了用户对我们的信任。 其次,它衡量了我们系统的可扩展性。 为了增加数量,Pusher的我们必须确保用户信任将消息发送到我们的服务,并且我们必须确保我们的系统能够处理这些消息。 但是,我们应该传递10万亿条消息吗? 让我们看看。


每秒通过推送器通道发送大约200,000条消息,在高峰时间发送数百万条消息。 例如,当《纽约时报》使用该服务使读者了解美国总统大选的进展时。


首先,我们将推入式渠道视为一个大黑匣子,所有这些消息都将通过该黑匣子:



Pusher Channels是一个发布-订阅类型的系统。 客户端订阅频道(例如,“ btc-usd”或“ private-user-jim”),而其他客户端向其发送消息。 如果有一百万人订阅了“ btc-usd”频道,并且有人在那儿发送了比特币的实际成本,那么推播频道将需要传递一百万条消息。 我们会在几毫秒内完成此操作。


一台服务器无法在这么短的时间内传递这么多的消息。 因此,我们使用了三种经过时间考验的技术:扇出,分片和负载平衡。 让我们看看黑匣子中的内容。



数百万的订户分布在大约170个功能强大的边缘服务器上,每个边缘服务器拥有大约20,000个连接。 每个这样的服务器都会记住其客户感兴趣的频道列表,并在中央Redis服务中订阅它们。 即使2000个客户端对边缘服务器上的“ btc-usd”感兴趣,他也只需订阅一次。 因此,当新消息到达该通道时,Redis将170条消息发送到边缘服务器,边缘服务器已经向其订户发送了20,000条消息。 这种方法称为扇出。


但是,仅扇出对我们来说还不够,因为仍然存在一个中央Redis组件,所有发送消息的人都可以通过该组件。 这种集中化限制了每秒发送的消息数。 为了解决此限制,中央Redis服务包含许多Redis分片。 每个通道又通过散列其名称而附加到Redis分片。 当客户想要发送消息时,他将转到其余服务。 后者对通道名称进行哈希处理,并根据结果确定要向其发送消息的必要Redis分片。 这种方法称为分片。


听起来我们只是在将集中化从Redis服务转移到rest服务。 但是事实并非如此,因为其余服务本身由大约90台执行相同工作的服务器组成:它们接收发布请求,计算Redis分片并将消息发送给它们。 当发布者想要发送消息时,他会去往许多其他服务器之一。 这种方法称为负载平衡。


扇出,分片和负载平衡一起使系统具有一个中央组件。 此属性是实现水平可伸缩性的关键,它可以每秒发送数百万条消息。


我们检查了Pusher Channels服务的核心组件,但还有其他部分,例如指标(如何获得10万亿这个数字),webhooks(如何将有趣的事件告知客户),授权(限制对通道的访问),活动数据用户,速率限制(我们如何确保客户使用的资源与所支付的费用一样多,并且不会干扰其他客户)。 所有这些附加功能都应在不牺牲带宽,消息传递时间和整体服务可用性的前提下实现。

Source: https://habr.com/ru/post/zh-CN415337/


All Articles