消息队列(2):常见的消息队列协议

协议很常见,只要是通信,就会用到协议,就像我们说话的语言一样,不同的语言连通着不同的人群。
所以说,消息队列也是一样,想要互相通信,就要使用同一种协议。
每个协议下的消息队列,都有着不同的角色定义。
简单说下常见的消息队列协议:

1.AMQP(Advance Message Queuing Protocol)

Message(消息):消息服务器处理消息的原子单元,包括一个内容头,一组属性和一个内容体。
消息有优先级,高优先级的消息在等待同一消息队列时会比低优先级的消息先发送,而且当消息必须被丢弃时,低优先级的消息优先被丢弃。
使用AMQP协议,消息服务器不能修改内容体和内容头,但可以在内容头上添加额外信息。
PubLisher(消息生产者):发送消息
Consumer(消息消费者):消费消息
Broker(消息代理):消息队列服务器,负责接收客户端连接,路由消息。
Queue(消息队列):Broker中的一个角色,一个Broker中可以有多个Queue,负责保存消息直到发送给不同的消费者。算是消息的容器。一个消息可以被投入一个或多个队列中,每个队列的消息都会等待消费者连接到这个队列并被取走。
Exchange(交换路由):Broker中的一个角色,负责接收生产者发送的消息,并路由给服务器中的队列。可以被理解成一个规则表,指明消息该被投到哪个队列中。
Channel(信道):信道是一条独立的双向数据流通道。为了解决操作系统无法承受每秒建立特别多的TCP连接。

生产者发送消息时,必须指定消息要被路由到哪些个消息队列中。
当消息到消息队列中,消息队列会尝试将消息传给消费者,如果失败,消息队列会存储消息并等待消费者。
如果没有消费者,消息队列将选择性的将消息返回给生产者。
如果消息别消费掉,消息队列会删除消息,删除的过程或者是及时的,或者是等到消费者消费结果后才删除的。

AMQP是二进制协议。

2.MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)

由IBM开发,现在被广泛用于物联网公司。因为他的特点就是轻量,简单,开放和易于实现。所以他常用于很多计算能力有限、带宽低、网络不可靠的远程通信应用场景。
Publisher(发布者):消息发布客户端
Subscriber(订阅者):消息订阅客户端
Broker(消息代理):消息服务器端
Application Message(应用消息):指通过网络传输的应用数据,一般包括主题和负载。
Topic(主题):应用消息的类型,一般消息发布者会确定消息的主题,订阅者根据自己实际情况选择不同的主题进行消息订阅消费。
Payload(负载):消息订阅者具体接收的内容。

MQTT协议是通过交换预定义的MQTT控制报文来通信的。
控制报文内容由三部分组成:固定报头,可变报头和消息体。
固定报头通过标识不同位的值来确定报文类型,包括发布订阅的一些完成状态等。
可变报头的内容根据控制报文类型不同而不同,常作为包的标识符。
消息体也是根据不同的消息类型有着不同的内容。

MQTT协议中,客户端和服务端是通过请求应答模式通信的。客户端发送一条控制报文数据给服务器,服务器再发送一条控制报文数据给客户端。

MQTT在发布消息时,有三种Qos等级:至多一次(0级),至少一次(1级),只有一次(2级)。
至多一次等级最低,客户端只需要将消息发出去即可,这种等级很low,用于消息不重要但特别多,为了减轻通信压力,就不顾质量,只看数量了。
至少一次等级中等,客户端要保证发出去的消息至少一次被服务端接收到,所以要收到服务端的回应,否则一直发,这种等级一般用于服务端有幂等处理,所以不怕重复消费,还要保证消息不会丢失。
只有一次等级最高,客户端先发消息过去,然后本地记录一个我已发送,但不确定你是否收到的状态,然后服务端接收到消息后,回给客户端一个我已接收的报文,同时服务端记录一个我不确定你知不知道我已接收的状态,然后客户端收到这个已接收的消息后,就确定服务端收到这个消息了,于是把自己本地记录的已发送未确定的状态删除,同时再给客户端发送一个我已经知道你收到的报文,服务端收到这个报文,也会把自己之前记录的状态删掉,整个一条报文只有一次的通信才算完成,这种等级就比较严格了,但质量上去了,相对低等级的,数量就会相对小些,但可靠就是王道,不多不少才是最好的。
只有一次的发送和确定,其实思想和三次握手差不多,都是两端互相确认的过程,所以会一来一回的。如果传输过程中出现丢包,都会由发送者重发上一条消息。

3.STOMP(Streaming Text Orientated Messaging Protocal,流文本定向消息协议)

STOMP是一个相对简单的文本消息传输协议,主要特点就是简单易懂,没有特别多的套路。
客户端:既可以是生产者,也可以是消费者
服务端:消息中心

4.XMPP(可扩展通信与表达协议)

基于XML的流式即时通信协议。
由于用的XML,所以通用性更强。
客户端:生产者,消费者
服务端:消息中心
XMPP的理念是尽可能的简化客户端,复杂的都放在服务端。

5.JMS(Java Message Service,java消息服务应用程序接口)

java消息服务应用接口,是一套java API接口。
JMS是规范,是对AMQP,MQTT,STOMP,XMPP等协议更高一层的抽象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spingboot下shiro自定义过滤器roles

shiro默认的roles过滤,是与的关系,就是你的用户得有roles对应的所有角色,才算有权限。 但是实际开发过程中,更多的是或的需求,只要用户满足roles中的一个角色,就算有权限。 所以就涉及到重写过滤器roles&am…

shiro的集群动态权限更新

