rabbitMQ

目录

1、什么是rabbitMQ?

2、为什么要使用rabbitMQ?

3、使用rabbitMQ的场景?

4、什么是消息?

5、什么是exchange?

6、什么是信道?

7、什么是broker?

8、如何确保消息正确的发送到rabbitMQ,如何确保消费者正确的消费了消息?

9、如何解决消息重复投递或者消息重复消费的问题?

10、消息基于什么传输?

11、常见的消息分发模式有哪几种?

12、rabbitMQ的缺点?

13、Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?

14、rabbitMQ是如何保证高可用的?

15、如何保证消息的可靠传输,消息丢失怎么办?


1、什么是rabbitMQ?

采用AMQP高级消息队列协议的一种消息队列技术,特点就是消费不需要确保提供方存在,实现了服务之间的高度解耦。

2、为什么要使用rabbitMQ?

围绕“解耦”、“异步、“削峰”聊

1、在分布式系统下,具有异步、削峰、负载均衡等高级功能

2、拥有持久化机制,进程中的消息,队列中的消息,可以保存下来

3、实现消费者和生产者之间的解耦

4、高并发场景下,利用消息队列可以使同步访问变成串行访问,达到一定限流作用

5、可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单。

3、使用rabbitMQ的场景?

1、服务间异步通讯

2、顺序消费

3、定义任务

4、请求削峰

4、什么是消息?

消息是不具名的,具有消息头和消息体。消息体是不透明的,消息头通常由可选的属性构成,如

路由键、相对于其他消息的优先权、是否需要持久化等

5、什么是exchange?

交互器,用于接收生产者发送的消息,并将这些消息根据分发策略路由至指定的队列。

6、什么是信道?

信道(channel),多路复用连接中的一条数据传输通道。信道是建立在TCP连接内的虚拟连接。对于系统来说,创建和销毁TCP连接都会产生较大开销。

7、什么是broker?

消息队列服务器实体。

8、如何确保消息正确的发送到rabbitMQ,如何确保消费者正确的消费了消息?

发送方确认模式

将信道设置成confirm模式,所有在信道上发布的消息都会被指派一个唯一的ID,

一旦消息成功投放到目标队列或者成功写入磁盘后,信号会发送一个确认给生产者,(确认消息中包含此ID),如果rabbitMQ内部发生错误导致消息丢失,会发送一条nack消息。

发送方确认模式是异步的

接收方确认模式

消费者每收到一条消息后都必须进行确认。只有消费者确认了消息,rabbitMQ才能安全的将消息从队列中删除。

rabbitMQ针对两种特殊情况的处理

1、消费者接受了消息,在发送确认之前断开了连接或者取消了订阅。

rabbitMQ会将该消息重新分发给下一个订阅的消费者。(这里就会存在消息重复消费的问题)

2、消费者接受了消息,连接没有断开,却一直没有确认消息

rabbitMQ会认为该消费者繁忙,将不会给他分发更多的消息。

9、如何解决消息重复投递或者消息重复消费的问题?

在消息生产时,MQ内部针对每条生产者生产的消息生成一个 inner-msg-id,作为去重的依据,避免重复的消息进入队列。

在消息消费时,要求消息体中必须包含一个bizId,作为去重的依据,避免重复消费。

1、基于数据库事务插入消息表

开启事务,插入消息表(必须要有业务上的唯一键),更新订单,提交事务

劣势:跨库问题

10、消息基于什么传输?

由TCP连接的创建和销毁开销大,并且并发数量受系统资源控制,会造成性能瓶颈。

所以rabbitMQ使用信道的方式来传输数据,信道是建立在真实TCP连接内的虚拟连接,且tcp连接上的信道数量是没有限制的。

11、常见的消息分发模式有哪几种?

1、fanout:  如果交换机接收到消息,会广播到所有绑定的队列上

2、direct:  路由键完全匹配策略

3、topic: 路由键模糊匹配策略

12、rabbitMQ的缺点?

1、系统可用性降低

2、系统复杂度提高

3、数据一致性问题

13、Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?

14、rabbitMQ是如何保证高可用的?

1、rabbitMQ有三种模式,单机模型,集群模式,镜像集群模式

普通集群模式,指多台机器启动多个rabbitMQ示例,每台机器启动一个。你创建的queue,只会存在于其中一个实例上,每个实例共享此队列的消息。

镜像集群模式,与普通集群模式的区别为 创建的queue,无论是元数据还是队列里的消息,每个实例都会保存一份。每次写消息,都会进行数据同步。

15、如何保证消息的可靠传输,消息丢失怎么办?

保证消息的可靠传输,从消息传输的三个阶段触发

1、保证生产者发送消息时不丢失

指:生产者发送消息的传输过程中由于网络等原因,造成消息丢失

解决办法: 

        ①、开启事务

 发送消息以后,如果rabbitMQ没有接收到,生产者会接收到异常报错,然后回滚事务,重发消息。接收到消息以后,会提交事务。

缺点:事务机制是同步的,太耗性能,吞吐量下降。

        ② 生产者开启confirm模式

每次写消息都会分配一个innner-msg-id,如果写入成功,rabbitMQ会返回一个ack,失败会返回一个nack。confirm模式是异步的,一般情况下,保证消息的可靠性,一般采用此方案。

2、保证rabbitMQ不丢失消息

解决办法: 开启rabbitMQ的持久化。

共分为两步  1、队列设置为持久化队列   2、 发送消息时将消息设置为持久化消息

一般情况下rabbitMQ持久化与confirm模式配合使用,只有当接收消息并持久化完成后才返回ack给生产者

3、保证消费者不丢失消息 

原因:多是由于采用的自动ack模式,当消费到消息,还没进行业务处理,结果进程挂了。

解决办法:采用手动ack模式,处理完业务后,再手动ack.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值