【从0-1 千万级直播项目实战】直播打赏:技术视角下的架构、流程与优化揭秘

``

背景

在娱乐直播项目中,送礼打赏无疑是最根本的营收来源,所以在直播项目中,保证送收礼的高并发、高可用往往会成为了开发人员最头疼的问题,此篇文章全方面解析在多种场景、并发下送礼打赏的处理方式。

全流程要点分析

礼物数据维护、资源预加载

礼物上架

  • 设计人员准备好礼物资源、动态特效等
  • 运营人员后台配置礼物的基础信息,比如礼物有效期,礼物名称,礼物类型,礼物价值,礼物分成,礼物动效等,配置后将礼物上架,这个时候礼物就在用户的礼物面板生效了

拉取礼物

  • 用户在进入直播间后,客户端先拉取本地的礼物资源缓存,拉取前需要和服务端返回的数据ID做一个增量同步
  • 如果有新增/更新的数据需要重新预加载礼物动态等资源,如果缓存没有找到只能重新从服务端拉取礼物并预加载资源,拉取后分类显示礼物基础信息

服务端送礼处理

赠送礼物

  • 用户选中礼物,选择礼物数量和收礼人,点击赠送按钮,调用gRpc送礼接口

礼物结算

  • 长连接服务接收到送礼接口参数后分别对礼物服务、资产服务调用RPC 进行数据校验、资产处理等操作
  • RRC接口两阶段都成功后推送送礼成功广播给收礼用户和观众
  • RPC接口两阶段失败后回滚数据并返回失败原因给送礼用户
  • 为保证响应速度,送礼记录、数据结算、榜单统计使用其他异步线程进行结算操作

礼物广播消息推送

  • 送收礼数据拉取并封装,通过protobuf序列化后用户选中礼物,选择礼物数量和收礼人,点击赠送按钮,调用gRpc送礼接口传输给客户端
  • 推送消息时注意优先级:送礼人>收礼人>观众

高并发下的挑战

礼物连击下大量的消息排队问题处理

  • 在一些峰值时刻,如周年庆活动直播时,用户可能会对特定礼物进行礼物连击操作,我们的系统可能在短时间内接收到高达20,000条打赏消息。为解决这种峰值压力,我们选择了RocketMQ消息队列集群,经过多次优化,已经支持单秒处理高达30,000条消息,且保证消息的有序性。同时,我们部署了多个消费者实例,以确保消息在峰值时也能得到及时处理。

网络瓶颈、弱网情况下的降级处理

  • 利用CDN分发网络,减轻单点服务器压力,并针对低速网络下的用户,提供320p的低分辨率动态资源,减少加载时间,同时延迟非核心资源如背景特效的加载,确保核心功能流畅。
  • 针对网络不稳定的用户,我们的客户端会自动检测网络速度。一旦检测到网络低于100kb/s,就会启动低质量模式,这种模式下,礼物的动画和效果会进行降级,以静态图片代替,减少数据传输量,确保核心功能如礼物的发送和接收仍然流畅。

服务故障、数据不一致的处理

  • 我们使用了分布式数据库,借助PolarDB的同步复制技术,我们确保所有节点间的数据实时一致,即使在故障转移后,新的主节点会保有完整且最新的数据,消除了数据丢失的风险。
  • 我们定期使用PolarDB自带的数据验证工具进行数据的完整性检查,确保数据在各个节点之间保持一致,如果检测到任何不一致,系统会自动触发数据修复流程,将不一致的数据块同步至最新状态。
  • 利用PolarDB的自动备份功能,我们确保每天进行至少一次完整数据备份,并在多个地理位置保存备份副本,这不仅保障了数据的安全,还为我们提供了灵活的数据恢复选项,可以根据需求恢复到特定的时间点。
  • 结合PolarDB的监控工具,我们对数据库性能指标、容量、查询性能等关键参数进行实时监控,任何异常的波动,如读写延迟的突增、节点不可用等,都会立即触发告警,确保我们的团队能在第一时间进行响应和处理。

送礼点对点消息高到达率保证

  • 基于gRpc,我们开发了长连接点对点消息自定义的重试机制,在消息未确认(ACK)的情况下,会在1秒、3秒和7秒后进行重试,同时,每一条消息都有唯一ID,确保消息不会被重复处理。

技术优化

多层缓存策略的优化

  • JVM缓存:对于频繁访问但不常变动的数据,如用礼物属性,我们采用应用层的JVM缓存。这大大减少了外部数据源的访问频率,提高了数据获取速度。
  • Redis作为热点数据缓存:对于实时变动的数据和高访问频率,例如直播间的实时礼物榜,我们采用Redis进行缓存,以降低对PolarDB的即时查询压力。
  • 全球CDN缓存:静态资源,如礼物的动效、直播间背景音乐等,通过全球CDN分发,确保不同地域的用户都能快速获取。

数据库与消息队列的整合优化

  • RocketMQ的作用:用户打赏请求首先被写入RocketMQ,随后异步地由后端服务进行消费和处理,这种策略提高了系统的响应速度并均衡了负载。
  • PolarDB的高可用性与性能优化:PolarDB通过其多活三节点架构为我们提供了数据的高可用性,同时,我们结合其慢查询日志对SQL进行持续优化,并充分利用其读写分离和数据分区功能以进一步提高性能。

流程与逻辑优化

  • 异步处理与批量操作:在RocketMQ的支持下,某些非关键操作,如礼物统计、榜单更新等,全部异步进行,对于连续高频的打赏行为,我们采用批量写入策略,减轻即时负担。

综合监控、告警与故障恢复

  • 全方位实时监控:结合PolarDB、RocketMQ、Redis及应用层的监控,实现对整个系统的实时监控。
  • 告警策略:为关键性能指标,如RocketMQ的消息延迟、PolarDB的查询响应时间,设置阈值,一旦超出,系统立即触发告警。
  • 故障恢复策略:依赖RocketMQ的消息持久化和PolarDB的数据备份策略,确保即使面对应用或数据库的暂时性故障,用户的打赏数据也不会丢失。

总结

综合JVM缓存、Redis、全球CDN、RocketMQ以及PolarDB的特性,我们构建了一个层次丰富、高度可靠的技术架构,这不仅分散了高峰期的系统压力,确保了流畅的用户体验和稳定营收,而且在任何情况下都确保了数据的完整性和系统的高可用性。

相关推荐
平凡的小码农12 分钟前
JAVA实现大写金额转小写金额
java·开发语言
一直在进步的派大星15 分钟前
Docker 从安装到实战
java·运维·docker·微服务·容器
老华带你飞18 分钟前
公寓管理系统|SprinBoot+vue夕阳红公寓管理系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·spring boot·课程设计
我明天再来学Web渗透29 分钟前
【hot100-java】【二叉树的层序遍历】
java·开发语言·数据库·sql·算法·排序算法
结衣结衣.43 分钟前
python中的函数介绍
java·c语言·开发语言·前端·笔记·python·学习
程序员陆通44 分钟前
Spring Boot RESTful API开发教程
spring boot·后端·restful
原野心存1 小时前
java基础进阶知识点汇总(1)
java·开发语言
无理 Java1 小时前
【技术详解】SpringMVC框架全面解析:从入门到精通(SpringMVC)
java·后端·spring·面试·mvc·框架·springmvc
gobeyye2 小时前
spring loC&DI 详解
java·spring·rpc
鱼跃鹰飞2 小时前
Leecode热题100-295.数据流中的中位数
java·服务器·开发语言·前端·算法·leetcode·面试