EMQ 学习---MQTT消息QoS
MQTT发布消息QoS保证不是端到端的,是客户端与服务器之间的。订阅者收到MQTT消息的QoS级别,最终取决于发布消息的QoS和主题订阅的QoS。




客户端连接:
客户端完成TCP三次握手之后,还需要发起CONNECT命令
注意:如果客户端三次握手之后,不发起MQTT的CONNECT命令,30s之后会被服务器断掉。
emqttd.config文件有定义这个时间间隔:
%% Client
{client, [
%% Socket is connected, but no 'CONNECT' packet received
{idle_timeout, 30} %% seconds
]},
只有QoS==1,2时候,才有Store(Msg)之说;QoS==0时没有。
我们以第一种action为例(注意这里第一种action存储的是message,第二种action存储的是message ID):
1 若client没收到来自sever的pubcomp:那么client将重发pubrel,意思是sever将收到两次pubrel;但是sever并不会将消息发送两次,因为在第一次将消息发送给订阅者之后,server将删除这条消息的内容(delete message),而消息的内容是在publish中传输的,而不是在pubrel中传输的;
2 若client没收到来自server的pubrec,那么client将重发publish,意思是sever将收到两次publish,但是这里sever只是存储了信息,而且后面在pubrec中会有消息的ID,而client可以根据两次ID是否相同来判断server收到了几次同样的消息。
综上所述,这就保证了server不会将消息重发。
对于QoS2,增加了一个PUBREL及PUBCOM的过程,这样可以保证server端只publish一条message给他的subscriber。但是QoS1是只要sever接收到message就会publish给他的subscriber,网络不好的时候sender是会重复发送相同的message的,server也就会重复publish相同的message给他的。
QoS2的server端处理逻辑有点特别:
如果sender没收到server的PUBRECV, sender 是会重发,但是对于头上一条message,server有两种处理方式:1, message存在本地,先不publish给subscriber;2,存下message ID,把message publish 给他的subscriber。
对于第一种处理方式,如果sender继续重发,且被收到(ID相同),那在server端只算一条message,继续等sender发PUBREL,这样server就保证只publish了一条message,而不是多条。
对于第二种处理方式,如果sender继续重发,且被收到,sever会检查它的message ID,如果重发过来的message ID是之前存过的,server就不会publish给他的subscriber,因为之前已经publish了。直接删除。
总之,QoS==1,2时候,有Store(Msg)和唯一的MessageID来保证消息不会重复接收和发送!
EMQ 学习---MQTT消息QoS的更多相关文章
- MQTT 消息 发布 订阅
当连接向一个mqtt服务器时,clientId必须是唯一的.设置一样,导致client.setCallback总是走到 connectionLost回调.报connection reset.调查一天才 ...
- 百万级开源MQTT消息服务器 搭建
下载地址:http://emqtt.com/downloads 文档地址:http://emqtt.com/docs/v2/index.html 开始使用EMQ 2.0 消息服务器简介EMQ (Erl ...
- 使用EMQ搭建MQTT服务器
前言寒假的时候开始搭建mqtt服务器,一开始使用的是RabbitMQ,基于Erlang语言.但是RabbitMQ的本职工作是AMQP,MQTT只是他的一个插件功能,似乎有些大材小用,很多MQTT的功能 ...
- mqtt消息推送
https://github.com/wizinfantry/delphi-mqtt-clienthttps://github.com/Indemsys/Delphi_MQTT_mosquittoht ...
- MQTT消息队列压力测试
环境准备: jmeter插件下载:mqttxmeter1.0.1jarwithdependencies.jar 把MQTT插件放在 %JMeter_Home%/lib/ext下.重启jmeter. M ...
- vue中使用stompjs实现mqtt消息推送通知
最近在研究vue+webAPI进行前后端分离,在一些如前端定时循环请求后台接口判断状态等应用场景用使用mqtt进行主动的消息推送能够很大程度的减小服务端接口的压力,提高系统的效率,而且可以利用mqtt ...
- Storm学习笔记 - 消息容错机制
Storm学习笔记 - 消息容错机制 文章来自「随笔」 http://jsynk.cn/blog/articles/153.html 1. Storm消息容错机制概念 一个提供了可靠的处理机制的spo ...
- [3] MQTT,mosquitto,Eclipse Paho---怎样使用 Eclipse Paho MQTT工具来发送订阅MQTT消息?
在上两节,笔者主要介绍了 MQTT,mosquitto,Eclipse Paho的基本概念已经怎样安装mosquitto. 在这个章节我们就来看看怎样用 Eclipse Paho MQTT工具来发送接 ...
- 物联网网关开发:基于MQTT消息总线的设计过程(上)
道哥的第 021 篇原创 目录 一.前言 二.网关的作用 2.1 指令转发 2.2 外网通信 2.3 协议转换 2.4 设备管理 2.5 边沿计算(自动化控制) 三.网关内部进程之间的通信 3.1 网 ...
随机推荐
- keystone 命令简要说明
catalog: keystone catalog 可以显示所有已有的service keystone catalog --service service-type 显示某个service信息 end ...
- iOS学习之iOS沙盒(sandbox)机制和文件操作复习
1.iOS沙盒机制 iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. ...
- Homebrew-macOS缺失的软件包管理器(简称brew)
[简介] brew又叫Homebrew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,只需要一个简单的命令,非常方便 [遇到的问题] 在真正了解软件包管理工具之前,一直是 ...
- Maven +Tomcat+m2eclipse的热部署(hot deploy)
原文地址: http://www.cnblogs.com/cbf4life/archive/2010/01/29/1659502.html 软件版本:maven 2.2 tomcat 6.0,Ecli ...
- [转载] 无所不能的“蚂蚁”--Ant
说他无所不能,好像有点夸张,但是用过Ant之后,感觉真的是只有想不到没有作不到.Ant,原作者选择他作为软件名字的意思是指"令一个简洁的工具"(Another Neat Tool) ...
- pm2 相关命令
pm2 相关命令 转载 2017年02月18日 22:59:48 二.安装 Linux Binaries下载地址:https://nodejs.org/dist cd oneinstack/src ...
- VisualStudio:WEB 性能测试和负载测试 入门
背景 一直做的是中小企业应用,很少关注性能和负载这里,进来准备看一本关于并发编程的图书,为了量化的测试 WEB 环境的性能和负载,特意玩了一下 VS 提供的测试项目. 新的测试项目 新建项目 性能测试 ...
- SWT常用组件
SWT类所代表的事件常量: 事件类型常量 说明 SWT.Activate 当激活窗口时 SWT.Arm 菜单项被选中之前 SWT.Close 关闭窗口时 SWT.Collapse 折叠树的节点时 SW ...
- [Android Studio] Android Studio使用教程(二)
以下是本次Google I/O大会发布的IDE Android Studio使用教程第二篇: 在Android Studio使用教程(一)中简要介绍了Android Studio的基本使用,包括安装. ...
- Openshift 和Harbor的集成
1.安装配置Harbor 环境rhel 7.6 安装docker,python 安装docker-compose sudo curl -L https://github.com/docker/comp ...