RabbitMq总结

作者: Figo_OU | 来源:发表于2021-05-03 02:13 被阅读0次

    可以先在管理控制页面中配置好exchange和对应的queue。

    exchange各种模式对应的分发机制

    rabbitmq消息发送可靠性

    • 一般消息发送可靠性分为三个层级:最多一次,最少一次,恰好一次。
    • rabbitmq只支持最多一次或者最少一次。
      "最多一次"的方式,生产者随意发送,不可保证消息成功发送。
      “最少一次”实现:
    • 消息生产者开启事务机制(比较慢)
    • 确认机制。

    我们这里主要说一下确认机制。
    确认机制:

    • 生产者的确认机制。
      1.生产者在发送消息到rabbitmq之后, mq会发送确认消息给到我们的我们的生产者。
      2.如果step2或者step3发送消息失败。
      3.那么step4就不会执行。
      4.此时定时任务会判断status是否为0,若仍为0,就记录重发次数,并重新执行step2。
      5.若超过重试次数,则将status设置为2.这时候就只能等运维上班了。


      生产者确认机制

    消费者的确认机制:
    1.rabbitmq有手动确认和自动确认。
    2.自动确认:RabbitMq对消息的处理方式是默认自动应答。即无论消费者是否出现异常,都会给消息队列应答处理成功,消息队列删除消息,这时就会出现消息丢失的情况。
    3.手动确认:消费者在成功处理消息之后,会给mq发送一个ack,说明自己已经处理好该消息了。

    虽然rabbitmq的消息实现了可靠性,但消费者仍有可能接收到了两次的消息。例如:
    1.消费者在处理完消息之后,突然挂掉了。
    2.发送给mq的ack丢了。
    3.消费者在处理消息时,需要很长时间。mq认为消息处理失败。就会重新发送消息到消费者。

    面试题:1.怎么才能做到消息不被重复消费呢?
    我们是通过redis的分布式锁实现的。将当前服务名+订单id存到redis中。下次重复消息来,就到redis中看是否已经处理过。

    2.如何保证消息有序?
    场景:现在有对数据库同一条数据做增删查三个操作的消息,顺序的发送到mq上。如果此时有3个消费者都可以处理这些消息。那么有可能对数据库先执行了删除的操作。


    image.png

    解决方案:其实只要将要求顺序的消息都发送到同一个queue,确保只有一个消费者去处理这些消息就可以了。我们可以通过配置相同的路由键,然后bind对应的queue到exchange上就可以了。
    如下图,三个消费者是同一服务的不同节点,即消费者集群。我们配置多个queue,对应到不同的消费者节点,然后我们在发送的消息的时候,可以通过计算数据的id做hash计算后模3求出index,然后发送到对应index的queue上。


    保证消息有序

    3.消息积压问题如何解决
    1.消息积压一般是处理比较慢原因引起的,之前遇到过积压是因为在高并发的代码段中,加入了数据校验的逻辑,用到了数据库io。所以一般是优化业务代码即可。
    2.线上环境的消息积压:
    内心OS:这tm就难搞咯。
    先处理好导致处理慢的逻辑,然后做临时的水平扩容,加快处理效率。
    如果消息准备就要过期了,就只能想办法将数据迁移的本地文件中。

    相关文章

      网友评论

        本文标题:RabbitMq总结

        本文链接:https://www.haomeiwen.com/subject/zhgzrltx.html