用消息队列实现即时通讯3

消息队列(MQTT)

前面讨论过消息队列传输的具体内容,那我们该用哪种方式进行呢?通过查阅网络资料,发现有两个方式值得借鉴。

第一种方式每个帐号订阅自己的Inbox,而其他人都向这个Inbox发布信息,这种方式接收比较方便,但是发布时就比较麻烦。如群组有50人的话,一条消息就要发布50次,这和Http推拉信息有点类似。

第二种方式,也是我正在使用的方式。每个帐号只订阅自己的个人聊天信息,以及加入的群聊。主题以"/"进行分隔,个人聊天p2p/帐号,群聊group/组帐号。这种方式发送群消息时只用publish 到group/组帐号,避免太多群成员发布次数过多的问题,也是个人认为比较合理的方式。下面将简单演示一下个人聊天方式:

一旦登录成功,自己订阅p2p/自己帐号,

A订阅 p2p/A

B订阅 p2p/B

A对B发送聊天信息:  A publish "Content" 到p2p/B

由于B已订阅p2p/B,所以B将收到 “Content"信息,

同理,B回复信息,则向 p2p/A publish "Reply",

A 收到:"Reply"

这样就完成简单的个人聊天,由于其他帐号没有订阅p2p/A,p2p/B所以也就无法接收到相应信息。当然,如果非要说其他帐号强制订阅p2p/A,p2p/B,不就能接收到他们私聊信息吗?是有这样的情况,但现在只能在客户端进行控制,强制不发生这种情况。理想的情况是订阅也要根据token进行,发布同样必须验证token,貌似阿里有带token的mqtt,没有认真研究,这些关于MQTT深入话题将要二期或三期进行研究。

这种方式群聊就比较简单,新建群group1后,A加入group1,B加入group1后,

A 订阅 group/group1

B 订阅 group/group1

A要发送信息到group1 :A publish ”content“ group/group1

A,B,以及其他人员都会收到  "content"信息,此时msgId就起到了关键性作用,由于发送都已经有了此消息,就可以通过msgId避免重复。

系统消息

首先定义系统消息主题固定格式: sys/类型[/类型结果]/帐号

因为系统消息大多都是有针对性的(广播新闻类除外,暂时没考虑这一块),比如A添加B为好友,系统会发布 添加好友信息到  sys/addP2p/B

B同意后,系统会发布 同意信息到 sys/addP2p/ok/A ,所以A和B都要订阅相关的系统主题。订阅方式:用户只需要分别订阅 sys/+/帐号,sys/+/ok/帐号,sys/+/no/帐号。

说明

为什么要订阅三个而不是订阅sys/#/帐号,因为订阅主题是用#号建议放在最后(没有强制规定,但是放在中间将忽略后面帐号),就没办法区分帐号

综上所述,当用户登录后MQTT连接成功,客户端应该向MQTT订阅:

p2p/帐号

sys/+/帐号

sys/+/ok/帐号

sys/+/no/帐号

循环参加的所有群组订阅 group/group帐号 (订阅零个或多个)

代码片段:

private static String myTopic = MessageTypes.P2P + "/" + APIX.account;//这个表示,可能有一个,或多个情况的private static String sysTopic = MessageTypes.SYS + "/+/" + APIX.account;private static String sysTopicok = MessageTypes.SYS + "/+/ok/" + APIX.account;private static String sysTopicno = MessageTypes.SYS + "/+/no/" + APIX.account;
// 订阅myTopic话题client.subscribe(myTopic, 1);//订阅系统消息client.subscribe(sysTopic, 1);client.subscribe(sysTopicok, 1);client.subscribe(sysTopicno, 1);

if (APIX.current != null) {    List<ImGroup> groupList = APIX.current.getGroups();    if (groupList != null) {        for (ImGroup group : groupList) {            String sb = MessageTypes.GROUP + "/" + group.getAccount();            client.subscribe(sb, 1);        }    }}

预备知识基本上将完,具体的实现将在后面进行更详细讲解。

希望大家能继续关注后期文章,下一期专门讲解消息队列相关内容

请关注公众号有更多精彩等你:

原文地址:https://www.cnblogs.com/wavaya/p/10336183.html

时间: 2025-02-01 19:54:37

用消息队列实现即时通讯3的相关文章

用消息队列实现即时通讯2

一.准备阶段(需求设计)   鉴权 采用哪种权限认证模式,Cookie由于有域的限制,考虑到以后可能做桌面端,IPhone端等,所以决定采用token进行权限认证,客户端通过token保存客户验证信息.而token则采用JWT进行(补充知识:JSON Web令牌)验证,用token建议是最好不用查询数据库就能获取一些常用信息,这样就能节省一些访问时间. 补充知识: ?JSON Web Token 入门教程 阮一峰 消息 前面说过采用MQTT进行消息传输,那么怎样定义消息,怎样保存消息,以及离线消

