RabbitMQ笔记
一、安装及配置RabbitMQ
1.注意事项
RabbitMQ是Erlang语言编写,所以Erang环境必须要有,Erlang环境一定要与RabbitMQ版本匹配。
2.安装及使用流程
- ①rpm -ivh erlang-21.3.8.9-1.el7.x86_64.rpm
- ②rpm -ivh socat-1.7.3.2-1.el6.lux.x86_64.rpm
- ③rpm -ivh rabbitmq-server-3.8.1-1.el7.noarch.rpm
- ④rabbitmq-plugins enable rabbitmq_management(启用管理插件)
- ⑤启动RabbitMQ
- systemctl start rabbitmq-server.service
- systemctl status rabbitmq-server.service
- systemctl restart rabbitmq-server.service
- systemctl stop rabbitmq-server.service
- ps -ef | grep rabbitmq(查看进程)
- systemctl stop firewalld.service(关闭防火墙)
- rpm -qa | grep rabbitmq
- rpm -e rabbitmq-server
- ⑥增加自定义账号
- 添加管理员账号密码:rabbitmqctl add_user admin admin
- 分配账号角色:rabbitmqctl set_user_tags admin administrator
- 修改密码:rabbitmqctl change_password admin 123456
- 查看用户列表:rabbitmqctl list_users
- ⑦访问 http://虚拟机ip:15672/
- 端口号:
- 5672:rabbitMq的编程语言客户端连接端口
- 15672:rabbitMq管理界面端口
- 25672:rabbitMq集群的端口
- 端口号:
3.docker 安装
- 下载镜像:
docker pull rabbitmq:management
- 创建实例并启动:
docker run -d -p 5672:5672 -p 15672:15672 -p 25672:25672 --name rabbitmq rabbitmq:management
二、RabbitMQ 相关概念
MQ:Message Queue,消息队列,应用程序之间的通信方法
MOM:Message Oriented Middleware,面向消息的中间件
主流实现方式:
- JMS:Java Message Service,java消息服务。java规范;只能使用java实现;只有两种消息模型。ActiveMQ
- AMQP:Advanced Message Queueing Protocol,高级消息队列协议。协议,只规定了数据格式;任何语言都可以实现;可以有任意多种。RabbitMQ
三个主要作用:
- 异步
- 解耦
- 削峰填谷
主流产品:
- ActiveMQ:Apache,基于JMSjava
- RabbitMQ:独立社区(spring) 基于AMQP实现 erlang
- RocketMQ:阿里开源 贡献给apache
- Kafka:Apache 追求吞吐量
RabbitMQ:
- Connection:链接
- Channel:管道 信道 默认一个链接只有一个信道
- Exchange:交换机,接受消息并转发消息
- Fanout:转发消息给所有队列
- Direct:指定RK,符合RK的队列可以获取消息
- Topic:通配符 *(匹配一个单词) #(匹配任意多个)
- Queue:队列,接受 转发 存储消息
- RoutingKey:路由键
- Producer:生产者,发送程序的应用程序
- Consumer:消费者,接受并消费消息的应用程序
避免消息堆积?
- 工作模型 配合 能者多劳:spring.rabbitmq.listener.simple.prefetch=1
- 多线程消费:spring.rabbitmq.listener.simple.concurrency=4
避免消息丢失?
- 生产者确认:spring.rabbitmq.publisher-confirm-type=none/simple/correlated
spring.rabbitmq.publisher-returns=true - 持久化:@Queue(“名称”)
- 消费者确认:spring.rabbitmq.listener.simple.acknowledge-mode=none/auto/manual
三、RabbitMQ的五种模式
- 简单模型(Simple):一个生产者 一个队列 一个消费者
- 工作模型(work queue):一个生产者 一个队列 多个消费者 消息只能被一个消费者消费,能者多劳(Fair Dispatch 公平分发):channel.basicQos(1)
- 发布订阅(publish/scribe):一个生产者 一个交换机 多个队列 每个队列有自己的消费者
- 路由模型(route):多了一个routingKey
- 通配模型(Topic)
四、Spring 整合RabbitMQ
- 创建spring-rabbitmq-producer生产者工程
- 添加依赖
- 创建rabbitmq.properties连接参数等配置文件
rabbitmq.host=192.168.162.100
rabbitmq.port=5672
rabbitmq.username=admin
rabbitmq.password=admin
rabbitmq.virtual-host=myhost
- 创建 spring-rabbitmq.xml 整合配置文件
<!--加载配置文件-->
<context:property-placeholder location="classpath:rabbitmq.properties"/>
<!-- 定义rabbitmq connectionFactory -->
<rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
port="${rabbitmq.port}"
username="${rabbitmq.username}"
password="${rabbitmq.password}"
virtual-host="${rabbitmq.virtual-host}"/>
<!--定义管理交换机、队列-->
<rabbit:admin connection-factory="connectionFactory"/>
<!--定义持久化队列,不存在则自动创建;不绑定到交换机则绑定到默认交换机
默认交换机类型为direct,名字为:"",路由键为队列的名称
-->
<rabbit:queue id="spring_queue" name="spring_queue" auto-declare="true"/>
<!-- ~~~~~~~~~~~~~~~~~~~~~~广播;所有队列都能收到消息~~~~~~~~~~~~~~~~~~~~~~ -->
<!--定义广播交换机中的持久化队列,不存在则自动创建-->
<rabbit:queue id="spring_fanout_queue_1" name="spring_fanout_queue_1"
auto-declare="true"/>
<!--定义广播交换机中的持久化队列,不存在则自动创建-->
<rabbit:queue id="spring_fanout_queue_2" name="spring_fanout_queue_2"
auto-declare="true"/><