rabbitmq使用体验【第一天】
RabbitMq是什么?
1.AMQP 协议
AMQP,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。
AMQP三层协议:
Module Layer:协议最高层,主要定义了一些客户端调用的命令,客户端可以用这些命令实现自己的业务逻辑。
Session Layer:中间层,主要负责客户端命会发送给服务器,再将服务端应答返回客户端,提供可靠性同步机制和错误处理。
TransportLayer:最底层,主要传输二进制数据流,提供帧的处理、信道服用、错误检测和数据表示等。
AMQP组件:
交换器(Exchange):消息代理服务器中用于把消息路由到队列的组件。
队列(queue):用来存储消息的数据结构,位于硬盘或内存中。
绑定(Binding):一套规则,告知交换器消息应该将消息投递给哪个队列。
2.RabbitMQ 核心组件
理解您的需求,这里是一个简洁的表格,详细描述了 RabbitMQ 中的核心组件及其功能:
组件 | 描述 |
---|---|
消息生产者(Producer) | 负责创建和发送消息到 RabbitMQ 服务器。生产者将消息发布到交换机(Exchange),而不是直接发送到队列。 |
消息代理服务器(Broker) | RabbitMQ 服务器充当消息代理,负责接收、路由和存储消息,确保消息从生产者传递到消费者。 |
交换机(Exchange) | 接收来自生产者的消息,并根据预定的规则(绑定键)将消息路由到一个或多个队列中。常见类型包括直接交换机、扇出交换机、主题交换机和头部交换机。 |
队列(Queue) | RabbitMQ 中的消息存储区域,用于暂存待处理的消息。消费者可以订阅队列并接收其中的消息。 |
消费者(Consumer) | 订阅队列并接收其中的消息。消费者通过消费者标签(Consumer Tag)与 RabbitMQ 建立关联,使用 ch.Consume 方法持续监听并消费队列中的消息。 |
3.信息发布流程
过程 | 描述 |
---|---|
消息发布 | 生产者通过 ch.Publish 方法将消息发布到指定的交换机上,消息包含路由键或绑定键。 |
消息路由 | 交换机根据消息的路由键或绑定键将消息路由到一个或多个绑定了该交换机的队列上。 |
消息存储和转发 | 队列接收到交换机路由过来的消息,并将其存储起来,等待消费者来处理。 |
消息消费 | 消费者通过 ch.Consume 方法持续监听队列中的消息,并在消息到达时进行处理,确认消息,或将处理结果发送回服务器。 |
代码编写指导
角色
rabbitmq----->银行营业厅
管道--------->不同业务窗口
交换机------>业务操作员
队列--------->银行账号
生产者/消费者
规则
1,生产者和消费者必须去银行营业厅在相应的业务窗口处理
2,除了面对面交易,生产者全权委派业务处理员处理
3,消费者必须在生产者对应的业务处理员上绑定银行账号
4,生产者和消费者互不相识,依赖业务操作员根据相互约定的凭证识别。
必要参数
ch.Publish()方法
参数 | 类型 | 描述 |
---|---|---|
exchange | string | 指定消息要发送到的交换机名称。如果设置为空字符串 "" ,则表示消息将直接发送到默认交换机(默认是名为 "" 的直连交换机)。 |
key | string | 路由键(Routing Key),用于将消息路由到合适的队列。交换机根据路由键将消息分发到绑定了该交换机并且路由键匹配的队列中。 |
mandatory | bool | 当设置为 true 时,如果交换机无法将消息路由到任何队列,则消息会被返回给生产者(Basic.Return)。如果设置为 false ,则直接丢弃消息。 |
immediate | bool | 当设置为 true 时,如果交换机无法将消息立即路由到队列,则消息会被返回给生产者(Basic.Return)。如果设置为 false ,则将消息存入队列中,等待消费者。 |
msg | amqp.Publishing | amqp.Publishing 结构体,包含了要发送的消息内容,例如消息的内容类型、消息体、消息的持久性等信息。 |
ch.Consume()方法
参数 | 类型 | 描述 |
---|---|---|
queue | string | 指定要消费的队列名称。 |
consumer | string | 消费者标识符,用于标识这个消费者。如果设置为空字符串 "" ,RabbitMQ 会自动生成一个唯一的消费者标识符。 |
autoAck | bool | 是否自动确认消息。如果设置为 true ,则消息一旦被消费者接收,RabbitMQ 就会自动确认消息,将消息标记为已处理。 |
exclusive | bool | 是否排他性。如果设置为 true ,则这个消费者会成为独占消费者,只有当前连接可以使用这个消费者。 |
noLocal | bool | 设置为 true 时,表示不接收自己发送的消息。在某些情况下可以避免消息回环。 |
noWait | bool | 设置为 true 时,表示不等待服务器确认消费请求,直接开始消费。 |
args | amqp.Table | 可选的参数,用于设置消费者的其他属性,例如消息的优先级、超时设置等。是一个键值对的集合,类型为 amqp.Table 。 |
ch.QueueDeclare()方法
参数 | 类型 | 描述 |
---|---|---|
name | string | 队列名称。 |
durable | bool | 是否持久化。如果设置为 true ,则在服务器重启后,队列仍然存在。 |
autoDelete | bool | 是否自动删除。如果设置为 true ,当最后一个消费者取消订阅时,队列会自动删除。 |
exclusive | bool | 是否排他性。如果设置为 true ,则只有当前连接可以使用这个队列。其他连接不能访问这个队列。 |
noWait | bool | 设置为 true 时,表示不等待服务器确认队列声明操作完成,直接开始使用队列。 |
args | amqp.Table | 可选的参数,用于设置队列的其他属性,例如消息的超时、最大长度等。是一个键值对的集合,类型为 amqp.Table 。 |
实战
见官方文档
RabbitMQ 教程 - 发布/订阅 | RabbitMQ 中文
其他零碎知识点
必知必会 RabbitMQ面试题 33道(附答案)-腾讯云开发者社区-腾讯云 (tencent.com)
会 RabbitMQ面试题 33道(附答案)-腾讯云开发者社区-腾讯云 (tencent.com)](https://cloud.tencent.com/developer/article/1816305)