其他
本期作者刘江涛哔哩哔哩资深开发工程师根据2022年第四季度的财报数据显示,B站在跨年晚会期间的直播人气峰值达到了3.3亿。直播业务对于B站来说是一个重要的增长点,而道具投喂(赠送礼物,后面统称为道具投喂,礼物统称为道具)在直播业务中扮演着重要的角色。在本文中,我们将介绍如何确保直播道具相关系统的高可用性,以实现99.99%的稳定性目标。文章将分为三个部分,分别是道具面板,道具投喂和多活。一、道具面板(进入直播间后点击右下角礼物显示)背景:道具面板负责展示直播间所有道具,为了保证用户进入直播间后体验较好(不会出现loading),设计了预加载机制:用户进入房间时就拉取道具面板数据,从而在用户点击道具面板时不需要loading。挑战:面板的第一个tab显示的道具根据不同的直播间有所不同,这里通过直播间维度的缓存,可以实现很高的并发。然而特权和定制tab会根据直播间+用户显示不同内容,没办法根据直播间维护做缓存,在进房流量大的时候就会面临以下2个问题:1:道具面板依赖了几个不同用户维度的相关接口,根据不同的用户展示不同道具,但这些接口的稳定性可能存在一定问题,出现问题时会影响到道具面板的用户体验2:当直播间面临大型赛事时,进房的用户流量会突增,可能会超过接口的tps方案:上面2个问题除了推动提升服务的性能之外,目前采取的方案主要是熔断+降级,对依赖的外部系统接口都不信任,均改造成弱依赖,具体方案如下(针对以上两个问题):1:假设某个用户的特权道具在相关接口超过50ms内没有返回,系统会默认降级,认为返回的数据为空。如果失败率超过50%,则会自动熔断一段时间。熔断/降级发生时会导致用户看不到特权道具,刷新后又恢复正常,虽然可能会影响用户的使用体验,但是至少保证了道具面板可以用。2:当流量增加时,网关层会自动识别热点房间,降级直接从内存中获取房间的缓存数据返回给前端,以确保接口的可用性。这种方式会让所有用户看到的道具面板都是相同的,可能会影响部分用户的体验,不过保证了所有用户都能看到道具面板。经过熔断和降级之后,热点赛事/晚会期间的系统稳定性提高了很多。虽然熔断和降级方案能够以少部分用户体验来换取全部用户的高可用性,但最好的解决方案仍然是进一步提升接口的性能(粉丝勋章正在性能优化)。二、道具投喂(送道具给主播)道具面板提供了各式各样的道具和礼物,包括盲盒、宝盒、小电视飞船等重要道具,同时还支持连击等操作。为了更好地理解相关系统的结构,可以看下面简要版的系统结构图:订单、商品以及清分/结算系统是我们的营收中台,这些系统不仅服务于道具系统,也为其他营收业务(比如大航海,人气红包等)提供服务。房间信息是整个直播系统的基础,因此它的可用性要求更高。这里为了保证4个9的可用性,我们所面临的一些主要挑战有:1、数据库不稳定:比如创建订单db超时突然增多,导致大量下单失败2、流量突增可能超出订单处理能力3、订单超时,但实际上却已经完成4、消息队列出现问题1、数据库不稳定数据库的不稳定性通常可以归结为两种情况:设计不合理和硬件问题。设计不合理可能导致性能瓶颈、查询效率低下和数据冗余等问题。针对这一点,查了chatgpt:我们采用的主要方式:拆!1、分集群:一个集群出现问题(包括硬件),还有另外的集群。按uid分集群,一个集群出问题时只影响部分用户2、分库分表:订单系统采用uid取模分10歌库,然后每个库按照月的维度再分表,保证表的数据量可控3、日常监控治理:每天运维会通过发送慢sql的邮件,我们都会记录下来作为待办的事项,对于可能会对重要流程有影响的及时处理,不重要的择期处理。还有观察报警日志,对于比较慢的接口和慢sql一样根据优先级进行处理,这样通过日常治理减少出现事故的概率。如果是硬件问题,比如msyql宕机,运维有一套自己的解决方案进行主从切换,这里就不多说了(了解的也不够多