消息中心(系统消息)实现

article/2025/9/1 12:59:50
  • 需求

用户能即时的收到来自系统或者其他用户发来的消息,在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));

阅读消息:用户点击消息。

更新消息状态:更新状态位。

其他处理:可选。可根据不同的消息类型,进行不同的处理。如通知服务调用者当前消息已阅读。


http://chatgpt.dhexx.cn/article/jobJd17H.shtml

相关文章

消息中心设计

1 参考文档 产品参考&#xff1a;消息通知系统设计 | 人人都是产品经理 (woshipm.com) 2 消息中心目标职责 消息中心仅作为消息发送使用&#xff0c;跟业务没有任何关系&#xff0c;涉及到业务部分有业务系统自行处理&#xff1b;消息中心的功能只有消息生产、消息展示、消息推…

如何设计一个消息中心

如今的内容型产品&#xff0c;不管提供的是什么类型的内容&#xff0c;在其主功能之外&#xff0c;不可避免的会有另一个十分重要的功能——消息中心。 而无论是信息流、论坛、信箱&#xff0c;还是私聊、群聊、通知&#xff0c;推拉模型是内容型&#xff08;包括&#xff1a;社…

聊聊消息中心的设计与实现逻辑

厌烦被消息打扰&#xff0c;又怕突然间的安静&#xff1b; 一、业务背景 微服务的架构体系中&#xff0c;会存在很多基础服务&#xff0c;提供一些大部分服务都可能需要的能力&#xff0c;比如文件管理、MQ队列、缓存机制、消息中心等等&#xff0c;这些服务需要提供各种可以复…

4. 消息中心的设计与实现

消息中心的设计与实现 一、引言 运用场景&#xff1a; 1、消息的主动提醒&#xff08;客户端被动接收&#xff09; 2、客户模块&#xff08;及时通讯&#xff09; 3、单一登录&#xff08;一个账号只能在一个设备登录&#xff09; 消息中心的实现方案&#xff1a; 1、客户端轮…

mysql格式化数字去掉千分位

前言 使用format格式化数字时&#xff0c;超过1000就会有千分位&#xff0c;但有时我们不希望有这个千分位&#xff0c;那怎么去掉呢&#xff1f; 1. select format(11111.123,2) 2. select convert(11111.123,decimal(12,2))

upper mysql_MySQL函数

MySQL函数 Lower 转换小写 upper 转换大写 substr 取子串(substr(被截取的字符串,起始下标,截取的长度)) length 取长度 trim 去空格 str_to_date 将字符串转换成日期 date_format 格式化日期 format 设置千分位 round 四舍五入 rand() 生成随机数 Ifnull 可以将null转换成一个…

MySql FORMAT 去掉千位分隔符,

加上墨西哥的地区参数即可 SELECT FORMAT(35555566.8, 2, es_MX) AS value; 结果

MySQL知识总结

目录 知识点条件查询排序常见单行处理函数&#xff08;可嵌套&#xff09;多行处理函数分组查询distinct去重 连接查询⭐⭐⭐⭐⭐内连接外连接多表连接&#xff08;两张表以上&#xff09; 子查询where子句中的子查询from 子句中的子查询select后面出现的子查询 union合并查询结…

MySQL知识点

总结汇总MySQL数据库面试题&#xff08;2020最新版&#xff09;_ThinkWon的博客-CSDN博客_mysql数据库面试题 1. 索引 &#xff08;1&#xff09;主键索引 唯一非空&#xff0c;属于聚簇索引 &#xff08;2&#xff09;唯一索引 unique 可为空(多个null也可) &#xff08;3&…

mysql 处理金额_MYSQL处理金额相关函数