shiro的动态权限,一般都是将权限放在数据库中,项目启动后将权限加载给shiro 当数据库的权限数据发生改变时,重新加载权限给shiro。 单机这样做没问题,但是当项目服务是集群的时候,比如有tomcat1,tomcat2&am…

消息队列(3):RabbitMQ

RabbitMQ,基于AMQP协议实现。 特点: 消息可靠:持久化消息,传输确认,发布确认。 路由灵活:使用AMQP的Exchange来路由消息,包括RabbitMQ内置的Exchange,还有复杂的路由也可以使用多个…

java基础 --- Arrays.asList():返回指定数组支持的固定大小列表

Arrays.asList():返回指定数组支持的固定大小列表 首先看下这个方法的源码注释,注意第一句,Returns a fixed-size list backed by the specified array., 意思就是:返回指定数组支持的固定大小列表 所以:…

[设计模式] ------ 单例模式

单例模式,是众多设计模式中,写法最多,套路最多,坑最多,面试被问最多的设计模式。 基本上,单例模式在面试中已经被问烂了,依稀记得我的上家公司面试我的时候,说到设计模式&#xff0c…

分布式锁闲谈

分布式锁闲谈 前言 服务器单机情况下,要锁住某个资源,我们一般用到的是synchronized,lock等锁,这是java提供的,也确实能很有效的锁住资源。 但是在服务器集群的情况下,上面这些单机锁就不起作用了&#…

java 后端与前端Date类型与String类型互相转换(使用注解)

一:java 后端格式化输出Date类型的属性值到前端 后端返回的类型中,直接定义Date类型,加上此注解,直接将Date类型转成自定义的格式给前端 class TestDateOutput{JsonFormat(pattern "yyyy-MM-dd")private Date create…

spring boot配置对上传文件的大小限制

spring boot配置对上传文件的大小限制 spring-boot 2.0之前 Spring Boot1.4版本后配置更改为(默认单个文件最大1Mb,单次请求文件总数大小最大10Mb): spring.http.multipart.maxFileSize 20MB spring.http.multipart.maxRequestSize20MB spring-boot …

[设计模式] ------ 适配器模式

适配器把一个类的接口,强制变成另外一个类的接口实现。 个人建议,万不得已不要用适配器。但是,你一定要知道有这么个东西。 如果你的项目刚刚起步,就有人用了适配器,那基本上就是滥用。 适配器一般是项目庞大&#xff…

Notepad++中的UTF-8无BOM格式编码

Notepad中,关于utf-8的编码格式,有两种:以UTF-8无BOM格式编码和以UTF-8格式编码。 很容易给人一种错觉,第一反应会选择以UTF-8格式编码,感觉这种就是平时所说的UTF-8,然而这种编码是默认带BOM的&#xff0…

java 上传文件注意事项

java 上传文件注意事项 1、文件名有特殊字符的情况,所以最好是文件名前台url编码,后台再url解码,这点在下载的时候也一样 2、文件大小一定要设置,spring boot 有默认。 3、文件名校验: 3.1、文件后缀校验 3.2、conten…

[设计模式] ------ 装饰模式

首先,假设项目有个核心功能。 随着项目迭代,又产生功能1和功能2 于是有如下需求: 某个场景需要核心功能和功能1组合, 某个场景需要核心功能和功能2组合, 某个场景需要核心功能和功能1和功能2组合, 甚至以后…

hash和一致性hash

hash;简单的hash取余 优点: 计算简单,快速定位 缺点: 容错和扩展差,任何的增加机器或减少机器,都会伴随着重新set值 比如原来有五台机器做缓存,现在加一台,那么余5就变成余6&#x…

[记录]---mysql数据库,decimal类型设置默认值0,不要是null

mysql数据库 类型为decimal的字段,最好把默认值设置为0,不要设置为null。 因为null值在代码中及其容易造成空指针。

Java 线程状态---WAITING(部分转载)

看到一篇关于写线程waiting状态的文章,感觉很生动有趣,转过来保存下。 总结: waiting这个状态,就是等待,明确了等待,就不会抢资源了。 一个线程A在拿到锁但不满足执行条件的时候,需要另一个线…

[记录] --- linux上项目

1.安装jdk8 yum -y list java* 查看可安装java版本 yum install -y java-1.8.0-openjdk-devel.x86_64 java -version jdk在/usr/lib/jvm目录 2.配置环境变量 打开/etc/profile 在profile文件末尾加入: export JAVA_HOME/usr/lib/jvm/java-1.8.0 export PATH$JAVA_HOME/bin:…

[记录] --- linux安装redis

获取redis资源 wget http://download.redis.io/releases/redis-具体版本.tar.gz 解压 tar xzvf redis-具体版本.tar.gz 安装 cd redis-4.0.8 make(这个需要安装了gcc,没有gcc的先执行这个命令:yum install gcc) cd src mkdir /usr/local/redis/etc&…

服务端高并发分布式架构演进之路(转载,图画的好)

这个文章基本上从单机版到最终版,经历了加缓存,加机器,高可用,分布式,最后到云等过程,其实我一直想总结一套类似的东西,没想到有人已经先弄出来了,那就不重复造轮子了,而…

java 记录一个类加载顺序的坑

看看这个,先想想结果打印的顺序和a、b的值 public class ClassLoderTest {public static void main(String[] args) {staticFun();}static ClassLoderTest clt new ClassLoderTest();static {System.out.println(1);}{System.out.println(2);}ClassLoderTest(){Sy…

[前端记录] --- vue axios 等调用完再执行后面的语句

vue 整合echarts的时候,是先axios 调用后台接口,获取数据,再将数据渲染到页面。 一开始的问题是:第一次请求完,页面没数据,再请求一次才出现数据 分析到最后,发下是由于axios是异步请求的&…