
百万在线直播互动平台基于Docker的微服务架构实践
原创2018-05-04 10:04:47本次峰会以软件开发为主题,新浪微博研发中心平台高级系统研发工程师温情在微服务与容器技术专场带来了主题为“基于 Docker 的微博直播互动微服务架构”的精彩演讲。
【51CTO.com原创稿件】本文从具体的项目实例出发和大家讨论如何从无到有地去搭建一个能够快速伸缩的微服务架构。
2017 年 12 月 1 日-2 日,由 51CTO 主办的 WOTD 全球软件开发技术峰会在深圳中州万豪酒店隆重举行。
本次峰会以软件开发为主题,新浪微博研发中心平台高级系统研发工程师温情在微服务与容器技术专场带来了主题为“基于 Docker 的微博直播互动微服务架构”的精彩演讲。
本文将围绕以下主题,探讨直播互动的微服务架构设计:
微博直播互动平台的背景与挑战
2017 年可谓直播大年,新浪微博在自己的 App 推出了直播服务,同时也打通了与淘宝、一直播、红豆等平台的互动。
从技术上说,直播一般分为两个部分:
直播的特点是:由于房间里人数众多,直播平台需要能够支持百万用户同时在线的场景。
直播互动系统的基本模型是一个消息转发的系统,即某个用户发送一条消息,其他用户收到该消息,并执行相应的存储。
消息系统一般具备三个基本的评判标准:实时性、可靠性、和一致性。对于直播这种消息系统而言,它对于可靠性和一致性的要求并不高,而对实时性的要求却非常高。
如果用户给主播送完礼物 10 秒钟或者 1 分钟之后,主播才能收到并回复。这是不可接受的。因此我们需要具有“秒级”的实时性。
而直播互动场景则不同,在用户加入房间之后,就算不做任何操作,也会收到一大堆的推送。这种实时性高的推送方式会给服务器造成持续的压力。
微博直播平台面临的挑战
由于用户对直播的需求量大,且玩法多样,我们面临了来自三个方面的挑战:
微博直播互动平台微服务架构演进
针对上述三大挑战,我们自己搭建了直播互动的微服务架构。上图是直播互动的架构图,我们对业务层进行了模块化的划分,包括发现服务、三方平台服务、推送服务等各种微服务。
在架构选型方面,我们先来看传统的单体模式。单体适用于许多场景,特别适合于敏捷开发。
由于微博互动的流量庞大,且系统相对复杂,因此会面临如下问题:
鲁棒性差。系统中任何一处的 Bug,都会导致其他的服务,甚至是整个服务的瘫痪。
而微服务与单体之间的区别在于:微服务会将一些共同功能予以拆分,并且在拆分的基础上,每个模块都能维护自己的 DB 与资源。
因此微服务的好处体现在:
微服务的引入也带来一些新的问题:
难题一:服务拆分
对于微服务的拆分,大家最为关心的问题是拆分的力度。我们采取了如下简单的方式,大家可以在自己的项目中稍做借鉴:
例如:在服务器不够用时,我们只保护核心的服务,而非核心服务不会影响到核心服务。因此是一种根据业务重要性的拆分方式。
完成了基础拆分之后,我们就可以根据业务场景对核心服务进行进一步的拆分:
我们对于 Push Service 进行拆分的原因在于:
同理,如果房间里有 100 万人,则会产生 1000 万的推送量。可见该消息量的量级是非常大的,因此 Push Service 是我们需要频繁扩容的服务。
我们简单地从业务角度对非核心服务进行了如下拆分:
我们来看 Barrage Service 的拆分原因:由于该服务是一种用来批量获取历史消息的对外暴露式服务,那么批量地获取历史消息必然会带来大量的带宽消耗。
因此,我们需要采取如下的优化方式:
如上图所示,我们在进行微服务化拆分之前,各个服务被杂乱无章地杂糅在一起,我们不得不一起部署。因此,我们根据各种策略,按照上述方法进行了服务的拆分。
难题二:服务通信
同时我们也从同步与异步的角度,对服务之间的通信进行了拆分:
对于核心服务和非核心之间的通信交互,我们进行了场景分析。如上图所示,第三方服务(Third Service)包含两个方面:
对于 Barrage Service,我们采取的是共享数据库的方式。由于批量获取回放消息是一项大量消息带宽的服务,因此我们共用一个数据库,通过直接从库里 load,以保证系统资源的提供。
难题三:服务发现
对于 Push Service 类型的服务发现,我们弃用了以前挂在 DNS 处让 DNS 做服务发现的方式,而是采用了自己写的 Dispatch Service。
而对于 RPC 类型的服务发现,我们采用典型的 SOA 架构,包括:Registry 提供可用服务列表、Server 提供服务、Client 发现并使用服务。因此,我们采用的是 Motan RPC,以快速地响应各种需求并完成发现。
总结起来,微服务解决了如下四方面的问题:
既然采用了快速扩容的框架,那么我们就需要运维同学的参与和部署。下面来讨论直播互动的弹性扩缩容策略。
微博直播互动平台的弹性扩缩容
由于对微博的使用是一个典型的流量激增场景,因此如果采用盲目购置服务器这一传统的应对方案的话,会造成整体负载饱和度的不均衡。
例如,大家一般在白天和半夜都不会去“刷微博”,服务器和网络的利用率会比较低。只有在晚高峰出现时才会有爆炸式负载的产生。
因此我们采用了快速弹性扩缩容的应对策略,即利用公有云端的各种快速弹性伸缩的资源服务。
但是,由于之前的私有云环境是在我们自己完全掌控的范围内,而如今引入的公有云则带来了环境上的差异性问题。于是我们参考业界的普遍方案,采用了 Docker。
Docker 的网络模型选择一般有 Bridge、ConTainer 和 Host 等实现方式:
因此我们采用了 Host 模式,即:
在 Host 模式下的同一个 eth0 可以被共用,因此各方能够共享宿主机的网络命名空间。
同时由于它省去了各种路由的开销,因此会比 Bridge 模式更快。
可见,Docker 的优点在于简单轻便,非常适用于微博的应用场景。另外,再加上公有云端的一些资源,共同构成了基于 Docker 的混合云架构,我们称为 DockerDCP。
值得一提的是 DCP 已经开源了,在 GitHub 上有一张 Open DCP 的服务图,大家可以去搜索一下。
DCP 的作用是能够在 10 分钟之内扩容并部署 1000 台机器,以应对诸如“三大节日”的流量猛增。
因此,它每天都会有着 6000 亿次 API 的调用,以及万亿次的 RPC 调用。
为了让直播互动与 DCP 实现相关的自动化运维部署与扩缩容,我们每次都会将消息推送至 SLB(负载均衡),通过 Push Service 的推送服务来实现跨网服务的部署。
例如:内网的三个业务方— A、B、C 都有自己的多台服务器,而我们将它们设置为一个“共享池”。
业务 C 会因为峰值流量而申请池中的 3 台服务器,而在业务空闲时则将资源归还到池中。如此,我们可以自由地在私有云和共有云上实现快速扩容,即为“双云扩”。
我们直播互动的自动化扩缩容流程大致分为:
而缩容的流程与上述扩容流程较为类似,在此就不赘述了。
对于上述提到的监控指标,我们分为两大类:
相对应地,指定监控指标的流程为:对性能系统进行相应的压力测试>发现服务的瓶颈点>对瓶颈点进行分析>制定监控的指标。
如今我们也正在尝试着通过机器学习来实现自动化监控。我们一般会每周或是定时对各种服务进行压力测试,以及时地去发现服务的瓶颈。
由于新引入的机器可能会导致整体性能的不一致,而且随着服务需求和代码量的增多,整体服务的瓶颈点也可能会相应地迁移到其他地方,因此我们通过进化版的压力测试,实现了对瓶颈点的实时把握。
就 Push Service 的指标监控而言,我们在压力测试时所监控的业务性能包括:
而对于机器性能的指标,同样会包括带宽、PPS、CPU、内存、IOPS 等。
就监控指标的采集而言,我们分为两个方面:
总结起来,我们在弹性扩缩容方面实现了如下三点:
下面是在实现扩缩容架构之前与之后的两个直播案例的对比。
未实现自动化扩缩容时,我们曾做过对神州飞船回收的直播。由于发生在凌晨 3 点多、且各方人员并未被通知到,因此我们在不清楚会有多少观看流量的情况下采用了全量 Push。
通过次日的事后分析,我们发现:服务的流量已触及瓶颈点,出现了许多的报警,幸好有人员值班,所以并未出现故障。
从维护团队过于疲惫和服务保障的角度出发,我们决定开始着手实施自动化扩缩容。
如上图所示,这是我们在实现了自动化扩缩容后的一次直播。左侧图中蓝线的每一次波谷代表一次扩容操作。
在波谷处于最小长连数时,由于自动扩容出了一堆机器,因此那一时刻并无流量的进入,连接数基本为零。
之后连接数随即迅速上升,服务在 30 分钟之内做了 4 次快速自动扩容。而这些自动化扩容对于运维人员来说都是透明的,只是在扩缩容时会有邮件提醒而已。
温情,新浪微博高级系统研发工程师,从事微博视频和通讯相关系统的研发。当前负责微博直播消息互动系统的研发,推崇高可用,可弹性伸缩,低耦合的微服务架构设计。技术上擅长消息通讯方向,针对系统应对突增流量和高并发方面有丰富的实践经验。
看Spring-cloud怎样使用Ribbon
关注下spring cloud是如何进行客户端负责均衡。 看怎么调用到负载均衡的,怎么定义负载均衡的,然后是怎么实现的?第一个其实可以不用关心,调用的地方应该很多,找到一个地方来说明怎么调用的即可。 第二个,可以猜下,最主要的应该是一个类似 serviceInstance get(string serviceId)这样的方法吧。 第三个问题,明摆着,使用netflix的ribbon呗。 发起一个调用时,LB对输入的serviceId,选择一个服务实例。 IOException {String serviceId = ();ServiceInstanceinstance = (serviceId);URIuri = (instance, originalUri);IClientConfigclientConfig = (());RestClientclient = ((), ); = (());return new RibbonHttpRequest(uri, verb, client, clientConfig);}关键代码看到调用的是一个LoadBalancerClient的choose方法,对一个serviceId,选择一个服务实例。 看下LoadBalancerClient是一个接口:足够简单,只定义了三个方法,根据一个serviceId,由LB选择一个服务实例。 reconstructURI使用Lb选择的serviceinstance信息重新构造访问URI,能想来也就是用服务实例的host和port来加上服务的路径来构造一个真正的刘访问的真正服务地址。 可以看到这个类定义在的package 下面,满篇不见ribbon字样。 只有loadbalancer,即这是spring-cloud定义的loadbalancer的行为,至于ribbon,只是客户端LB的一种实现。 Ribbon的实现定义在中的包下的RibbonLoadBalancerClient。 看下RibbonLoadBalancerClient中choose(String serviceId)方法的实现。 (String serviceId)@Overridepublic ServiceInstancechoose(String serviceId) {Serverserver = getServer(serviceId);return new RibbonServer(serviceId, server, isSecure(server, serviceId),serverIntrospector(serviceId)(server));}看到,最终调到的是ILoadBalancer的chooseServer方法。 即netflix的LB的能力来获取一个服务实例。 protected ServergetServer(String serviceId) {return getServer(getLoadBalancer(serviceId));}protected ServergetServer(ILoadBalancerloadBalancer) {return (“default”); ofkey}至于netflix如何提供这个能力的在另外一篇博文中尝试解析下。
斗鱼上的直播真的能月入百万吗
可以的。 现在的网络直播收入很高。 只要你有足够的才艺,又能熟练使用此刻TV等直播软件制作出有观赏性的节目,然后在斗鱼等平台开播并和观众互动,就能完成高收入的目标
企业想做好网络营销有哪些方法
网络营销对很多企业的第一感觉是需要一个技术团队才能来开展工作,所以这一观念使很多没有这方面人才的企业望而却步。 其实答案非也,网络营销其实就是营销网络,把网络当做一个营销平台而已。 因为在网络上:企业的最终客户没有变;企业的产品没有变;企业的卖点没有变;唯一变得就是营销平台。 以前企业是报纸、电视、杂志、终端等平台身上做光改做营销让消费者了解品牌、产品和服务,然后吸引消费者去传统的终端卖场购买自己的产品。 网络营销,只不过是吧营销平台换成了互联网,厂家在互联网导航做营销做广告来宣传自己的品牌、产品和服务,然后让客户直接进去自己的购物网站或者去传统的地面终端购买自己的产品而已,所以营销的本质没有变。 那么网络营销必须要知道了解网络的特点和网络营销形式,那目前网络营销又包括哪几种形式呢?下面详细介绍一下:目前营销总体分为15大形式:即搜索引擎营销、即时通讯营销、网络病毒式营销、BBS营销、网络博客营销、聊天群组营销、网络知识性营销、网络事件营销、网络口碑营销、网络直复性营销、网络视频营销、网络图片营销、网络软文营销、RSS营销、SNS营销。 第一种形式:搜索引擎营销搜索引擎营销是目前最主要的网络营销手段之一,有趣基于自然搜索结果的搜索引擎推广,因为是免费,因此受到众多中小网站的重视,搜索引擎营销方法也成为网络营销方法体系的主要组成部分。 搜索引擎营销主要方法包括;竞价排名、分类目录登录、搜索引擎登录,付费搜索引擎广告、关键词广告、搜索引擎优化、地址栏搜索、网站链接策略等第二种形式:即时通讯营销即时通讯营销又叫IM营销,是企业通过即时工具IM帮助企业推广产品和品牌的一种手段,常用的主要有一种两种情况: 第一种,网络在线交流,中小企业建立了网店或者企业网站时一般会有即时通讯在线,这样潜在的客户如果对产品或者服务感兴趣自然会主动和在线的商家联系。 第二种,广告,中小企业可以通过IM营销通讯工具,发布一些产品信息、促销信息,或者可以通过图片发布一些网友喜闻乐见的表情,同时加上企业要宣传的标志。 第三种形式:病毒式营销 病毒式营销是一种常用的网络营销方法,常用于进行网站推广、品牌推广等,病毒式营销利用的是用户口碑传播的原理,在互联网上,这种“口碑传播”更为方便,可以像病毒一样迅速蔓延,因此病毒式营销成为一种高效的信息传播方式,而且,由于这种传播是用户之间自发进行的,因此几乎是不需要费用的网络营销手段。 病毒营销的巨大威力就像一颗小小的石子投入了平静的湖面,一瞬间似乎只是激起了小小的波纹,转眼湖面又恢复了宁静,但是稍候一下,你就会看到波纹在不断进行着层层叠叠的延展,短短几分钟,整个湖面都起了震荡。 这就是病毒营销的魅力。 第四种形式:BBS营销BBS营销又称论坛营销,就是“利用论坛这种网络交流平台,通过文字、图片、视频等方式传播企业品牌、产品和服务信息,从而让目标客户更加深刻地了解企业的产品和服务。 㕜达到宣传企业品牌、产品和服务的效果、加深市场认知度的网络营销活动”。 BBS营销就是利用论坛的人气,通过专业的论坛帖子策划、撰写、发放、监测、汇报流程,在论坛空间提高高效传播。 第五种形式:博客营销博客营销试试通过博客网站或者博客论坛接触博客作者和浏览者,利用博客作者个人的知识、兴趣和生活体验等传播商品信息的营销活动。 第六种:聊天群组营销聊天群组营销是即时通讯工具的延伸,具体是利用各种即时聊天软件中的群功能展开营销,目前的群友qq群、msn群,旺旺群、微信群等等。 聊天群组营销是即用即时通讯工具具有成本低,即时效果和互动效果强的图文店,广为企业采用。 它通过发布一些文字、图片等方式传播企业品牌、产品和服务的信息,从而让目标客户更加深刻的了解企业的产品和服务。 最终达到宣传企业品牌、产品和服务的效果、加深市场知名度的网络营销活动。 第七种:网络知识性营销网络知识性营销是利用网络的“知道”,“百科”或者企业网站自荐的疑问解答板块等平台,通过与用户之间提问与解答的方式来传播企业品牌、产品和服务的信息。 第八种:网络事件营销网络事件营销:是企业、组织主要以网络为传播平台、通过精心策划、实施可以让公众直接参与并享受乐趣的事件,并通过这样的事件达到吸引或者转移公众注意力,改善、增进与公众的关系、塑造企业、组织良好的形象,一谋求企业的更大效果的营销传播活动。 第九种:网络口碑营销网络口碑营销是把传统的口碑营销与网络技术邮寄结合起来的新的营销方式,是在应用互联网互动和便利的特点,在互联网上,通过消费者或者企业销售人员以文字、图片、视频等口碑信息与目标客户之间而进行的互动沟通,两者对企业的品牌、产品、服务等相关信息进行讨论,从而加深目标客户的影响和影响,最终达到网络营销的目的。 第十种直复性营销网络直复性营销是指生产厂家通过网络,直接发展分销渠道活直接免费终端消费者销售产品的营销方式。 譬如B2c,B2b等。 第十一种:网络视频营销“网络视频营销”指的是企业将各种视频短片以各种形式放到互联网上,达到宣传企业品牌、产品及服务信息的目的的营销手段。 网络视频广告的形式类似于电视视频短片,他具有电视短片的种种特征,例如感染力强、形式内容多样性、肆意创意等等,又具有互联网营销的优势,例如互动性、主动传播性、传播速度快、成本低廉等等。 可以说,网络视频营销,试将电视广告语互联网营销两者宠爱集于一身。 第十二种:网络图片营销网络图片营销就是企业吧设计好的有创意的图片,在各大论坛、空间、博客、和即时聊天等工具上进行传播或者通过搜索引擎的自动抓取,最终达到传播企业品牌、产品、服务等信息,来达到营销的目的。 第十三种:网络软文营销第十四种:RSS营销第十五种:SNS营销以上便是企业常用的网络营销的15大形式,未来30年谁能营销网络,谁能营销市场,如果奇特现在还没有开始做网络营销,按您真的会想网络上说的那样:“您将错过的不只是一个机会,而是错过一个时代”
发表评论