【Bilibili微服务及高可用实战】
Bilibili,作为一个知名的二次元视频分享平台,随着用户基数的不断扩大,其技术架构也在不断发展和演进。本文主要探讨的是Bilibili在微服务化以及提高系统可用性的实践中遇到的问题、采取的策略和取得的成果。
在系统发展早期,Bilibili采用的是“大而全”的架构,即单体应用模式。这种模式下,代码复杂度高,超时设置混乱,一旦出现问题,整个系统都可能受到影响,导致服务的稳定性下降。例如,PHP大织梦和Go bilizone项目都面临着同样的痛点,如超时引发的雪崩效应和高维护成本。
为了应对这些挑战,Bilibili开始了微服务化的拆分。在拆分过程中,首先需要明确微服务的边界,这可以通过按模块、业务或产品划分。服务间的通信方式也是一个重要的决策点,如选择HTTP还是RPC,以及如何管理和治理众多的服务。拆分初期,运维成本会显著增加,但随着业务及基础组件的积累,长期来看,这种拆分有助于提高开发和测试效率。
在第一阶段的拆分中,Bilibili采取了一系列措施。例如,使用Go语言原生的net/rpc进行服务间通信,并基于Zookeeper实现了服务发现和加权轮询负载均衡。对于多语言服务,他们选择了成熟的Nginx+HTTP方案,利用Nginx进行服务治理,包括负载均衡、健康检查和配置动态加载等功能。此外,每个服务都有自己的基础库,包含了数据库访问、日志管理和错误处理等工具,确保服务的自给自足。同时,团队对服务的开发运维全面掌控,专注于提供高质量的API接口。
这一阶段还引入了在线监控系统,如StatsD+Grafana,以及用于异步通讯的Databus(基于Kafka)和MySQL binlog增量订阅的Canal,以支持数据实时缓存更新、大数据分析和搜索索引更新。通过这些工具,Bilibili能够在第一阶段显著减少了服务故障的影响,提升了开发和测试效率。
然而,随着微服务数量的增加,新的挑战也随之而来。例如,问题的追踪变得困难,需要对所有服务的RPC请求、HTTP请求、SQL查询、Cache请求和内部方法进行持续监控。Bilibili借鉴了Google的Dapper论文,设计了一套数据格式和收集机制,以实现全链路的追踪。
Bilibili的微服务与高可用实战是一次从单体应用向分布式微服务架构转型的过程,涉及了服务拆分、服务治理、监控系统构建等多个层面。通过不断优化和改进,Bilibili成功地提高了系统的稳定性和开发效率,为用户提供更流畅的体验。