目录
前言
消息队列的作用
消息队列的结构
结构以及常见方案
连接
管道
生产者
交换机
队列
消费者
调用模式
简单队列
工作队列
发布订阅
路由模式
主题模式
远程调用
部署方式
单机模式
普通集群
镜像集群
Docker命令
一、前言
RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。
RabbitMQ是一个消息代理。它的工作就是接收和转发消息。你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处。在这个比喻中,RabbitMQ就扮演着邮箱、邮局以及邮递员的角色。
1. 消息队列的作用
解耦、异步、削峰
异步处理:相比于传统的串行、并行方式,提高了系统吞吐量。
应用解耦:系统间通过消息通信,不用关心其他系统的处理。
流量削锋:可以通过消息队列长度控制请求量;可以缓解短时间内的高并发请求。
日志处理:解决大量日志传输。
消息通讯:消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。
2. 消息队列的结构
生产者
交换机
队列
消费者
二、结构以及常见方案
golang包:"github.com/streadway/amqp"
1. 连接(Connection)
// 连接到RabbitMQ服务器conn, err := amqp.Dial("amqp://{user}:{password}@{ip}:{port(5672)}/")failOnError(err, "Failed to connect to RabbitMQ")defer conn.Close()
2. 管道(Channel)
// 配置连接套接字,它主要定义连接的协议和身份验证等ch, err := conn.Channel()failOnError(err, "Failed to open a channel")defer ch.Close()
3. 生产者(Producer)
1) 生产消息
ch.Publish({
exchange},{
routingKey},{
mandatory},{
immediate},{
publishing})
exchange 交换机名
routingKey 路由键
mandatory 强制性 建议false当mandatory标志位设置为true时,如果exchange根据自身类型和消息routingKey无法找到一个合适的queue存储消息,那么broker会调用basic.return方法将消息返还给生产者;当mandatory设置为false时,出现上述情况broker会直接将消息丢弃;通俗的讲,mandatory标志告诉broker代理服务器至少将消息route到一个队列中,否则就将消息return给发送者;
immediate 消息 建议false当immediate标志位设置为true时,如果exchange在将消息路由到queue(s)时发现对于的queue上么有消费者,那么这条消息不会放入队列中。当与消息routeKey关联的所有queue(一个或者多个)都没有消费者时,该消息会通过basic.return方法返还给生产者。
publishing 消息
DeliveryMode: amqp.Persistent 设置消息持久化
2)样例代码
q, err := ch.QueueDeclare( "hello", // name 定义队列名 true, // durable 定义是否持久化 false, // delete when usused false, // exclusive false, // no-wait nil, // arguments)......body := "持久化的 Hello W