mpm led 系统

企业积分制团队激励,利用led实现奖扣数据显示;在线终端数900多台,每月增长量在60台左右;基于Netty+MongoDB,并使用RocketMQ解耦需求;在“延迟级别、Thread Pool”上参考RocketMQ的源码实现;

整体架构

主要实现高度解耦:1、SaaS服务做为主程序服务(终端socket连接、推送、报表);2、环形队列、延迟级别及线程池,是给使用者定制的一套插件;3、展现层用于React+Redux+Webpack+Antd

1、SaaS服务

设计仅基于MQ实现异步消息推送和报表统计;其设计目的就是简单核心功能,方便后期插件化扩展;

整体结构

2、扇形写,解决复杂场景

扇形写可以实现高效读,使用者可个性化设置消息有效时间,有助于环形队列实现;

单数据多终端输出

3、环形队列

本实现利用MongoDB的document的数据有效机制,简化环形队列复杂可能性;其主要实现消息在有效时间内可重复被推送与显示;

环形队列

4、统计

基于运维考虑,增加“上线、离线、发送、回执、心跳”等数据统计;
统计数据有效为7天(使用MongoDB数据有效期机制),所有类型数据先写入到RocketMQ中,然后再把消息体和统计写入到MongoDB中;
1、上线、离线对比图:分析该终端当前所处的状态、和连接稳定性分析;
2、发送、回执对比图:分析数据发送丢包情况;
3、心跳、未知对比图:针对状态做更细微分析;

上线、离线对比图
推送、回执对比图
心跳、未知对比图

5、场景优化

5.1、对接mpm 2.3系统(已解决):

场景说明:v2.3.0遗留问题在于,所有数据以屏号为key存储在Redis的list中,技术需要从Redis把N个屏的数据同步到环形队列中;

每1分钟推送一次数据,每次推送5条;
解决方案:
利用定时器间隔N秒,生成任务交给线程池去执行;需要考虑同步效率、MongoDB和Redis连接池等问题;
线程池运行效率、间隔时间和同步数量的均衡问题;由于每个屏均用队列,会比较吃线程,会造成线程池排队时间长的问题;
优化为:长间隔少量的同步方式;
1、同步间隔时间设置为:30s,同步数量设置为:5条;
2、增加同步线程池的并发量从6提高到30;

5.2、对接mpm 2.4系统:

场景说明:v2.4.0遗留问题在于,所有屏消息均存储在Redis的一个list中,这种结构会影响多屏数据同步不均衡,造成屏闲置的情况;
解决方案:
以最快的速度消费队列的数据;
1、提高线程池并发量从6提高到30;
1、短间隔多量的同步方式


很高兴认识你,我们都一样,有过迷茫却从未放弃;害怕孤独可从不寂寞。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,022评论 2 89
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,009评论 3 119
  • 世间已再无二人能唱出如此细腻的歌,听懂已是曲中人,歌词中:“是你的遗憾与我有关”戳中泪点。没有句点已经很完美,谈过...
    圆融无碍阅读 127评论 0 0
  • 三.那样的人 第二天一早,我起床洗漱完毕,摆弄昨天还没有拿出行李的箱子。然后下去吃早餐,路上寥寥几个人。我听到背后...
    知阳未知阅读 374评论 0 1
  • 不是孤独, 不是高冷, 仅仅是怯懦。 到了嘴边的话, 却成了呼出的空气。
    黑槐树阅读 277评论 0 7