rabbitMq(1.工作模式)

RabbitMq学习小结

一:工作模式

rabbitMq(1.工作模式)

1.简单模式

一个消息队列一个发送者一个消费者

2.Work模式

A: 轮询分发Round-Robin(轮询)

  特点:一次性分发任务,每个消费者获得的任务是等量的。

   优点:可以轻易的并行工作,如果任务过多可以通过增加消费者来处理任务,系统的伸缩性更容易。

   缺点:每个消费者的任务数量是相等的,如果存在每个任务的工作量不一致,就会出现有的消费者一直处于繁忙状态,有的消费者处于闲置状态,因为在分发任务的时候,并不了解这些,有消息进来,rabbitmq只会根据消息数量公平分发,不会看消费者的应答情况。

B: 公平分发

  特点:任务是一个一个的派发,消费者处理完了给出响应才会继续派发下一个任务。

   优点:有效的解决的轮询分发中工作量不均等的问题,可以确保每个消费者的工作量相等。

   缺点:当消费者出现问题的时候,会出现消息积压的情况。

代码说明:

生产者:

// 同一时刻服务器只会发一条消息给消费者

    channel.basicQos(1);

消费者:

// 同一时刻服务器只会发一条消息给消费者

channel.basicQos(1);

// 监听队列,false表示手动返回完成状态,true表示自动

channel.basicConsume(WORK_QUEUE_NAME, false, consumer);

// 返回确认状态,注释掉表示使用自动确认模式            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);

   

/*声明队列  

          * 参数1:队列名称 

          * 参数2:设置是否持久化。为 true 则设置队列为持久化。持久化的队列会存盘,在 服务器重启的时候可以保证不丢失相关信息。

          * 参数3:设置是否排他。为 true 则设置队列为排他的。如果一个队列被声明为排 他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除。这里需要注意 三点:排他队列是基于连接( Connection) 可见的,同 个连接的不同信道 (Channel) 是可以同时访问同一连接创建的排他队列; "首次"是指如果 个连接己经声明了 排他队列,其他连接是不允许建立同名的排他队列的,这个与普通队列不同:即使该队 列是持久化的,一旦连接关闭或者客户端退出,该排他队列都会被自动删除,这种队列 适用于一个客户端同时发送和读取消息的应用场景。

          *   参数4:设置是否自动删除。为 true 则设置队列为自动删除。如果一直没有消费者连接这个队列,不会自动删除;如果有消费者连接这个队列,当所有消费者都断开连接的时候,会自动删除。(当队列的消息没有被消费时,不会删除;当消息消费了,且消费者都断开了,会自动删除)

          * 参数5:设置队列的其他一些参数,如 x-rnessage-ttl 、x-expires 、x-rnax-length 、x-rnax-length-bytes、 x-dead-letter-exchange、 x-deadletter-routing-key 、 x-rnax-priority 等。

          */

        channel.queueDeclare(WORK_QUEUE_NAME, false, false, false, null);

/*参数1:交换机名称

             *参数2:队列名称,路由关键字

             *参数3:消息路由头等的其他属性

             *参数4:消息内容

             */

            channel.basicPublish("", WORK_QUEUE_NAME, null, message.getBytes());

 

rabbitMq(1.工作模式)

 

3. 消息的确认模式

模式1:自动确认

只要消息从队列中获取,无论消费者获取到消息后是否成功消息,都认为是消息已经成功消费。

rabbitMq(1.工作模式)

 

模式2:手动确认

                   消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。

rabbitMq(1.工作模式)

 

    图1:消费者只消费没有反馈消息状态

rabbitMq(1.工作模式)

图2:消费者只消费没有返回状态,然后断开连接

rabbitMq(1.工作模式)

图3:消费者消费且确认状态

rabbitMq(1.工作模式)

 

4.订阅模式(fanout)

 

rabbitMq(1.工作模式)

1.解析:

a、1个生产者,多个消费者

b、每一个消费者都有自己的一个队列

c、生产者没有将消息直接发送到队列,而是发送到了交换机

d、每个队列都要绑定到交换机

e、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的

2.注意:

a.一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费

       b. 消息发送到没有队列绑定的交换机时,消息将丢失,因为,交换机没有存储消息的能力,消息只能存在在队列中。

测试结果:

    同一个消息被多个队列获取。一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费到消息。

3.代码

   a.生产者

         rabbitMq(1.工作模式)

b.消费者

rabbitMq(1.工作模式)

4.特点分析

    a.一个生产者,多个消费者

5.路由模式(direct)

rabbitMq(1.工作模式)

1.解析:

    a:生产者向交换机发送消息,并给指定消息的key

b:消息者根据业务场景,绑定对应的消息key

c:一个队列可以绑定多个消息key

d:交换机如果没有队列与其绑定,消息将会丢失

e:交换机有队列与其绑定,但是没有消费者,消息不会丢失

2.特点分析:

       a:一个消息只能由一个消费者消费

3.代码

       生产者:

       rabbitMq(1.工作模式)

    消费者:

    rabbitMq(1.工作模式)

 

6.主题模式(通配符模式)

    rabbitMq(1.工作模式)

rabbitMq(1.工作模式)

1.解析:

    1. 主题模式与路由模式相似,都是根据消息key来消费消息
    2. 主题模式的两个符合

①*(星号)仅代表一个单词
②#(井号)代表任意个单词

举例:update.* 可以获取到生产者发出的key为  update.1   update.2 等消息

          Update.# 可以获取到生产者发出的key为  update.1  update.1.1.1.1  等消息

2.特点分析:

    1. 可以定义一类消息,将key灵活运用

3.代码

生产者:

rabbitMq(1.工作模式)

消费者:

rabbitMq(1.工作模式)

 

参考链接:https://blog.****.net/hellozpc/article/details/81436980