mq为了解决什么问题?
一、异步通讯
有些业务不想也不须要当即处理消息。消息队列提供了异步处理机制,容许用户把一个消息放入队列,但并不当即处理它。想向队列中放入多少消息就放多少,而后在须要的时候再去处理它们。数据库
二、解耦
下降工程间的强依赖程度,针对异构系统进行适配。在项目启动之初来预测未来项目会碰到什么需求,是极其困难的。经过消息系统在处理过程当中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口,当应用发生变化时,能够独立的扩展或修改两边的处理过程,只要确保它们遵照一样的接口约束浏览器
3冗余
有些状况下,处理数据的过程会失败。除非数据被持久化,不然将形成丢失。消息队列把数据进行持久化直到它们已经被彻底处理,经过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除以前,须要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。安全
四、扩展性
服务器
由于消息队列解耦了你的处理过程,因此增大消息入队和处理的频率是很容易的,只要另外增长处理过程便可。不须要改变代码、不须要调节参数。便于分布式扩容网络
五、过载保护
在访问量剧增的状况下,应用仍然须要继续发挥做用,可是这样的突发流量没法提取预知;若是觉得了能处理这类瞬间峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列可以使关键组件顶住突发的访问压力,而不会由于突发的超负荷的请求而彻底崩溃架构
六、可恢复性
系统的一部分组件失效时,不会影响到整个系统。消息队列下降了进程间的耦合度,因此即便一个处理消息的进程挂掉,加入队列中的消息仍然能够在系统恢复后被处理。负载均衡
七、顺序保证
在大多使用场景下,数据处理的顺序都很重要。大部分消息队列原本就是排序的,而且能保证数据会按照特定的顺序来处理。异步
八、缓冲
在任何重要的系统中,都会有须要不一样的处理时间的元素。消息队列经过一个缓冲层来帮助任务最高效率的执行,该缓冲有助于控制和优化数据流通过系统的速度。以调节系统响应时间。分布式
9数据流处理
分布式系统产生的海量数据流,如:业务日志、监控数据、用户行为等,针对这些数据流进行实时或批量采集汇总,而后进行大数据分析是当前互联网的必备技术,经过消息队列完成此类数据收集是最好的选择ide
Mq原理
一、MQ原型
1)MQ原型-Pub/Sub发布订阅
(广播:生产者-消费之1对多):使用topic做为通讯载体
但愿发送的消息能够不被作任何处理、或者只被一个消息者处理、或者能够被多个消费者处理的话,那么能够采用Pub/Sub模型。
MQ原型-PTP点对点
:使用queue做为通讯载体
若是但愿发送的每一个消息都会被成功处理的话,那么须要P2P模式。
MQ原型-多点广播:
MQ适用于不一样类型的应用。其中重要的,也是正在发展中的是"多点广播"应用,即可以将消息发送到多个目标站点(Destination List)。可使用一条MQ指令将单一消息发送到多个目标站点,并确保为每一站点可靠地提供信息。MQ不只提供了多点广播的功能,并且还拥有智能消息分发功能,在将一条消息发送到同一系统上的多个用户时,MQ将消息的一个复制版本和该系统上接收者的名单发送到目标MQ系统。目标MQ系统在本地复制这些消息,并将它们发送到名单上的队列,从而尽量减小网络的传输量。
MQ原型-群集(Cluster):
为了简化点对点通信模式中的系统配置,MQ提供Cluster(群集)的解决方案。群集相似于一个域(Domain),群集内部的队列管理器之间通信时,不须要两两之间创建消息通道,而是采用群集(Cluster)通道与其它成员通信,从而大大简化了系统配置。此外,群集中的队列管理器之间可以自动进行负载均衡,当某一队列管理器出现故障时,其它队列管理器能够接管它的工做,从而大大提升系统的高可靠性
二、MQ组成结构
Broker:消息服务器,做为server提供消息核心服务
Producer:消息生产者,业务的发起方,负责生产消息传输给broker,
Consumer:消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理
Topic:主题,发布订阅模式下的消息统一聚集地,不一样生产者向topic发送消息,由MQ服务器分发到不一样的订阅 者,实现消息的广播
Queue:队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收
Message:消息体,根据不一样通讯协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输
Mq经常使用协议
AMQP协议
AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不一样产品,不一样开发语言等条件的限制。
优势:可靠、通用
MQTT协议
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通信协议,有可能成为物联网的重要组成部分。该协议支持全部平台,几乎能够把全部联网物品和外部链接起来,被用来当作传感器和致动器(好比经过Twitter让房屋联网)的通讯协议。
优势:格式简洁、占用带宽小、移动端通讯、PUSH、嵌入式系统
STOMP协议
STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。STOMP提供一个可互操做的链接格式,容许客户端与任意STOMP消息代理(Broker)进行交互。
优势:命令模式(非topic\queue模式)
XMPP协议
XMPP(可扩展消息处理现场协议,Extensible Messaging and Presence Protocol)是基于可扩展标记语言(XML)的协议,多用于即时消息(IM)以及在线现场探测。适用于服务器之间的准即时操做。核心是基于XML流传输,这个协议可能最终容许因特网用户向因特网上的其余任何人发送即时消息,即便其操做系统和浏览器不一样。
优势:通用公开、兼容性强、可扩展、安全性高,但XML编码格式占用带宽大
RabbitMq与kafaka选型比较
https://blog.csdn.net/yifansj/article/details/79248586
架构方面:
Kafaka是正常的mq架构,包括provider broker consumer。,kafaka没有消息确认机制
rabbitMq 中的broker由exchange、binder queue三部分组成,其中exchange和binding组成了消息的路由键;客户端Producer经过链接channel和server进行通讯,Consumer从queue获取消息进行消费,rabbit有消息确认机制
吞吐量方面:
Kafaka采用zero-copy方式,即数据存储和获取是本地磁盘顺序批量操做,具备O(1)复杂度,数据处理效率很高
RabbitMq在吞吐量方面不如kafaka,RabbitMq支持对消息可靠的传递,支持事务,不支持批量的操做。
可用性方面
Kafaka的broker采用主备模式,因此可用性很高
RabbitMq支持miror queue,主queue失效,minor queue生效
集群负载方面
Kafaka使用zookeeper实现负载均衡,zookeeper管理集群中的broker sonsumer,经过zookeeper的协调机制,producer会记录topic对应的broker,对broker进行轮询或者随机访问broker,实现负载均衡
RabbitMq须要单独自定义负载均衡
通常推荐使用mq,例如RabbitMq,activeMq等,已经比较成熟和稳定了,性能也通常,通常推荐使用这些。Redies适用于在内存中存储数据库,做为消息队列可靠性较差,并且依赖于网络IO;kafaka设计的初衷是日志统计分析,如今也能够配合zookeeper用于消息
https://blog.csdn.net/h2604396739/article/details/81136527