消息中心(系统消息)实现
- 需求
用户能即时的收到来自系统或者其他用户发来的消息,在web界面右下角弹窗提醒,用户还能标记消息是否已阅状态。
- 即时通讯
概念:即时通讯(实时通信,Instant Messaging,简称IM)是一个实时通信系统,允许两人或多人使用网络实时的传递文字消息、文件、语音与视频交流。
即时通讯有多方面的应用:即时消息、群组聊天、游戏、系统控制、地理定位、中间件和云计算、数据同步、网络语音通话、身份服务。
- 为什么使用即时通讯
情景:
“我们已经到了吗?”,车后面的小孩儿问道,“没,还没有到”,一个成年人回答到。过了一会儿,小孩儿问道:“我们现在到了吗?”。这种时间短但频率高的重复性交换是一个轮询系统的真实例子:小孩儿不知道汽车什么时候到达目的地,这样他经常向开车的成年人确认。那就是,小孩儿正在轮询信息。通常成年人回复不会花太长时间:“当我们到那儿的时候,我会告诉你”。在这个例子中,这有助于和小孩儿一起旅行的成年人保持头脑清楚;在英特网上,它具有节省带宽和服务器资源的双重目的(不会再有“它变化了吗?”,“没,还没有”的交换),并且确保订阅人接收到更新和网络传递给他们的信息是一样的,而不是只有在下次由订阅人轮询来源。这跟我们平常基于“请求响应”方式来开发网站的理念不同,它属于”发布订阅”的概念,或者说“推送”的概念。
- XMPP
可扩展通讯与表示协议(XMPP)是一项用于实时通讯的开放技术。它使用可扩展标记
语言(xml)作为交换信息的基本格式。所谓协议,就是实现即时通讯的一组约定。
XMPP可以提供以下核心服务:信道加密、认证、出席、联络清单、一对一消息、多方通讯消息、通知、服务发现、能力广告、结构化数据表单、工作流管理、对等网络媒体会话。
图 1XMPP 的 client-server 架构
XMPP,在本质上,是一种XML流技术。当你准备开始和XMPP服务器会话,你打开一个长时间在线的TCP连接,然后和服务器协商一个XML流(服务器也同样也打开一个流,例如在每个方向有一个流)。
一旦你和你的服务器建立了一个XML流,你和你的服务器可以通过流交换三个特别的XML片段: < message/>、< presence/>、和< iq/>。这些片段,称为XML节(XML stanzas),是XMPP中有意义的基本单元,而且一旦你已建立一个XML流,你可以通过流发送无限数量的节。
一个节可以被认为是通讯的基本单位,类似于一个数据包或在其他网络协议的消息。
XML 流 例子:
C: <stream:stream> C: <presence/> C: <iq type="get"> <query xmlns="jabber:iq:roster"/> </iq> S: <iq type="result"> <query xmlns="jabber:iq:roster"> <item jid="suke@skh.whu.edu.cn/> <item jid="gmz@skh.whu.edu.cn"/> <item jid="beta@skh.whu.edu.cn"/> </query> </iq> C: <message from="suke@skh.whu.edu.cn" to="beta@skh.whu.edu.cn"> <body>Off with his head!</body> </message> S: <message from="lj@skh.whu.edu.cn" to="cyl@skh.whu.edu.cn "> <body>You are all pardoned.</body></message> C: <presence type="unavailable"/> C: </stream:stream> |
- XMPP的实现
服务端:djabberd、ejabberd、jabberd、jabberd2、Prosody、Tigase等。
openfire
是免费的、开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。 Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。
客户端(桌面版):Coccinella、Jeti、Psi、Swift、Tkabber等(类似于rtx、qq、tim、微信)。
Spark
Spark 是一个面向商业的客户端,并和 Openfire 服务器紧密关联。除了和 Openfire 服务器 的 集 成 外 , 它 也 提 供 了 半 专 有 的 音 频 和 视 频 通 讯 能 力 。 许 可 证 : LGPL 。 网 址 :http://www.igniterealtime.org/projects/spark/。
客户端(web):Jabbear、JWChat、SparkWeb等(类似于wechat网页版)。
工具库:
Smack(java)
Smack 是一个非常流行、全功能的库,用于编写客户端、机器人和其他的应用程序。它
由创建了 Openfire 服务器和 Spark 客户端的开发者编写。许可证: Apache。网址:
http://www.igniterealtime .org/projects/smack/。
Strophe(JavaScript)
Strophe 是一个具有良好文档化的库,用于开发 XMPP 客户端,包括强大的 TLS 和 SASL支持。Strophe 有两种形式:C(libstrophe)和 JavaScript(strophejs)。许可证:GPL。网址:http://code.stanziq.com/strophe/。
- 消息中心实现
数据库设计
活动图
提交信息:标题(内容)、类型、附加属性(url、数据)、业务标识、发送方信息、接受方信息等。发送方信息、接受方信息包含用户名、系统标识。
中间件:可选。比如可以是spring cloud的Feign、spring cloud stream、rabbitmq。考虑到消息的高并发性,推荐使用消息中间件spring cloud stream、rabbitmq。
信息处理:对提交的信息进行验证、存储等。
发送消息:使用smack api与openfire交互,将消息发送给相应的客户端。实现已封装在simba-component-xmpp包中。
消息中心发送逻辑关键代码:
自定义拓展节点MessageXMPP <messageCenter> --消息中心 <infoId>5376228f-abca-4353-ae00-e4042f96903a</infoId> --消息主体id <type>1</type> --消息类型 <url>/</url> --附加属性 <appSn>xfgl</appSn> --消息来源应用标识 </messageCenter> |
simba-component-xmpp关键代码:
创建链接 发送消息 |
消息提醒:消息接收者的web界面右下角出现窗口提醒消息。
Strophe.js关键代码:
添加消息监听处理器 connection.addHandler(function(message)); 登录认证 connection.connect(jid, pwd, function(status)); |
阅读消息:用户点击消息。
更新消息状态:更新状态位。
其他处理:可选。可根据不同的消息类型,进行不同的处理。如通知服务调用者当前消息已阅读。
消息中心(系统消息)实现相关推荐
- bos新建工作流 服务器信息和更新端口,BOS技术支持博客 : BOS_集成消息中心开发指南...
1. EAS消息中心主动向第三方系统推送消息 使用此功能需要实现一个接口MessageWebServiceDao 接口全路径:com.kingdee.eas.base.message.webservi ...
- 聊聊消息中心的设计与实现逻辑
厌烦被消息打扰,又怕突然间的安静: 一.业务背景 微服务的架构体系中,会存在很多基础服务,提供一些大部分服务都可能需要的能力,比如文件管理.MQ队列.缓存机制.消息中心等等,这些服务需要提供各种可以复 ...
- 【消息中心】架构准备
概述 消息中心是为了将具体业务和消息进行解耦,实现企业微信定制推送.邮件.业务系统消息交互等功能, 可以在分布式环境下提供应用解耦.冗余存储.流量削峰.异步通信.数据同步 背景 调用量大 消息总量大, ...
- 基于Redis的消息中心缓存搭建
背景 问题分析 在以往的经历中出现了在大批用户涌入消息中心时,造成数据库负载急剧升高的问题,经过排查,发现原因主要有以下几点: 消息中心相关表中,部分体量较大的数据表没有创建索引,查询操作中数据库连接 ...
- 京麦消息中心业务模型分析(京东)
京麦消息中心是京麦平台核心业务之一,负责向京麦平台商家用户提供消息推送,ISV消息订阅,以及消息追踪,消息监控,消息统计等功能. 京麦消息中心(以下简称MC)经过4个618的洗礼,技术及业务模型日趋成 ...
- 京麦消息中心业务模型分析
京麦消息中心业务模型分析 京麦消息中心是京麦平台核心业务之一,负责向京麦平台商家用户提供消息推送,ISV消息订阅,以及消息追踪,消息监控,消息统计等功能. 京麦消息中心(以下简称MC)经过4个618的 ...
- 骑士卡:基于Kafka搭建消息中心,上亿消息推送轻松完成
全球购骑士卡是国内领先的会员制特权电商平台,汇聚国内外"吃喝玩乐买"超 300 项会员专属优惠特权.全球购骑士卡基于移动互联生活方式,打通线上.线下消费场景,汇集时下热门.高频的商 ...
- 【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )
文章目录 一.消息中心 二.订阅方法时的注解 三.订阅方法封装 四.订阅对象-方法封装 五.线程模式 一.消息中心 此处暂时只实现一个单例类 , 后续 注册订阅者 , 处理事件传递 , 取消注册订阅者 ...
- java netty聊天室_netty实现消息中心(二)基于netty搭建一个聊天室
前言 上篇博文(netty实现消息中心(一)思路整理 )大概说了下netty websocket消息中心的设计思路,这篇文章主要说说简化版的netty聊天室代码实现,支持群聊和点对点聊天. 此demo ...
最新文章
- 头秃,在线求名字:网易使用昵称交流,再也没有“哥,姐,总”
- HTML5如何重塑O2O用户体验
- bat批处理延迟运行脚本
- 注入dll到一个进程里面
- 跨语言调用Hangfire定时作业服务
- 安卓软件错误log_关于android程序的log错误信息的问题,请明白人看下吧,我是初学者,新建的android项目,一个代码都没改过...
- win10系统用户:如何获得超级管理员权限(vue开发之Win10踩坑)
- python字符串类型图解_Python基础——数据类型(图解+实例,非常详细!)
- 测试攻城狮必备技能点!一文带你解读DevOps下的测试技术
- NavigatorContent使用皮肤
- 2020 年度 OSC 中国开源项目评选结果公布
- 几何约束栏设置不包括_2011CAD考试样题
- java中jdk多大_Java中JDK和JRE的区别
- ios 设置导航栏背景色
- 写在2016的最后一周
- 用VS2010打开VS2013、VS2015、VS2017等高版本项目
- app渗透之Burp抓取app数据包
- 水清冷冷:Photoshop CC2020/ PSCC2020 安装图文教程及学习
- 身为程序员,我敢和你打赌100块,这个数学符号你根本不会认不会写
- Happy Children‘s Day