RabbitMQ知识点总结

1、 常用端口: 5672 用于常规连接  5671用于TLS连接

2、队列

   (1)队列的长度是有限的,队列和消息由TTL(Time To Live   存活时间).这两个功能可以用于数据过期,并且可以设置队列最多可以使用多少资源。 这个功能可以设置消息的延迟加载(下面详细介绍)。

   (2)消息订阅: 队列是有序的消息集合,消息以FIFO方式进出队列(先进先出)

   (3)持久性: 声明队列的时候,第二个参数可以设置队列的持久性,如果为true则会将队列持久化到磁盘中,否则不持久化

                          队列的持久化并不使其中消息也持久化。所以要做到真正的高可靠性的持久化的办法是队列和消息都持久化

 3、 通道: 提供大部分的协议操作。

                   为了线程的安全不要共享通道,应该一个线程对应一个通道。尽量使用通道池 Spring AMQP中可以实现

4、 网络故障自动恢复过程

     连接恢复: 重新连接----恢复连接监听器 -----重新打开  通道 ----恢复通道监听器----恢复通道的basic.qos,发布者确认和交易设置

     拓扑恢复(恢复通道):重新声明交换器----重新声明队列-----恢复所有绑定----恢复所有消费者

5、多消费者时消息分发

     缘起:队列的优势就是并行处理,如果加压了大量的消息,就得增加消费者

    循环分发: 是按次序分发,比如有两个消费者,轮流给两个消费者发送消息。 消息:1 2 3 4 5 6   消费者1将接收到1 3 5   消费者2接收到 2 4 6 。两个消费者接收的消息数量是一样的。这样如果某些消息比较大,会导致一个消费者繁忙,另一个消费者空闲,造成资源浪费,也降低了速度。原因RabbitMQ 只是当消息进入队列时就分发出去,而没有查看每个工作者未返回确认信息的数量。

   公平分发: 消费者告诉mq一次只能发一个消息给我,当我给你返回消息确认时,你再给我发送下一个消息。这样就不会轮流分发了,mq会自动寻找空闲的消费者。 利用了消息确认机制

 6 消息确认机制

   为了保证消息不丢失,所以rabbitmq支持消息确认机制。mq给消费者发送一条消息,消费者处理完这个消息后,将会给mq返回一个消息确认: 我已经成功的处理完了,你可以删除它了。如果有其他消费者,就会将该条消息发送到其他消费者手中。

  但是这样可能会出现消息重复发送的问题,可以利用等幂处理

8、队列、消息持久化

    如果消费者挂掉了,可以利用消息确认机制保证消息的准确性。 但是服务器挂掉了,则会丢掉所有的队列和消息。所以就要使用到队列的持久化和消息的持久化,将消息和队列持久会到磁盘中。 

  如果一个消费者在返回确认消息前死亡,mq则认为该消息并没有完全处理完,将会把这条消息重新放入队列中,

9、实现消息的延迟加载

    使用队列的长度限制和消息存活时间(TTL)、两个队列。 生产者将消息发送到第一个队列中,该队列没有消费者去监听。给其设置过期时间,比如过我要将这个消息延迟60秒发送,则设置过期时间为六十秒,过了六十秒则该消息会被置入死信队列中,也就时第二个队列,死信队列时被消费者监听的,死信队列一有消息就会被消费者监听到。这样就实现了延迟处理。

   还有一种比较简单的方法,是使用一个延迟插件rabbitmq_delayed_message_exchange

10 rabbitmq的主要组成

connection 连接

channel 通道

exchange 交换器

bind 绑定 从交换器到队列的动态绑定的过程

queue 队列

监听器

生产者、消费者

11 rabbitmq的主要作用

    解耦、 削峰填谷、解决生产者和消费者的性能差

 

 

 

    

你可能感兴趣的:(java)