生产:实时排序-topN排行榜

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 生产:实时排序-topN排行榜

实时排序-topN排行榜



需求


根据规则实时排序,比如根据焦点主频,共享屏幕,开关麦,开关视频,角色,声音等状态实时排序,返回topN用户。


因为我这边项目是视频会议,所以状态都是通过RTC回调通知我的,当然还有一部分是客户端回调我的,另外一小部分是通过信令实现的。因此我要根据这些回调,信令实时触发topN的计算。


设计方案


因为涉及到实时排序,第一个想到的就是rediszset。那么接下来就应该设计key和score。

key:screen:{roomID}

score: 19位 [音频1位][音量3位][视频1位][角色1位][时间戳(ms)13位]


  1. 音频:1:关 2:开
  2. 音量:0-999【3位,数字越大,音量越大;取值[0-999]】
  3. 视频:1:关 2:开
  4. 角色:4:主持人 3:联席主持人 2:嘉宾 1:学员(播控、挑屏、会议助理不参与排序,按照角色id从大到小排序)
  5. 时间戳:回调时间戳


每个人会有一个分数,会利用19位组成一个分数,利用rediszset进行排序,取分数最高的N个人。比如:用户1234的分是2100141111111111111(主持人1234,开了音频,音量是100,关了视频,在1111111111111这个时间)。


当客户端或者RTC回调或者信令到达的时候,不断计算分数实现实时计算排序。



架构图

因为是几万人的会议,回调数据量非常大,就用kafka作为消息中间件


优化


因为每次根据回调实时计算排序的结果不同,那么导致会议中topN窗口中的人会实时切换画面,导致体验不好。因此要实现一个相对稳定排序算法。


稳定性排序算法步骤如下:稳定性算法(6步骤):

  1. 通过排序之后获取top 7成员存储到redis中
  2. 等下次排序计算之后获取新的top 7成员 我们记为B
  3. 从redis获取最后一次top 7的成员 我们记为A
  4. 通过排序算法计算A&B的的相对稳定集合 我们记为C
  5. 存储C到最后一次top 7缓存中
  6. 返回C


步骤4排序算法核心思想:两个有序集合A,B,如果成员存在A中但不存在B中,那么删除A中的此成员;如果成员既存在A中也存在B中,那么删除B中的此成员。等这两个步骤执行完成之后,将A中有空位的地方用B去填充,切记B中的元素是有序地按照A中空缺的位置挨个填充的。如果A中没有剩余位置,那么代表结果已经满足top 7,可以正常结束算法了。



总结


技术细节如下:

  1. 计算排序规则✅
  2. 接受信令以及所有回调✅
  3. 所有的回调按照WAL技术先落地日志✅
  4. 实现统一的回调转发服务,所有信息透传✅
  5. 根据room_id区分是线上 测试 灰度还是demo✅
  6. 布局以及其他录制参数存储到redis中或者本地代码中✅
  7. 多人点击录制/关闭按钮,只有一个人是成功的,加分布式锁✅
  8. 回调都是进入kafka,然后按需消费✅
  9. kafka topic区分线上 测试 demo 灰度✅
  10. 监控kafka topic 队列状况,防止回调信息处理不及时✅
  11. 异常情况统一归并处理✅
相关文章
|
1月前
|
存储 前端开发 NoSQL
如何优雅地实现在线人数统计功能:技术干货分享
在现代Web开发中,实时在线人数统计是一个常见且重要的功能,它不仅提升了用户体验,还能为网站运营者提供宝贵的数据支持。今天,我们将深入探讨如何优雅地实现这一功能,结合前端展示、后端处理及数据存储等多个方面,为您呈现一套完整的技术解决方案。
184 5
|
3月前
|
存储 C语言 索引
【实战编程】学生信息管理系统:一键实现数据插入、智能排序、精准查询与成绩统计(附完整源码,即学即用!)
结构体数组是C语言中一种复合数据类型,它结合了结构体的灵活性和数组的有序集合特性,允许你定义一组具有相同结构的数据项。结构体定义了一组不同数据类型的变量集合,而结构体数组则是这种结构的连续内存块,每个元素都是该结构类型的实例。这种方式特别适合管理具有相似属性的对象集合,如学生信息、员工记录等。
|
存储 算法 搜索推荐
【海量数据】TopN 问题解决方案
堆排序,比特位图(bitmap),随机选择
156 0
|
数据挖掘
白话Elasticsearch36-深入聚合数据分析之案例实战Histogram Aggregation:按价格区间统计电视销量和销售额
白话Elasticsearch36-深入聚合数据分析之案例实战Histogram Aggregation:按价格区间统计电视销量和销售额
95 0
|
算法 数据挖掘
白话Elasticsearch46-深入聚合数据分析之Cardinality Aggs-cardinality去重算法以及每月销售品牌数量统计
白话Elasticsearch46-深入聚合数据分析之Cardinality Aggs-cardinality去重算法以及每月销售品牌数量统计
136 0
|
数据挖掘
白话Elasticsearch41-深入聚合数据分析之案例实战__过滤+聚合:统计价格大于2000的电视平均价格
白话Elasticsearch41-深入聚合数据分析之案例实战__过滤+聚合:统计价格大于2000的电视平均价格
89 0
|
数据挖掘
白话Elasticsearch43-深入聚合数据分析之案例实战__排序:按每种颜色的平均销售额升序排序
白话Elasticsearch43-深入聚合数据分析之案例实战__排序:按每种颜色的平均销售额升序排序
79 0
|
数据挖掘
白话Elasticsearch38-深入聚合数据分析之案例实战 下钻分析之统计每季度每个品牌的销售额
白话Elasticsearch38-深入聚合数据分析之案例实战 下钻分析之统计每季度每个品牌的销售额
116 0
|
数据挖掘 索引
白话Elasticsearch32-深入聚合数据分析之案例实战Terms Aggs 统计哪种颜色电视销量最高
白话Elasticsearch32-深入聚合数据分析之案例实战Terms Aggs 统计哪种颜色电视销量最高
72 0