RabbitMQ笔记

简单模式
生产者将消息发送到队列,队列采用轮询方式发送一至多个消费者处消费。队列将自动确认并标记发送发完毕的消息为垃圾,等待清理。

工作模式
在简单模式基础上增加,每次服务器发送给消费者消息数据条目限制,并且增加了消息确认模式。
channel.basicQos(1)  //消息条目限制
DeliverCallback deliverCallback = (consumerTag, delivery) -> {//需要更复杂的功能请看consumers类。
    String message = new String(delivery.getBody(), "UTF-8");
    System.out.println(" [x] Received2 '" + message + "'");
    channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);//消息确认
};
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> { });//持续监听

发布订阅模式:

增加了交换器功能,生产者将消息发送至交换器,由交换器负责将消息分发给绑定在该交换器的队列所有。如果两个消费者绑定了相同队列那么他们消费模式跟work模式一样。
发布订阅 fanout:如果交换器收到消息,将会广播到所有绑定的队列上
路由模式 direct:如果路由键完全匹配,消息就被投递到相应的队列
通配符 topic:通配符模式 采用*与#,*代表一个单词 #代表一个或多个单词

  • RabbitMQ通过TCP连接,连接认证通过后会建立一个AMQP信道,信道是建立在真实的TCP连接内的虚拟连接。AMQP命令都是通过信道发送出去,每条信道都会指派一个唯一ID。
  • 为什么不直接通过tcp连接发送命令,因为操作系统建立和销毁TCP会话是非常昂贵的开销。一条TCP连接上建立多少条信道是没有限制的。而TCP连接每秒也只能建立那么一点。
  • AMQP消息路由必须有三部分组成:交换器、队列、绑定。
  • 消费者对消息的确认和告诉生产者消息已经被接收是两件事毫不相关。如果收到消息确认之前从rabbitmq断开连接或者取消订阅,rabbit会认为这条消息没有分发,然后重新分发给下一个订阅者。如果消费者因为某些原因始终没有对消息进行确认,那么rabbit会认为消费者并没有准备好接收下一条消息。当检测到消息格式错误而任何一个消费者都无法出来的时候,可以使用reject的requeue参数,true=RabbitMQ重新发送给其他消费者,false=rabbitMQ会将消息放入“死信”(dead letter)队列,“死信”会存放被拒绝而不重入列队的消息。
  • 生产者与消费者都可以创建队列,但是消费者在同一条信道上订阅了另一个队列的话,就无法在声明队列。必须取消订阅,将信道设置为传输模式。声明一个已经存在的队列,如果所有参数与已经存在的相同那么rabbit返回成功,如果不同则声明失败。
  • 生产者与消费者都应该尝试创建队列,避免生产者将消息发布到黑洞中。
  • 匿名队列一般只针对1对1模式exclusive(排外),并且用完就删除队列auto-delete(自动删除)。
  • 避免你的消息丢失在于队列或交换器的durable(持久化)属性,默认为false,他决定了RabbitMQ是否需要在重新创建队列或者交换器。durable属性需为true。但是仍然可能会丢失数据,只有消息到达了持久化的交换器并且到达了持久化的队列才能保证不丢失,如果想消息想要从崩溃中恢复,需要满足三个条件,

1.必须投递模式为2;
2.到达持久化交换器;
3.到达持久化队列。

  • 持久过程:RabbitMQ将消息写入磁盘持久化日志->发布持久性消息到持久交换器->路由到持久化队列中(并确认了它)->RabbitMQ会将持久化日志中的这条小心标记为等待垃圾回收。其中如果任意一个节点不是持久化,那么RabbitMQ都会讲持久化日志中的该消息移除。
  • 消息持久化致使RabbitMQ每秒可处理的消息总数极大下降。持久化在集群中也会存在问题。
  • 消息重新投递会影响吞吐量。

保证消息传递性:事务,确认模式。

事务会降低RabbitMQ 2到10倍的吞吐量,会导致生产者与RabbitMQ产生同步。

Confirm确认模式,所在信道发布的消息都会被指派一个唯一的id号,一旦消息被投递给所有匹配的队列后,信道会发送一个发送方确认模式给生产者应用程序(包含消息的唯一id)。如果消息和队列是可持久化的那么确认消息只会在队列将消息写入磁盘后才会发出消息。

Confirm确认模式是异步执行的,对RabbitMQ性能影响几乎忽略不计。

你可能感兴趣的:(RabbitMQ)