嗨,大家好!我的名字是SergeyKamardin,我是Mail.Ru的工程师。
介绍
首先介绍我们的故事的上下文,应该介绍几点我们为什么需要这个服务器。
Mail.Ru有很多有状态的系统。用户电子邮件存储是其中之一。跟踪系统中的状态变化和系统事件有几种方法。这主要是通过定期系统轮询或关于其状态变化的系统通知。
两种方式都有利弊。但是当涉及邮件时,用户收到新邮件的速度越快越好。
邮件轮询涉及每秒大约50,个HTTP查询,其中60%返回状态,这意味着邮箱没有变化。
因此,为了减少服务器上的负载并加快邮件传递给用户,决定通过编写发布-订阅服务器,一方面将接收有关状态更改的通知,另一方面则会收到这种通知的订阅。
先前
现在
第一个方案显示了以前的样子。浏览器定期轮询API,并查询有关Storage(邮箱服务)的更改。
第二个方案描述了新架构。浏览器与通知API建立WebSocket连接,通知API是Bus服务器的客户端。收到新的电子邮件后,Storage会向Bus(1)发送一条通知,由Bus发送到订阅者。API确定连接以发送接收到的通知,并将其发送到用户的浏览器(3)。
所以今天我们将讨论API或WebSocket服务器。我们的服务器将有大约万个在线连接。
实现方式
让我们看看如何使用Go函数实现服务器的某些部分,而无需任何优化。
在进行net/