消息队列

消息队列是系统或应用间的通信方式,可保证信息可靠传递。其应用场景包括异步、解耦、流量削峰和日志管理等。介绍了消息队列保证可靠性的方法、所用协议、高可用性的实现方式,还列举了如ActiveMQ等不同种类的消息队列。

消息队列(消息中间件)

:是系统或应用之间的一种通信方式,是保存消息的容器,保证信息可靠传递。

应用场景:

1.异步:生产者可以不必等待消费者执行结束之后返回结果再进行下一步操作,而是在在发送消息之后就直接直往下执行。将原本程序执行的串行方式变成了并行,提升效率。
2.应用解耦:生产者将消息放入消费队列时,生产者的任务就完成了,此时就算消费者的服务崩溃了也不会影响生茶这服务的正常运行。
3.流量削峰:在某一时间,客户端突然传来大量请求可能直接导致服务端崩溃,加入消息队列可以起一个缓冲作用,客户端将请求发送至消息队列中,服务端不必立即获取所有消息并进行处理,而是可以按照合适的节奏取消息,再执行。
4.日志管理:
消息中间件的组成:
(1).消息服务器:作为服务端提供消息核心服务。
(2).消息生产者:消息的发起方,负责生产消息发送给服务端。
(3).消息消费者:消息的处理方,负责从服务端中获取消息并处理业务逻辑。
(4).主题(Topic):发布订阅模式下消息的汇集出,不同生产者将消息发送给主题,由服务端负责将消息发送给不同的订阅者,实现广播。
(5).队列(Queue):点对点消息传递的通道,生产者将消息发送给特定的队列,服务方监听特定队列获取消息。
(6).消息数据:根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输。

消息队列如何保证可靠性:

(1).rabbitMQ:一.生产者写数据丢失,在这种情况下可开启rabbitMQ提供的事务功能,当生产者发送消息而MQ没有收到时,生产者会收到异常报错,此时就可以回滚事务(channel.txRollback),然后重试发送消息;如果收到了消息,那么可以提交事
务(channel.txCommit)。但是问题是,rabbitmq事务机制一搞,基本上吞吐量会下来,因为太耗性能。
二.消息队列数据丢失:开启消息队列的持久化,rabbitMQ的持久化方式分为三种,1.队列持久化,只会保存队列的元数据而不会保存消息。2.消息持久化:在发送消息时将消息的delivery属性设置为2,rabbitMQ会将消息持久化到磁盘上去。 必须同时实现这两种持久化才能在MQ重启之后恢复队列里的消息。三.交换机持久化:如果不进行交换机持久化,就算队列与消息回复,MQ依然不会知道这些消息需要发送给谁。
三.消费者丢失消息:使用rabbitMQ的ACK机制,关闭rabbitMQ的自动ack,调用另一个api,当消费者接收数据并处理完成后返回ack信息,如果没有返回,MQ会将此消息分配给其他的消费者。
(2).kafka:一.消费者丢失消息,关闭自动提交offset,在处理完之后自己手动提交offset,就可以保证数据不会丢。但是此时确实还是会重复消费,需要保证幂等性。
二.kafka丢失消息,

消息队列所用协议:

(1).AMQP协议
AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。
优点:可靠、通用
(2).MQTT协议
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。
优点:格式简洁、占用带宽小、移动端通信、PUSH、嵌入式系统
(3).STOMP协议
STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。STOMP提供一个可互操作的连接格式,允许客户端与任意STOMP消息代理(Broker)进行交互。
优点:命令模式(非topic\queue模式)
(4).XMPP协议
XMPP(可扩展消息处理现场协议,Extensible Messaging and Presence Protocol)是基于可扩展标记语言(XML)的协议,多用于即时消息(IM)以及在线现场探测。适用于服务器之间的准即时操作。核心是基于XML流传输,这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。
优点:通用公开、兼容性强、可扩展、安全性高,但XML编码格式占用带宽大

消息队列保证高可用性:

(1).rabbitMQ:RabbitMQ有三种模式:单机模式,普通集群模式,镜像集群模式。
单机模式:就是demo级别的,一般就是你本地启动了玩玩儿的,没人生产用单机模式。
普通集群模式:多台机器启动多个RabbitMQ,当创建一个queue时只会在一个rabbitMQ实例中创建,其余rabbitMQ实例会同步queue的元数据,当你消费的时候,实际上如果连接到了另外一个rabbitMQ实例,那么那个实例会从queue所在实例上拉取数据过来。这种方式只提高了吞吐量,并没有提高可用性。
镜像集群模式:普通集群模式不一样的是,你创建的queue,无论元数据还是queue里的消息都会存在于多个实例上,然后每次你写消息到queue的时候,都会自动把消息到多个实例的queue里进行消息同步。好处在于即使一个节点失效了,整体服务依然可用,坏处在于,第一,这个性能开销大,消息同步所有机器,导致网络带宽压力和消耗很重!第二,没有扩展性,如果某个queue负载很重,你加机器,新增的机器也包含了这个queue的所有数据,并没有办法线性扩展你的queue。
(2).kafka:kafka一个最基本的架构认识:多个broker组成,每个broker是一个节点;你创建一个topic,这个topic可以划分为多个partition,每个partition可以存在于不同的broker上,每个partition就放一部分数据。
这就是天然的分布式消息队列,就是说一个topic的数据,是分散放在多个机器上的,每个机器就放一部分数据。
实际上rabbitmq之类的,并不是分布式消息队列,他就是传统的消息队列,只不过提供了一些集群、HA的机制而已,因为无论怎么玩儿,rabbitmq一个queue的数据都是放在一个节点里的,镜像集群下,也是每个节点都放这个queue的完整数据

消息队列种类:

1.ActiveMQ:队列模式(queue),点对点模式,每个消息只有一个消费者,消息保证送达。
发布订阅模式(topic),生产者将消息发布到topic中,可以有多个消费者订阅该topic,并消费该消息。
由JAVA编写,易于与SSM集成,不过吞吐量低并且不提供分片机制。
消息持久化方式:1.持久化为文件,2.持久化为Mysql(三张表:activemq_acks,activemq_lock,activemq_msgs),3.持久化为Oracle

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值