• 面试题——RabbitMQ


    1.如何保证消息的幂等性?(如何避免消息重复投递

    生产端:

    在消息发送前,先查询数据库此消息是否被处理过。处理过则忽略、否则继续处理,并在处理完成后修改状态为已处理。

    消费端:

    每个消息都生成全局唯一ID业务ID(BizID),以确保能识别重复的消息。


     2.消息基于什么传输

    RabbitMQ是基于信道Channel)的方式进行数据传输的,几乎所有的RabbitMQAPI调用都必须通过Channel对象来实现,是客户端与RabbitMQ通信的基本单位,。信道是建立在真实TCP中的虚拟连接,每条TCP连接上的信道数量基本没有限制


    3.如何保证消息的有序性

    如果想保证消息的有序性就需要保证生产端和消费端都有序RabbitMQ生产端只需要发送消息就可以了,消息会按顺序发送,但如果有多个消费者,轮询机制下虽然消费者虽然获取消息时是有序的,但每个消费者处理消息的速度是不一样的,就会导致去执行时无序,所以要保证一个生产者一个队列一个消费者。


    4.使用RabbitMQ有什么好处

    削峰:把消息放进RabbitMQ能减轻系统压力,避免因高压而崩溃

    异步:允许将消息发放到队列然后执行其他任务,后续由其他服务来异步处理这些任务

    解耦:生产者和消费者独立运作,增强灵活性和可扩展性

    可靠性:提供持久化,确认机制和事务处理,确保消息的可靠性和完整性


    5.Rabbitmq的手动ACK自动ACK 

    自动ACK:消息一旦被接收,不论是否成功处理,消费者自动执行发送ACK

    手动ACK:消息被接收后,不会自动发送ACK,消费者需要手动调用ACK


    6.消息怎么路由? 

    路由:

    直连模式:通过routing key去寻找绑定的对应队列

    广播模式:无视routing key,将消息发送到所有绑定的队列上

    主题模式:可以使用统配符表示bingKey:’*'表示匹配一个单词, '#'则表示匹配没有或者多个单词。由此可以实现一个queue接收多个路由的消息。


    7.如何解决死循环

    死信队列:消息无法成功处理时,将消息发到死信队列中,避免无休止的循环重试。

    重试机制:在消费者设置最大重试次数,超过最大次数直接发到死信队列中。

    设置TTL:给消息设置最大生存时间,超过这个时间的消息发到死信队列。


  • 相关阅读:
    Azure - 机器学习:使用自动化机器学习训练计算机视觉模型的数据架构
    怎么快速入门一种编程语言
    SpringBoot(基础篇 ==> 详解yaml文件的使用
    NOIP普及组2006-2018初赛 2019 CSP-J1 2020 CSP-J1 完善程序题
    Sublime Text 3运行 Python文件出现中文打印乱码的解决方式
    【代码随想录】链表刷题
    使用Gson将Object转String出现\u003d 的原因
    计算机java项目|springboot校园一卡通
    蓝牙耳机什么牌子的好用?口碑比较好的国产蓝牙耳机推荐
    vue项目路由重定向之后匹配路由的问题
  • 原文地址:https://blog.csdn.net/LHR2575050945/article/details/139752947