向程序员靠近:自我学习记录-RabbitMQ

RabbitMQ

RabbitMQ

MQ: Message Queue(消息队列,也叫消息中间件),遵守JMS规范。
RabbitMQ:是实现了高级消息队列协议(AMQP)的开源消息代理软件(面向消息的中间件)。类似于数据库,需要独立部署在服务器上的一种应用,提供接口给其他系统调用。

  1. 为什么要使用消息队列?
    解耦:传统模式中,当其他系统需要消息接入时,原系统A需要更改代码,每接入一个系统都需要修改一次;中间件模式中,会将消息写入消息队列,需要消息的系统自己从消息队列中订阅,不再修改原系统A中的任何代码。

    异步:传统模式中,非必要的业务逻辑同步进行,费时间;中间件模式中,会将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度。

    削峰:传统模式中,并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常;中间件模式中,请求放入消息队列中,系统按数据库能处理的并发量,从消息队列中拉取消息。

  2. 使用消息队列的缺点?注意事项?
    使用消息队列导致 1 系统可用性低, 因为消息队列如果出问题,那整个系统也会出现问题; 2 系统复杂性增大,因为要考虑到:保证消息不被重复、可靠传输等问题。

  3. 看到的 消息中间件面试题:消息丢失怎么办?
    网上看到的图解:
    在这里插入图片描述

(1)生产者弄丢数据(消息在传输过程中丢失):
可以使用RabbitMQ提供transaction和confirm模式来确保生产者不丢消息。
transaction:发送数据前开启事务,如果消息没有成功被RabbitMQ收到此时生产者会受到异常报错,事务回滚。
confirm:在每次写的消息都会分配一个唯一的 ID,如果成功写入RabbitMQ 中,RabbitMQ 会给传回一个 ack 消息,使生产者知道消息已经成功进入队列,如果没能处理这个消息,则会回传一个Nack消息,可以进行重试操作。(推荐使用)

(2)消息队列弄丢数据
必须开启 RabbitMQ 的持久化,也就是说消息会自动持久化磁盘,如果过程中消息队列阵亡了,那么它恢复之后会自动读取之前存储的数据。
持久化方法
1、将queue的持久化标识durable设置为true,代表是一个持久的队列
2、发送消息的时候将deliveryMode值 设置为 2
(3)消费者弄丢数据
采用手动确认消息

消息中间件的组成

1、生产者、消费者、消息
Producer
消息生产者,业务的发起方,负责生产消息传输给broker,
Consumer
消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理
Message
消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输
2、Broker
消息服务器,作为server提供消息核心服务

3、队列
队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收
4、交换器、路由键、绑定键
(1)交换机exchange:相当于一个具有独立进程的应用程序,接受生产者发送的消息,并根据Binding规则将消息路由给服务器中队列。
–Direct:直接交换机,将交换机和队列进行绑定,当生产者发送消息到队列时,通过消息header中携带的Routing Key与队列进行匹配再放到队列中。允许队列与交换机绑定的键名相同。
–Topic:主题式交换机,队列与交换机绑定的key方式使用模式匹配方式绑定,绑定的关键字(key)用另个或多个标记构成,每个标记之间用"."间隔
,*号匹配一个词组,#号匹配零个或多个词组。
–Fanout:广播式交换机,交换机与队列进行绑定,没有路由key,只要队列跟交换机绑定,生产者发布的消息会发不到所有队列中,它具有一个路由表,即以key路由键-value路由,形式存储的表。
(2)绑定 Binding:也叫路由规则,联系Exchange和Message Queue。
5、消息通道Channel:客户端与broker在TCP连接后,需要为Connection创建Channel,AMQP协议规定只有Channel才能执行AMQP的命令。

消息中间件常用协议

AMQP协议:Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。
MQTT协议
STOMP协议
XMPP协议
其他基于TCP/IP自定义的协议

消息队列的使用过程大概如下:

(1)客户端(生产者)连接到消息队列服务器,打开一个channel。
(2)客户端声明一个exchange,并设置相关属性。
(3)客户端声明一个queue,并设置相关属性。
(4)客户端使用routing key,在exchange和queue之间建立好绑定关系。
(5)客户端投递消息到exchange。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值