本文记载MQ的学习笔记。
可以参考转载链接,应该写的比我更准确更详细一点。
MQ:message queue
消息队列就是基础数据结构中的‘先进先出’的一种数据结构。
MQ一直就存在,不过随着微服务架构的流行,成了解决微服务之间问题的常用工具。
主要用来解决如下问题:
1,系统解耦;
2,流量消峰;
3,消息分发;
4,异步消息。
消息中间件的组成:
broker:消息服务器,作为server提供消息核心服务;
producer:消息生产者,业务发起方,负责生产消息传输给broker;
consumer:消息消费者,业务处理方,负责从broker获取消息并进行业务逻辑处理;
topic:主题。发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ分发到不同的订阅者,实现消息的广播;
queue:队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收;
message:消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输。
消息中间件模式分类:
1,点对点
PTP点对点:使用queue作为通信载体
功能:一个生产者P发送消息到队列Q,一个消费者C接收
生产者实现思路:
创建连接工厂connectionFactory,设置服务器地址127.0.0.1,端口号5672,设置用户名密码和virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,使用通道channel向队列中发送消息,关闭通道和连接。
消费者实现思路:
创建连接工厂connectionFactory,设置服务器地址为127.0.0.1,设置用户名密码和virtual,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,创建消费者并监听队列,从队列中读取消息。
2,发布/订阅:
pub/sub发布订阅(广播):使用topic作为通信载体
说明:queue实现了负载均衡,将producer生产的消息发送到消息队列中,由多个消费者消费。但一个消息只能被一个消费者接受,当没有消费者可用时,这个消息会被保存直到一个可用的消费者。
topic实现了发布和订阅,当你发布一个消息,所有订阅这个topic的服务都能得到这个消息,所以从1到n个订阅者都能得到一个消息的拷贝。
这个模式是消息队列中最重要的队列了,其他的都是在它的基础上进行了扩展。
功能实现:一个生产者发送消息,多个消费者获取消息(同样的消息),包括一个生产者,一个交换机,多个队列和多个消费者。
思路解读(重点理解):
1)一个生产者,多个消费者;
2)每一个消费者都有自己的一个队列
3)生产者没有直接发送消息到队列中,而是发送到交换机
4)每个消费者的队列都绑定到交换机上
5)消息通过交换机到达每个消费者的队列
注意:交换机没有存储消息功能,如果是消息发送到没有绑定消费队列的交换机,则消息丢失。
具体可看rabbitmq中的实例代码,就是采用该种模式。
消息中间件常用协议:
AMQP:advanced message queueing protocol:一个提供统一消息服务的应用层标准高级消息队列协议。
MQTT:message queueing telemetry transport:消息队列遥测传输。
STOMP:streaming text orientated message protocol: 流向文本定向消息协议。
XMPP:extensible messaging and prensence protocol:基于可扩展标记语言(XML)的协议.
其他基于TCP/IP自定义的协议。
常见消息中间件MQ介绍
1,RocketMQ:阿里系下开源的一款分布式、队列模型的消息中间件,原名metaq,主要用于订单交易系统。
具有如下特点:
能够保证严格的消息顺序;
提供针对消息的过滤功能;
提供丰富的消息拉取模式;
高校的订阅者水平扩展能力;
实时的消息订阅机制;
亿级消息堆积能力。
2,RabbitMQ:使用Erlang编写的一个开源的消息队列。本身支持很多协议:AMQP,XMPP,SQTP,STOMO,使得它变得非常重量级,更适合企业级的开发,对路由,负载均衡,数据持久化都有很好的支持。
3,ActiveMQ:Apache下的一个子项目。
4,Reidis:使用C语言开发的一个key-value的Nosql数据库,开发维护很活跃,虽然是一个key-value数据库存储系统,但是它本身支持MQ功能,所以可以完全当作一个轻量级的队列服务使用。但是,如果入队数据大小超过了10K,redis则慢的无法忍受,出队时,无论数据大小,redis都表现出非常好的性能。
5,Kafka:Apache下的一个子项目,使用scala实现的一个高性能分布式publish/subscribe消息队列系统。
6,zeroMQ :号称最快的消息队列系统,专门为高吞吐量/低延迟的场景开发,偏重于实时数据通信场景。但是开发人员需要自己组合多种技术框架,开发成本高。