全栈编程

Balance $ 2,317
Item Sold 1230
文章作者: 全栈编程@luboke.com
版权声明: 本文章为全栈编程go语言体系课视频教程配套电子书,版权归 全栈编程@luboke.com所有,欢迎免费学习,转载必须注明出处!但禁止任何商业用途,否则将受到法律制裁!

针对千万级消息推送系统所遇到的技术挑战(这里我们以电商系统为例来分析)

技术难点 服务器本身调用推送数量的限制

我们以天猫这种大型的电商系统来举例,像天猫这种电商系统,如果遇上搞大促活动,特别是双十一这种全民参与的数亿级别的大型线上购物活动,假如双十一凌点那一时刻一次性涌入3亿的用户过来购物,这种情况下,天猫的系统架构必须涉及到N多个服务器集群,这N多个服务器集群有可能按照地域进行系统集群划分,以此来负载均衡这几亿用户的并发请求,我们这里假如有3亿个用户在10秒内下单成功好吧,那针对这3亿个用户购买成功的商品,一般电商系统会进行消息推送,比如向用户发送消息提示,内容假如如下:“xx用户,您购买的xx商品购买成功,您的订单号为xxx,所购买商品为xxx,一共xxxx元”。那针对系统的推送数量,我们可以明确得知的是,假如针对购买商品的用户,我们推送一条购买成功的消息,3亿用户购买成功,需要推送3亿条消息,那如果推送10条消息就是30亿次的推送,这种消息推送的量级是呈线性增长的,而且对系统的压力是超大的,以此带来的消息推送是否成功也是无法估量的,为了保证成功,那么推送一条消息给一个用户我们还需要保存当前推送的状态,即当前消息对指定用户是否推送成功。

在前面我们讲解海量大文件处理的时候,我们讲解到的文件操作相关的知识,讲解到了文件描述符,一个进程能打开的最大文件数量是受限的,也就是一个文件打开的最大文件描述符是受限的。

linux系统处理系统调用的时候,对文件的处理是受限的,我们知道在linux当中一切皆文件,对吧,那我们进行消息的推送,其实是打开网络进行数据的处理,那这里的网络调用实际上也是对文件的操作,也就是说单台服务器能够处理的消息推送数量是受限的,肯定无法推送前面我们所说的3亿条消息。假如一秒钟可以推送的消息数量10万条,那么推送3亿条数据就需要3千秒,也就是50分钟,那这种时效肯定是不能满足我们业务需求的,特别是电商这种系统,用户购买了商品,50分钟之后才通知购买成功,肯定不行,所以在这种情况下,我们就只能增加服务器集群。 当然能够达到这种量级的用户,那他的产品是相当成功了,目前也就只有淘宝能够达到这种量级的用户。 

 

一般服务端推送的数据都是以json格式进行推送的,那么向每个用户推送消息之前需要对推送的数据进行编码,json encode,前面我们在讲解json的时候已经讲解了,也就是json.marshal()

假如一秒钟可以推送的消息数量10万条,那么3亿条需要推送的消息就要耗费50分钟,前面我们已经分析了,json编码本身是消耗cpu资源的,那推送3亿条消息就要编码3亿次吗?除了我们可以增加服务器集群之外,还有什么解决办法吗? 我们可以将json编码的工作提前完成,再进行发送,这样只需要编码一次就行了,可以大大减少编码json对cpu资源的消耗 。

 

文章作者: 全栈编程@luboke.com
版权声明: 本文章为全栈编程go语言体系课视频教程配套电子书,版权归 全栈编程@luboke.com所有,欢迎免费学习,转载必须注明出处!但禁止任何商业用途,否则将受到法律制裁!
copyright © 2020 全栈编程@luboke.com