RabbitMQ

作者: 养一只tom猫 | 来源:发表于2020-04-24 19:56 被阅读0次

    什么是消息队列:用于服务间进行异步通迅(传递数据)的组件。

    什么时候使用消息队列:需要同步等待,不能及时给用户结果时。不需要返回数据时。

    1. Mq的优势和劣势

    优势:

    1. 应用解耦:

    比如A系统要调用B,C系统,如果直接采用远程调用的方式,A系统完成了某一个操作后别的系统也需要对自己数据库进行操作,B系统有异常A系统也可能会出现异常(RabbitMQ有容错机制可解决)。

    如果此时A系统还需要调用D系统,或者不需要调用B系统了,此时则需要去修改代码。如果使用MQ,A系统做完一个操作后,只需要使用MQ发送一条消息,别的系统如果需要在A系统完成操作后做出对应的操作只需要声明一个队列接收消息即可。如此便达到了应用解耦。提高了系统容错性,可维护性。

    2. 异步提速

    比如A系统要调用B,C,D系统,如果直接采用远程调用的方式,A系统要等待C系统和D系统,如果使用MQ只需要发送消息,A系统不管C,D系统执行成功与否,只需要发送消息出去即可,如果C、D系统出现异常那么过一段时间再拿出消息进行消费即可。提高了系统的吞吐量。

    3. 削峰填谷

    比如A系统突然有一个秒杀活动,请求瞬间增多。如果使用MQ,只需要把用户请求发送到MQ再到A系统,A系统只需要每秒固定从MQ拉出自己能承受的请求处理即可。可以提高系统稳定性。

    劣势:

    1. 系统复杂度提高

    如何保证消息不被重复消费,怎么处理消息丢失情况,如何保证顺序成为新问题。

    2. 一致性问题

    比如A系统要调用B,C,D系统,BC处理成功,D失败,如何保证消息数据处理的一致性。

    2. RabbitMq简介

    rabbitmq中的exchange交换机是用来分发消息的。

    queue队列是用来接收(存储)消息的。

    exchange和queue之间有绑定的关系,生产者在投递消息的时候要指定路由规则,交换机进行消息投递的时候会找匹配路由规则的队列进行投递,从而消费者拿到消息。

    RabbitMQ是基于AMQP协议使用erlang(二郎神)语言开发的一款消息中间件。

    AMQP 与 JMS 区别

    JMS是定义了统一的接口,来对消息操作进行统一;

    AMQP是通过规定协议来统一数据交互的格式;

    JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的;

    JMS规定了两种消息模式;而AMQP的消息模式更加丰富;

    这本来就是两种东西。

    RabbitMQ有六种工作模式,常用的有五种:

    简单模式:

        生产者发送消息到指定的队列,消费者监听此队列拿到消息。

        简单模式中没有使用到交换机,并且简单模式下只有一个消费者。

    工作队列模式:

        一个生产者发送消息到一个队列,可以由多个消费者监听。

    广播模式:

        一个生产者发送消息到交换机,可由绑定了此交换机的队列监听,没有路由规则。

    定向模式:

         一个生产者指定路由规则发送消息到交换机,可由绑定了此交换机并且路由规则一致的队列监听。

    通配符模式:

        与定向不同的是通配符模式的路由规则中可以使用通配符,*匹配一个单词,#匹配0个或多个单词。

    消息可靠性投递(解决消息丢失、重复发送)

    RabbitMq整个消息投递的过程为:

        生产者---->RabbitMq---->exchange---->(通过路由key匹配)---->queue---->消费者

    confirm确认模式:需要在配置文件开启确认模式。

    定义ConfirmCallBack回调函数,可以对成功或失败做相应处理,不管成功还是失败都会触发此回调函数。

    Confirm CallBack回调函数中有一个ACK参数,值为true则发送成功,反之失败。

    在回调函数中的所有参数都不包含消息体内容。失败后如何处理成为问题?

    那么具体失败可如何解决?给消息一个唯一key,然后把发送消息的所有内容(包括路由key,消息内容,交换机等)存入redis,失败后从redis中拿出内容重新发送。

    return退回模式:消息发送给交换机后,只有交换机路由到queue失败时,才会执行ReturnCallBack,需要在配置文件开启该模式。(只有失败时才会执行)

    RabbitMq提供了事物机制,但是性能较差,不建议使用。

    Consumer ACK

    手动确认:可以防止消费者丢失消息(不会因为异常而丢失)。

        手动确认可以设置出现异常重回队列,设置重试时间,设置最大重试次数。

    自动确认:不建议使用,如果消费中出现异常消息就丢失了。(默认是自动确认)

    相关文章

      网友评论

          本文标题:RabbitMQ

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