• RabbitMQ:实践经验与常见问题


    保证消息可靠性

    生产者发送消息到broker的可靠性

    服务端确认机制

    • channel设置为事务模式(transaction模式):缺点:阻塞、性能下降;消耗额外的性能,不建议生产环境使用。
    • confirm模式:waitForConfirm(),发送成功后会confirm;可以批量确认,提升性能;还可以异步确认,边发送边确认。

    交换机的可靠性(路由保证)

    • mandatory设置成true,并添加ReturnListener,假如路由失败会收到回调消息(假如mandatory为false,路由失败会丢弃消息)。
    • 设置交换机的备份交换机。路由失败的时候会到对应的备份交换机。

    队列的可靠性

    • 队列持久化
    • 交换机持久化
    • 消息持久化
    • 集群

    消费端的可靠性

    消费者确认机制

    • ACK机制,默认自动确认(接收到消息就确认,并不管后面的处理逻辑),可以设置成手动确认。

    防止重复消费消息

    为什么消息会重复?

    消费端回调响应:假如生产者未收到回调,重发(重发间隔、重发次数)。

    如何幂等处理消息

    业务消息必须有唯一的业务id,消息id。即msgId、bizId。
    数据库中的唯一业务id保证幂等。
    redis存消息id保证幂等。

    保证服务可靠

    RabbitMQ集群

    集群目的:高可用、负载拓展
    集群如何识别:通过erlang.cookie
    集群节点类型:disc(元数据存储在磁盘中)、RAM(元数据在内存中)。至少需要一个磁盘节点。

    • 普通集群

    • 镜像队列
      镜像队列会复制队列消息

    VRRP 虚拟路由冗余协议

    KeepAlived:负载、高可用

    资源管理

    谁来创建exchange、queue:消费者

    面试题

    消息队列的作用和使用场景

    削峰、异步、解耦

    Channel和vhost的作用是什么

    复用连接、vhost提升硬件利用率,资源隔离

    RabbitMQ有哪些路由方式,适合在什么场景使用

    Direct、Topic、Fanout、Headers

    交换机和队列、队列和消费者的绑定关系

    多对多

    无法被路由的消息去了哪里

    备份交换机;假如设置了mandatory为true,有回调消息;假如没其他措施,则会丢失

    消息在什么时候会变成死信

    消息被拒绝;消息到达过期时间;队列已满。

    RabbitMQ怎么实现延迟队列

    通过死信队列+TTL,消息过期后会到死信交换机中,进一步到达死信队列。

    消息丢失?

    发送者->交换机->队列->消费者,从整个链路分析

    一个队列最多可以存多少条消息

    取决于硬件配置,和最大数量参数。

    如何提高消费速率

    增加消费者

    如何动态创建消费者和队列

    在ListenerContainer设置消费者数量

    保证消息顺序性

    一个队列对应一个消费者

    消息堆积怎么处理

    寻找堆积的原因,代码问题重启。速率问题,优化代码。清空队列之后重发消息。

    MQ选型分析

    • 使用和管理
    • 性能:并发性,吞吐量,消息堆积能力
    • 功能
    • 可用,持久化,可靠性
  • 相关阅读:
    MongoDB简单使用
    mongodb安装部署
    分布式通信-序列化
    分布式通信协议
    分布式概念
    springboot-事件
    spring-事件
    spring-@Component/@ComponentScan注解
    springboot-Date日期时间问题
    enginx:基于openresty,一个前后端统一,生态共享的webstack实现
  • 原文地址:https://www.cnblogs.com/fcb-it/p/13406229.html
Copyright © 2020-2023  润新知