一.MQ引言
1.1MQ是什么?
MQ(Message Quene),翻译为消息队列,通过典型的生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断从队列获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,轻松实现系统间解耦。
别名:消息中间件,通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
1.2MQ有哪些?
ActiveMQ,RabbitMQ,kafka(Apache),RocketMQ(阿里)等。
1.3不同MQ的特点
ActiveMQ
ActiveMQ是Apache出品的最流行的,完全支持JMS(Java Message Service)的消息中间件,有丰富的API,但是性能受限,吞吐量并不高。
Kafka
Kafka目前属于Apache下的顶级项目,它追求高吞吐量,追求高效率。设计之初是为了用在大数据领域做日志的收集和传输,但是对消息的事务,一致性方面并没有很好。
RocketMQ
RocketMQ属于阿里的开源消息中间件,纯Java编写的,具有高吞吐,高可用的特性,它的设计起源与kafka,但并不是对kafka的copy,它对消息的可靠传输以及事务做了优化。目前被应用到阿里集团的交易,充值,流计算,消息推送,日志流处理等场景。
开源版本已经交给Apach托管,但是不支持事务,需要购买其官方版本才提供这个服务。
RabbitMQ
使用Erlang语言(1991年由爱立信公司提出的第一个版本,目前适用于linux,windows,unix等主流系统)开发,处理并发时性能不错,而且基于AMQP协议
可以和spring框架做默认对接,spring框架默认支持RabbitMQ
最重要的一点是RabbitMQ对数据的一致性,稳定性和可靠性支持性很高
数据一致性:RabbitMQ > kafka
吞吐量: kafka > RabbitMQ
二.RabbitMQ是什么?
1.RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
一些基础的应用场景:①:登录/修改密码 成功,登录用户要收到短信 1对1
②:淘宝/京东下订单后,通知库房,积分变动,物流系统等等,一对多
③:日志系统:对于info,warning,error不同级别日志系统的处理。
2.RabbitMQ的几种模型 https://www.rabbitmq.com/
三.多种模式
1.点对点模式
2.工作队列模式
默认平均分配,若要实现能者多劳的效果,需要
①:关闭自动确认 channel.basicConsume("work", false, new DefaultConsumer(channel) {}
②:channel.basicQos(1);//一次只接收一条消息
③:channel.basicAck(envelope.getDeliveryTag(), false);//每次执行完任务手动确认
3.发布订阅模式
订阅了此channel的队列都能收到消息
4.Routing之订阅模型(direct)
在不同的场景下,我们希望不同的消息被不同的队列消费,这时就用到Direct类型的Exchange。
在Direct模型下:
①:队列与交换机的绑定不能再是任意绑定了,而是要指定一个RoutingKey(路由key)
②:消息再向交换机发送消息时,也必须指定消息的RoutingKey
③:交换机不再把消息交给每一个绑定的队列,而是根据路由key进行判断,只有消息的路由key与队列的路由key完全一致,才会接收到消息
5.Routing之订阅模型(Topic)
Topic类型的交换机和Direct类型的相比,都可以根据RoutingKey把消息路由到不同的队列,只不过Topic类型的交换机在定义RoutingKey的时候支持使用通配符。
*:代表匹配一个 例如:user.info.save user.info.delete 都可以被RoutingKey为 *.info.*的交换机接收到
#:代表匹配多个 例如:user.info.save user.info user 都可以被RoutingKey为 user.#的交换机接收到