- 什么是mq?
mq简称消息队列(也叫消息中间件),通过生产者消费者模型实现系统间的解耦。生产者不断的向消息队列中去写一下信息,消息队列接收到消息会依次把消息放到队列中,日后通过消费者去消费生产者往队列中生产的消息。生产者无需关心消息是否被消费,消费者无需关心生产者有没有正常运行,整个过程没有任何api的侵入。整个过程是异步的。跨系统通信时首选消息队列。
- 市场上主流的消息中间件
老牌的Apache下的ActiveMQ、RabbitMQ、Apache下炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。
- 不同MQ特点
1.ActiveMQ
ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线,它是一个完全支持JMS规范的消息中间件。丰富的API,多种集群架构模式让ActiveMQ在业界成为老牌的消息中间件,在中小型企业颇受欢迎!
2.Kafka
Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输,0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,追求产生大量数据的互联网服务的数据收集业务。
3.RocketMQ
RocketMQ是阿里开源的消息中间件,它是纯java开发,具有高吞吐量、高可用性,适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算,消息推送、日志流式处理、binglog分发等场景。
4.RabbitMQ
RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
RabbitMQ比Kafka可靠,kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。
AMQP协议
AMQP(advanced message queuing protocol)在2003年时被提出,最早用于解决金融领域不同平台之间的消息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。这使得实现了AMQP的provider天然性就是跨平台的。以下是AMQP协议类型:
------------Server----------------
Virtual host(基本一个应用一个虚拟主机,类似于关系型数据库中的库,虚拟主机需要与用户进行绑定)
----------------------------------
---------------------------------------- Exchange
Publisher application---------生产消息------------> +-----------------------+
---------------------------------------- +-----------------------+
---------------------------------------- Message Queue
Consumer application<--------消费消息----------- +-----------------------+
---------------------------------------- +-----------------------+
以下协议可以理解为生产者先把消息发给Server(可以理解rabbitmq的一个节点,也就是一个rabbitmq服务器),生产者通过虚拟主机把消息发给交换机,交换机与队列之间进行绑定关系(点对点(一对一)、路由、发布订阅),消费者直接从队列中消费消息。
- rabbitmq安装
- 将rabbitmq安装包上传到linux系统中
erlang-22.0.7-1.el7.x86_64.rpm
rabbitmq-server-3.7.18-1.el7.noarch.rpm
- 安装erlang依赖包
rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm
- 安装rabbitmq安装包(需要联网)
yum install -y rabbitmq-server-3.7.18-1.el7.noarch.rpm
注意:默认安装完成后配置文件模板在:/usr/share/doc/rabbitmq-server-3.7.18/rabbitmq.
config.example目录中,需要将配置文件复制到/etc/rabbitmq/目录中,并修改名称为rabbitmq
.config
- 复制配置文件
cp /usr/share/doc/rabbitmq-server-3.7.18/rabbitmq.config.example /etc/rabbitmq/rabbit
mq.config
- 查看配置文件位置
ls /etc/rabbitmq/rabbitmq.config
- 修改配置文件(参见下图:)
vim /etc/rabbitmq/rabbtmq.config
61 行 %%{loopback_users, []},
去掉%%,以及最后的,逗号,修改为{loopback_users, []}
- 执行如下命令,启动rabbitmq中的插件管理
rabbitmq-plugins enable rabbitmq.management
出现如下说明:
Enabling plugins on node rabbit@localhost:
Rabbitmq_management
The following plugins have been configured:
Rabbitmq_management
Rabbitmq_management_agent
Rabbitmq-web_dispatch
Applying plugin configuration to rabbit@localhost...
The following plugins have been enabled:
Rabbitmq_management
Rabbitmq_management_agent
Rabbitmq_web_dispatch
Set 3 plugins.
Offline change: changes will take effect at broker restart.
- 启动rabbitmq的服务
启动:systemctl start rabbitmq-server
重启:systemctl restart rabbitmq-server
停止:systemctl stop rabbitmq-server
- 查看服务状态
systemctl start rabbitmq-server
- 关闭防火墙服务
从开机启动服务列表移除:systemctl disable firewalld
停止防火墙:systemctl stop firewalld
- 访问web管理界面
默认用户名/密码:guest/guest
- rabbitmq配置
1.服务启动相关
systemctl start|restart|stop|status rabbimq-server
- 管理命令行 用来在不使用web管理界面情况下命令Rabbitmq
rabbitmqctl help 可以查看更多命令
- 插件命令行
Rabbitmq-plugins enable|list|disable
- Rabbitmq的第一个程序
- AMQP协议的回顾
AMQP(advanced message queuing protocol)在2003年时被提出,最早用于解决金融领域不同平台之间的消息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。这使得实现了AMQP的provider天然性就是跨平台的。以下是AMQP协议类型:
------------Server----------------
Virtual host(基本一个应用一个虚拟主机,类似于关系型数据库中的库,虚拟主机需要与用户进行绑定)
----------------------------------
---------------------------------------- Exchange
Publisher application---------生产消息------------> +-----------------------+
---------------------------------------- +-----------------------+
---------------------------------------- Message Queue
Consumer application<--------消费消息----------- +-----------------------+
---------------------------------------- +-----------------------+
以下协议可以理解为生产者先把消息发给Server(可以理解rabbitmq的一个节点,也就是一个rabbitmq服务器),生产者通过虚拟主机把消息发给交换机,交换机与队列之间进行绑定关系(点对点(一对一)、路由、发布订阅),消费者直接从队列中消费消息。
- RabbitMQ支持的消息模型
- 引入依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.7.2</version>
</dependency>
- 第一种模式(直连,也就是点对点,使用rabbitmq默认交换机(代码里面是空字符串),生产者直接与队列绑定关系,这种模式一次只允许一个消费者消费,适用于登陆注册功能,比如注册成功之后啊,可能要在注册的过程中发短信,可以把业务代码放在当前系统,发短信放到消息队列中,由另外一个短信系统完成短信发送服务。)
在rabbitmq页面创建虚拟主机,然后创建相应用户,再把虚拟主机与用户进行绑定。
在上面的模型中,有以下概念:
- P:生产者,也就是要发送消息的程序;
- C:消费者:消费的接收者,会一直等到消息到来;
- queue: 消息队列,图中红色部分,类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从中取出消息;
- 生产者与消费者绑定的队列及其属性需要一模一样
channel.queueDeclare(“hello”,false,false,false,null);
不好的地方:消费者消费太慢,生产者不停的生产消息,消费者来不及及时处理,会导致队列里面的消息堆积。
1.开发生产者
//创建连接mq的连接工厂对象
ConnectionFactory connectionFactory = new ConnectionFactory();
//设置连接rabbitmq主机
connectionFactory.setHost(“10.15.0.9”);
//设置端口号
connectionFactory.setPort(5672);
//设置连接哪个虚拟主机
connectionFactory.setVirtualHost(“/ems”);
connectionFactory.setUsername(“ems”);