Rabbitmq简单介绍

先上流程图:
Rabbitmq简单介绍_第1张图片

  1. publisher 消息的生产者

  2. consumer 消费者

  3. exchange 交换器
    交换器的三种类型

    1. direct(完全匹配)
      direct形式生产者会将消息发送到跟消息路由键完全一样的队列上,就是消息的路由键跟队列的路由键完全匹配,然后消费者消费这个队列的这条消息。
      Rabbitmq简单介绍_第2张图片

    2. topic (主题,规则匹配)
      topic类型的交换器会跟据生产者的路由键路由到一个或多个queue上,更加灵活,其实就是路由键用了正则表达式进行匹配
      Rabbitmq简单介绍_第3张图片

    3. fanout(广播)
      direct和topic类型的交换器原理都是交换器根据路由键去找到响应队列,消费者再消费指定这个队列的消息,而fanout模式的交换器不关系路由键,生产者将消息发送到交换器,只要队列绑定了这个交换器,交换器就会将消息分发到这个队列,消费者再消费这个队列的消息,简而言之,fanout类型交换器更简单,省略了路由键,全范围的送法消息给队列
      Rabbitmq简单介绍_第4张图片
      Rabbitmq简单介绍_第5张图片

    4. 交换器总结:比如生产者有三个消息,路由键分别是user.log.info、user.log.warn、user.log.error,direct类型的交换器只能根据路由键精确匹配到一个队列,而topic类型的交换器可以根据用正则表达式匹配到多个队列。fanout模式则是生产者发送消息到一个交换器,而队列绑定了这个交换器就会接受到消息,不关心路由键。生产者需要指定交换器,路由键,消费者需要指定交换器路由键和队列(当然fanout模式不需要指定路由键)。

  4. connection tcp连接

  5. channel 一个tcp连接中包含多个信道,tcp每次连接需要三次握手,channnel不需要,节省时间

  6. broker 搭建的rabbitmq服务器

  7. virtual host 自己在管理台创建的虚拟主机,就相当于一个小型的rabbitmq服务器

  8. 大致流程:rabbitmq一共分为三块,生产者,rabbitmq服务器,消费者,生产者生产数据,交给virtual host中的交换器,交换器再转给队列,其中交换器是通过路由键跟queue进行绑定的,队列通过channel把message传给consumer。

  9. 消息的持久化,保证消息完整性

    1. 把autoDelete属性(是否是一个可删除的临时队列)的值改为false
      autoDelete属性
      1. @Queue:当所有的消费者客户端连接断开后,是否自定删除队列
        true:删除,false:不删除
      2. @Exchange:当所有的绑定队列都不再使用时,是否自动删除交换器
        true:删除,false:不删除
    2. 场景:消费端服务消费了几个消息之后宕机,然后重启服务之后,又可以继续续接上消费队列中的消息,没有出现消息丢失现象。
  10. ACK确认机制
    1. 概念:ACK (Acknowledge Character)即是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的 数据已确认接收无误。
    2. 引入原因:如果消息在处理过程中,消费者的服务器在处理消息时出现了异常,那么可能这条正在处理的消息就没有完成消息消费,数据就会丢失,为了确保数据不会丢失,RabbitMQ支持消息确认机制-ACK。
    3. 场景:ACK(Acknowledge Character)是消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ的,RabbitMQ接收到反馈信息后才会将消息从队列中删除。
    3.1 如果一个消费者在处理消息出现了网络不稳定,福区群异常等现象,会将消息重新放入队列中。
    3.2 如果在集群的情况下,RabbitMQ会立即将这个消息推送给这个在线的其他的消费者,这种机制保障了消费者在服务端故障的时候不会丢失任何的数据和任务
    3.3 消息永远不会从RabbitMQ中删除:只有当消费者正确发送ACK反馈后,RabbitMQ收到确认后,消息才会从RabbitMQ的服务中删除
    3.4 消息的ACK机制默认就是打开的

  11. ACK的注意事项
    如果忘记掉ACK,那么后果会比较严重,当Consumer退出时,Message会一直重复分发,然后RabbitMQ会占用越来越多的内存,由于RabbitMQ会长时间的运行,因此这个 内存泄漏 是致命的,我们可以通过设置重试次数来防止这个问题,在Consumer服务的application.properties中设置如下参数:

spring.rabbitmq.listener.simple.retry.enabled=true 
## 设置重试次数 
spring.rabbitmq.listener.simple.retry.max-attempts=5 
## 重试的间隔时间 
spring.rabbitmq.listener.simple.retry.initial-interval=5000

本文主要来自up主波哥带你学java关于rabbitmq的讲解,在此感谢。

你可能感兴趣的:(千山远行,rabbitmq,java,分布式)