消息队列实现即时通讯

</pre>发送端和接收端都可以发送和接收信息,只是发送和接收消息的类型不同,一个是1,一个是2.具体代码如下:<p></p><p></p><pre code_snippet_id="666150" snippet_file_name="blog_20150513_3_8263799" name="code" class="cpp"><pre cod

消息队列简介

一.概述 计算机科学中,消息队列和邮箱是用于进程间或者线程与同一进行间通讯的软件工程组件.他们都是消息传传输控制队列. 消息队列是发布/订阅模型的变种,是较大的面向消息的中间件的一部分.多数消息系统支持发布/订阅和消息队列模型的API,如JMS(Java Message Service). 消息队列提供异步的通讯协议,这就意味着消息发送者和消息接收者不需要在同一时间与消息队列交互.消息入队直到接收者来读取.消息队列都有单条消息大小的限制,入队消息的数目也有限制. 消息队列的主要应用是在不同计算机

阿里云消息队列Kafka商业化:支持消息无缝迁移到云上

列Kafka彻底解决了开源产品稳定性不足的痛点,可用性达99.9%,数据可靠性99.999999%,并且支持消息无缝迁移到云上. 7月25日,阿里云宣布正式推出消息队列Kafka,全面融合开源生态.在兼容Apache生态的基础上,阿里云消息队列Kafka彻底解决了开源产品稳定性不足的痛点,可用性达99.9%,数据可靠性99.999999%,并且支持消息无缝迁移到云上. Kafka是一个分布式.高吞吐量.高可扩展性的消息队列服务,广泛用于日志收集.监控数据聚合.流式数据处理.在线和离线分析等大数据

MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制

最近一直做物联网方面的开发,以下内容关于使用MQTT过程中遇到问题的记录以及需要掌握的机制原理,主要讲解理论. 背景 MQTT是IBM开发的一个即时通讯协议.MQTT构建于TCP/IP协议上,面向M2M和物联网IoT的连接协议,采用轻量级发布和订阅消息传输机制.Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用. 基本概念 [MQTT协议特点]——相比于RESTful架构的物联网系统,MQ

系统通讯之RPC VS 消息队列

文前声明:本人只是知识的搬运工,文中许多知识和观点大多数都是来自于网络或书本,因为没有记录的习惯学习研究完,便忘记名称了,如若还记得,在文后自会添加备注. 个人观点,对于这两种通讯方式我是支持消息队列的! 原由且听我分析: 通讯方式 RPC 消息队列 优点 舒适感非常好,直接远程调用,无需关注通讯协议等等细节 (除了这个,我还真不知道RPC还有什么优点) 1.解耦 2.冗余 3.可扩展 4.可恢复 5.交易缓冲 6.消息投递保证 7.异步通信(支持同步) 8.提高系统吞吐.健壮性 缺点 1.对开

linux_c 开发(5-5)进程间通讯_消息队列

进程间通讯_消息队列 定义: UNIX早起通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带来不便.消息队列(也称报文队列)则克服了这些缺点. 发展: 消息队列就是一个消息的链表.可以把消息看做一个记录,**具有特定的格式.进程可以向中按照一定的规则添加新消息:另一些进程则可以从消息队列中读取消息. 分类: 目前主要有两种类型的消息队列:POSIX消息队列 以及系统V消息队列,系统V消息队列目前被大量使用. 持续性:系统V消息队列是随内核持续的,只有在

[Python]实现XMPP协议即时通讯发送消息功能

#-*- coding: utf-8 -*- __author__ = 'tsbc' import xmpp import time #注意帐号信息,必须加@域名格式 from_user = '[email protected]' password = 'a1b2c3d4' #可以添加多个接收人 to_user = ['[email protected]'] msg = "您好!这是条测试信息!" def to_msg(): """ 基于xmpp协议的即时

进程组间通讯(消息队列)

1.所有进程共用一个消息队列组. 2.消息队列组里面包含一个发送消息队列和一个接收消息队列. 3.请求进程主动向发送消息队列发送消息,从接收消息队列接收消息.处理进程从发送消息队列读取请求,向接收队列发送处理结果. 4.同一进程组都是相同的进程. 5.处理进程组内的所有进程以竞争的方式从消息队列内读取请求. 5.要实现的功能是向进程组发送消息,得到处理结果.从发送请求的进程的角度来说,只需要知道发送给哪个进程组即可.从接收进程的角度来说,需要知道请求是从哪一个进程发来的才能准确地把请求结果返回.