码农成长系列-基于WebSocket的后台消息提醒
mhr18 2025-05-28 18:56 8 浏览 0 评论
场景描述
当用户对app有某些业务操作时,需要将该操作友好地提醒给,有接收提醒权限的后台管理者。
技术场景分析
经分析,要实现上述业务,业务拆解后可能需要解决如下业务
①.触发提醒待推送数据的监听
②.提醒时接收权限的处理
③.提醒推送
④.提醒未处理的超时处理
⑤.提醒一览汇总
⑥.提醒补偿处理
⑦.集群推送
技术选型一览
具体实现
触发提醒待推送数据的监听
- 系统间集成问题
异步:采用生产者系统与消费者系统异步处理的方式来实现,生产者负责生产消息 ,并将消息放入任务列表,消费者负责监听它,并消费其上的消息。
同步:采用生产者直接调用消费者方法的方式来实现,此方式造成服务间的耦合性较大,故没有采用。
- 数据监听的异步处理机制
启动一个可定时的并发线程池,设置一定的轮询时间,轮询的线程负责查询redis任务队列(List实现),当任务队列中有数据时,那么轮询以先进先出的策略(lPop)取出数据。
- 监听线程池的实现
启动可定时的并发线程池(ScheduledExecutorService),此处要注意查看系统可承载能力,若系统性能足够强大,则可将池子的线程数量设置的大点。
- 监听的任务队列
为了与外部系统交互方便,暂时采用了基于redis的数据存储,未来可以优化为用rabbitmq、activeMq等替代
至此我们要轮询推送的数据已经取到了,那么就可以设计推送的逻辑了。
可接收提醒权限的处理
- 得到当前在线的用户
由于本文作者的系统是基于shiro做的权限处理,其对外暴露的方法是可以轻松取到当前在线的所有的用户的会话(Session)的,如果使用shiro外的框架,可以自行实现类似的处理
- 根据用户的会话(Session)得到其所对应的用户信息
- 得到用户拥有的权限(缓存+DB)
- 在点对点推送前,验证待推送用户的权限与内容设置的权限是否有匹配到,如果能匹配到,则认为权限验证成功,进行下一步操作。
提醒的推送
- 基于websock的机制进行推送
客户端与服务端建立连接后,会把当前会话ID作为监听的点对点标识,监听该队列。
- 消息推送(局部广播)
后台在解析到待推送的任务后,遍历在线的用户会话列表,得到用户的权限,进行鉴权处理,
当鉴权通过后,已会话id为标识进行消息推送。
★由于我们的系统是没有做单点登录的限制的,为了使消息的推送与接收是可靠的,所以采用了会话ID作为推送的标识。
- 推送状态记录
推送后将推送的结果记录到推送结果表中,方便补偿业务做处理
提醒未处理的超时处理
- 提醒未处理,是指当管理人员不在线或未及时查看(查看后关闭提示框)消息,且消息较多时,桌面的将会被消息窗口覆盖,此时系统需要把长时间未查看的消息清除掉,好腾出桌面做其他业务。正好作者选用的前端组件是支持倒计时清空的,完美地解决了此问题。
提醒一览汇总
- 业务中需要将推送的信息汇总起来,方便查看及日后备查,此功能相对简单。
提醒补偿处理
- 由于业务中有某些场景需要做业务处理并记录提醒查看的状态,且消息的送达率有时会要求近似百分百,那么此时我们就需要启动一个离线任务定时轮询补偿消息推送。
本业务中,作者采用了十分钟,半小时,两小时,五小时,十小时,二十四小时,四十八小时的轮询间隔策略。
集群推送
- 当服务的架构是集群时,把消息推送给集群中的某个用户就变得相对困难。针对此问题,有两种方案,
- 方案一:维护一个在线的服务本体主机列表,当有新消息时轮询推送,若用户不该服务中,则寻找下一个服务,只到找到所在的服务后进行推送处理
- 方案二:采用rabbitmq技术进行实现,消息生产者把消息推给rabbitmq后即完成了消息的分发。
架构图
相关推荐
- Team IDE 集成管理工具
-
Team·IDE工具简介TeamIDE工具集成SSH、FTP、MySql、Redis、Zookeeper、Kafka、Elasticsearch等管理工具Team·IDE功能模块目录结...
- MySQL大数据表处理策略,原来一直都用错了……
-
场景当我们业务数据库表中的数据越来越多,如果你也和我遇到了以下类似场景,那让我们一起来解决这个问题。数据的插入,查询时长较长后续业务需求的扩展,在表中新增字段,影响较大表中的数据并不是所有的都为有效数...
- Java程序员你真的甘心只做增删改查吗
-
各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题最近...
- Java后端开发除了增删改查还有什么?
-
后端的追求:接口稳定、架构合理、业务逻辑清晰、模块拆分合理、支持高并发等。软件本身归根到底都是由算法+数据结构构成的,进一步细化之后,其实就是通过一系列的增删改查操作,构成算法,对数据结构进行操作,赋...
- 基于shiro实现session持久化和分布式共享
-
前言本文写下session持久化和分布式共享基于shiro框架对session的管理机制来实现必要性一直处于登陆状态:你登陆微信不可能三天两头就让你重新登陆吧?而是一直处于登陆状态除非主动退出...
- 为啥工作那么多年,你还是只会增删改查?
-
你以为没有这样的感觉,工作中领导和同事都非常认可你的能力,但是你想更进一步,却不被认可。想出去看看,跳槽面试,却也是屡屡碰壁。面试的过程中,面试官问技术方案,明明心里很清楚,或者说印象还行,可就是说不...
- Java程序员除了做增删改查还能干嘛?
-
就以Java后端开发为例,说说不同级别程序员干的事情。1初级开发,大概是有3年Java开发经验。22年底,上海,这批程序员如果学历是本科,薪资一般是8k到2w,当然如果能进好公司或互联网大厂,薪资能...
- Java面试题及答案总结(2025版持续更新)
-
大家好,我是Java面试分享面对Java后端岗位的激烈竞争,掌握系统化的知识体系至关重要。本文整理了覆盖主流技术栈的高频面试题,助你高效备战,内容包含:Java基础、并发编程、Spring生态、数据库...
- 微服务架构之API网关——在微服务项目中的技术框架和用法实践
-
API网关技术实战在介绍了API网关的相关理论之后,大家可以了解到API网关的作用和优缺点,接下来将为大家介绍API网关在微服务项目中的技术框架和用法实践。Zuul网关其实API网关并不是很难的技术,...
- 带小白黑客入门,你也可以跟我们一起成为黑客大牛
-
小编这几天一直在做关于ssrf的实验,这篇文章可以带纯小白黑客入门。靶机ip地址:192.168.2.138查看靶机运行的redis服务。攻击机为ip192.168.2.112.用客户端redis-c...
- Python最常见的170道面试题全解析答案(二)
-
60.请写一个Python逻辑,计算一个文件中的大写字母数量答:withopen(‘A.txt’)asfs:count=0foriinfs.read():ifi.isupper...
- Spring Boot项目集成Redis,原来这么简单!
-
在现代软件开发的“快车道”上,SpringBoot无疑是许多开发者手中的“神兵利器”。它以其“约定大于配置”的理念,大大简化了Java应用的开发和部署过程,让开发者能够将更多精力聚焦于业务逻辑本身。...
- Apache Commons Pool——优化你的java内存
-
大家好,我是吉森。我会持续分享一些开发技巧、经验和技术,如果你也热爱各种开发技术,欢迎关注我。今天我们继续介绍ApacheCommons工具包,今天的主角是:CommonsPool。简单地说,它是...
- 码农成长系列-基于WebSocket的后台消息提醒
-
场景描述当用户对app有某些业务操作时,需要将该操作友好地提醒给,有接收提醒权限的后台管理者。技术场景分析经分析,要实现上述业务,业务拆解后可能需要解决如下业务①.触发提醒待推送数据的监听②.提醒时接...
- 百度直播消息系统的实践和演进
-
导读:直播业务的核心功能有两个,一个是实时音视频推拉流,另一个是直播间消息流的收发。本文主要介绍百度直播服务内的消息服务系统的设计实践和演化。一、背景直播间内用户聊天互动,形式上是常见的IM消息流;...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)