rabbitmq入门

一,消息中间件

消息中间件(message queue middleware,简称mq)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。

作用:
1. 解耦
2. 冗余(存储)
3. 扩展性
4. 削峰
5. 可恢复性
6. 顺序保证
7. 缓冲
8. 异步通信

rabbitmq是采用erlang语言实现的amqp(advanced message queuing protocol,高级消息队列协议)的消息中间件,它最初起源于金融系统,用于在分布式系统中存储转发消息。


二,rabbitmq

rabbitmq整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。
从计算机术语层面来说,rabbitmq模型更像是一种交换机模型。
这里写图片描述

相关概念

producer:生产者。
生产者创建消息,然后发布到rabbitmq中。消息一般可以包含2个部分,消息体和标签,消息体也可以称之为payload。

consumer:消费者。

broker:消息中间件的服务节点。
对于rabbitmq来说,一个rabbitmq broker可以简单地看做一个rabbitmq服务节点,或者rabbitmq服务实例。

queue:队列。

exchange:交换器。

RoutingKey:路右键。
生产者将消息发给交换器的时候,一般会指定一个RoutingKey,用来指定这个消息的路由规则,而这个RoutingKey需要与交换器类型和绑定键(BindingKey)联合使用才能最终生效。

binding:绑定。
rabbitmq中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键(BindingKey),这样rabbitmq就知道如何正确地将消息路由到队列。

BindingKey是Exchange和Queue绑定的规则描述,这个描述用来解析当Exchange接收到消息时,Exchange接收到的消息会带有RoutingKey这个字段,Exchange就是根据这个RoutingKey和当前Exchange所有绑定的BindingKey做匹配,如果满足要求,就往BindingKey所绑定的Queue发送消息,这样我们就解决了我们向RabbitMQ发送一次消息,可以分发到不同的Queue的过程。

Channels: 虚拟连接。它建立在上述的TCP连接中。数据流动都是在Channel中进行的。也就是说,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel。
那么,为什么使用Channel,而不是直接使用TCP连接?
对于OS来说,建立和关闭TCP连接是有代价的,频繁的建立关闭TCP连接对于系统的性能有很大的影响,而且TCP的连接数也有限制,这也限制了系统处理高并发的能力。但是,在TCP连接中建立Channel是没有上述代价的。对于Producer或者Consumer来说,可以并发的使用多个Channel进行Publish或者Receive。有实验表明,1s的数据可以Publish10K的数据包。当然对于不同的硬件环境,不同的数据包大小这个数据肯定不一样,但是我只想说明,对于普通的Consumer或者Producer来说,这已经足够了。如果不够用,你考虑的应该是如何细化split你的设计。

交换器类型

rabbitmq常用的交换器类型有fanout、direct、topic和headers这四种。

fanout
它会把所有发送到该交换器的消息路由到所有与该交换器把绑定的队列中。

direct
它会把消息路由到那些BindingKey与RoutingKey完全匹配的队列中。

rabbitmq默认的exchange类型就是direct,但是默认的它比较特殊

The default exchange is implicitly bound to every queue, with a routing key equal to the queue name. It is not possible to explicitly bind to, or unbind from the default exchange. It also cannot be deleted.

就是,默认交换器,会把消息推送到名字跟routing key相同的queue中。

topic
它与direct类型交换器类似,也是将消息路由到BindingKey和RoutingKey相匹配的队列中,但是扩展了匹配规则。

headers
headers类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。

虚拟主机

每一个rabbitmq服务器都能创建虚拟的消息服务器,我们称之为虚拟主机(virtual host),简称vhost。每一个vhost本质上是一个独立的小型rabbitmq服务器,拥有自己独立的队列、交换器和绑定关系等,并且它拥有自己独立的权限。vhost就像是虚拟机与物理服务器一样,一个物理服务器上可以同时存在多个彼此隔离的虚拟机,各个实例间逻辑上分离,为不同程序安全保密地运行数据,无法将vhost1中的交换器与vhost2中的队列进行绑定。

rabbitmq默认创建的vhost是为“/”。

web管理

rabbitmq提供用于web管理的插件,安装插件后,访问rabbitmqip:15672可以看到rabbitmq的web管理页面,默认账密guest/guest


三,进阶

消费消息

1,推模式
2,拉模式

消费端的确认与拒绝

是否显示ack

mandatory参数

当mandatory参数设为true时,交换器无法根据自身的类型和路由键找到一个符合条件的队列,那么rabbitmq会将消息返回给生产者。

备份交换器

可以将未被路由的消息存储在rabbitmq中,再在需要的时候去处理这些消息。

过期时间(TTL)

TTL,time to live,即过期时间。rabbitmq可以对消息和队列设置TTL。

死信队列

DLX,全称为Dead-Letter-Exchange,死信交换器。当消息在一个队列中变成死信之后,它能被重新重新被发送到另一个交换器中,这个交换器就是DLX,绑定DLX的队列就称为死信队列。

消息变成死信一般是由于以下几种情况:
- 消息被拒绝,并设置requeue参数为false。
- 消息过期。
- 队列达到最大长度

https://blog.csdn.net/u013256816/article/details/54933065

延迟队列

延迟队列存储的对象是对应的延迟消息,所谓延迟消息是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。

优先级队列

优先级队列,具有高优先级的队列具有高的优先权,优先级高的消息具备优先被消费的特权。

生产者确认

如果在消息到达服务器之前已经丢失,持久化操作也解决不了这个问题,因为消息根本没有到达服务器,何谈持久化?

rabbitmq提供了两种解决方式:
- 通过事务机制实现。
- 通过发送方确认机制实现。

高可用

镜像队列

消息持久化

https://www.cnblogs.com/x-poior/p/6380064.html


三,参考

《rabbitmq实战指南》
Spring Boot中使用RabbitMQ
https://blog.csdn.net/column/details/14800.html?&page=1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值