1.FORMAT()数字千分位分割 FORMAT(X,D) 1.X需要格式化的数字 2.D保留小数位数 例:SELECT FORMAT(12334555.213,2) 2.ABS() 求绝对值 ABS(X) SELECT ABS(-23); SELECT ABS(21-23); SELECT ABS(23); 3.四舍五入保留小数 ROUND(X,D) 1.X需要格式化的数字 2.D保留小数位数(不写时默…

C语言字符数组的输入和输出

字符数组的输入输出有两种方法&#xff1a; &#xff08;1&#xff09;逐个字符输入输出。用格式符“%c”输入或输出一个字符。例如 int main() {char c[6]; //定义一个字符串for (int i 0; i < 5; i){scanf("%c", &c[i]); //输入字符串}for (int i 0; …

C语言 | 字符数组

C语言字符数组的定义 字符数组是用来存放字符数据的数组&#xff0c;字符数组中的一个元素存放一个字符&#xff0c;定义字符数组的方法和定义数值型数组的方法类似。 //例子&#xff1a;char character[10];C语言字符数组的初始化 C语言对字符数组初始化&#xff0c;最容易理解…

C语言,字符数组与字符串

文章目录 字符数组基本介绍字符串注意事项字符串的访问和遍历字符串的表示形式用字符数组存放一个字符串&#xff1a; 用字符数组存放一个字符串,用字符指针指向一个字符串使用字符指针变量和字符数组两种方法表示字符串的讨论 字符串相关函数常用字符串函数一览字符串函数应用…

浅谈字符数组

文章目录 一、什么是字符数组二、字符数组的定义和赋值1. 先定义一个数组&#xff0c;再为挨个元素进行赋值2. 在定义的同时给该字符数组进行初始化2.1 错误的初始化方式2.2 正确的初始化方式 3. 特别注意&#xff01;&#xff01;&#xff01;3.1 字符数组和整型数组一样不支持…

字符数组

字符数组 用来存放字符数据的数组是字符数组。字符数组中的每一个元素存放一个字符&#xff0c;其定义和使用方法与其他类型的数据基本相似。 1.1字符数组的定义和使用 字符数组的定义与其他类型的数组类似&#xff0c;标准形式如下&#xff1a; Char 数组名 【常量表达式】 …

Stata:嵌套Logit模型(NestedLogit)

原文链接&#xff1a;https://www.lianxh.cn/news/d5e00bfb17a7c.html 致谢&#xff1a; 这篇推文的核心内容主要来自陈强老师编著的《高级计量经济学及 Stata 应用》一书&#xff0c;特此致谢。 1. 简介 此前&#xff0c;连享会发布了一系列离散选择模型相关的推文&#xff0…

MNL——多项Logit模型学习笔记(二)

本节将会通过案例举例&#xff0c;介绍Logit模型的建模思路和过程 内容为摘抄他人学习资料的个人学习笔记&#xff0c;如有侵权则删 1.正确打开/解读Logit模型系数的方式 本节的具体内容在笔记里不详细表示了&#xff0c;大家在软件里拟合Logit模型时&#xff0c;对于其中的参…

logit回归模型的参数估计过程_【DCM07】Random Parameter(随机参数)Logit模型及其Nlogit实现...

本文是离散选择模型系列的第7篇原创文章,将详细介绍随机参数Logit模型,并利用Nlogit软件进行实操演示。【关注本公众号,可以获取数据和代码】本文公式较多,建议电脑端享用。 目录 1、随机参数Logit模型介绍 2、数据描述 3、随机参数Logit模型的参数估计 1 随机参数Logit模型…

MNL——多项Logit模型学习笔记(三)二项Logit模型、Gumble分布以及Logistic分布

上一节最后一部分&#xff0c;介绍了Provit模型&#xff0c;从建模的角度来说&#xff0c;Probit模型假设随机项服从正态分布&#xff0c;这是具有一定的合理性的——也是其优点&#xff1b;但是Probit模型没有闭合解——每次算P(n)i 的值的时候都需要求积分&#xff0c;这就给…

模型与logit_互助问答第33期:条件logit模型相关问题

问题: 尊敬的老师,您好!我最近在做一个条件logit模型的实证研究,因为是非线性的二元响应模型,查了很久的文献和Stata资料也没找到检查这类模型异方差的方法以及处理异方差的办法,请您们帮忙分析下,谢谢!如果可以的话,希望您能给出Stata命令,再次感谢! 答案: 第一,…