百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

码农成长系列-基于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消息流;...

取消回复欢迎 发表评论: