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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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. 异常情况统一归并处理✅
相关文章
|
4月前
|
存储 安全 Java
记一次集合去重导致的线上问题!
记一次集合去重导致的线上问题!
|
jstorm 大数据 分布式数据库
大数据下的实时热点功能实现讨论(实时流的TopN)
我司内部有个基于jstorm的实时流编程框架,文档里有提到实时Topn,但是还没有实现。。。。这是一个挺常见挺重要的功能,但仔细想想实现起来确实有难度。实时流的TopN其实离大家很近,比如下图百度和微博的实时热搜榜,还有各种资讯类的实时热点,他们具体实现方式不清楚,甚至有可能是半小时离线跑出来的。今天不管他们怎么实现的,我们讨论下实时该怎么实现(基于storm)。
218 0
|
数据挖掘
白话Elasticsearch43-深入聚合数据分析之案例实战__排序:按每种颜色的平均销售额升序排序
白话Elasticsearch43-深入聚合数据分析之案例实战__排序:按每种颜色的平均销售额升序排序
93 0
|
算法 数据挖掘
白话Elasticsearch46-深入聚合数据分析之Cardinality Aggs-cardinality去重算法以及每月销售品牌数量统计
白话Elasticsearch46-深入聚合数据分析之Cardinality Aggs-cardinality去重算法以及每月销售品牌数量统计
149 0
|
数据挖掘
白话Elasticsearch41-深入聚合数据分析之案例实战__过滤+聚合:统计价格大于2000的电视平均价格
白话Elasticsearch41-深入聚合数据分析之案例实战__过滤+聚合:统计价格大于2000的电视平均价格
100 0
|
SQL 数据挖掘
白话Elasticsearch39-深入聚合数据分析之案例实战_搜索+聚合: 统计指定品牌下每个颜色的销量
白话Elasticsearch39-深入聚合数据分析之案例实战_搜索+聚合: 统计指定品牌下每个颜色的销量
148 0
|
数据挖掘
白话Elasticsearch36-深入聚合数据分析之案例实战Histogram Aggregation:按价格区间统计电视销量和销售额
白话Elasticsearch36-深入聚合数据分析之案例实战Histogram Aggregation:按价格区间统计电视销量和销售额
110 0
|
分布式计算 Hadoop 开发者
分组排序案例分析| 学习笔记
快速学习分组排序案例分析
144 0
分组排序案例分析| 学习笔记
|
存储 安全 Java
记一次集合去重导致的线上问题
前言在工作中一次排查慢接口时,查到了一个函数耗时较长,最终定位到是通过 List 去重导致的。由于测试环境还有线上早期数据较少,这个接口的性能问题没有引起较大关注,后面频繁超时,才引起重视。之前看《阿里巴巴Java开发手册》里面有这样一段描述:你看,阿里前辈们都免费总结了,不过还是会看到有人会用List的contains函数来去重......不记得的,罚抄10万遍如果需要这本书资源的网上下载也行,私聊我发你也行今天我就结合源码聊聊Set是怎样保证数据的唯一性的,为什么两种去重方式性能差距这么大HashSet源码底层实现基于 HashMap,所以迭代时不能保证按照插入顺序,或者其它顺序进行迭代