3.RabbitMQ的简单介绍

RabbitMQ的简单介绍

前言

RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层保存这个数据。

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

通常我们谈到队列服务, 会有三个概念: 发消息者、队列、收消息者,RabbitMQ 在这个基本概念之上, 多做了一层抽象, 在发消息者和 队列之间, 加入了交换器 (Exchange). 这样发消息者和队列就没有直接联系, 转而变成发消息者把消息给交换器, 交换器根据调度策略再把消息再给队列。

相关概念

  1. Publisher:数据的发送方,生产者。

  2. Consumer:数据的接收方,消费者。

  3. Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。

    1. direct (直连):

      direct 类型的行为是"先匹配, 再投送", 即在绑定时设定一个 routing_key, 消息的routing_key 匹配时, 才会被交换器投送到绑定的队列中去.是RabbitMQ默认的交换机模式,也是最简单的模式,根据key全文匹配去寻找队列。

    2. topic (主题)

      按规则转发消息(最灵活) 转发消息主要是根据通配符,路由键由字符串用.隔开。

      符号“#”匹配0个或多个词,符号“*”匹配一个词

      因此“test.#”能够匹配到“test.asd.sadasd”,但是“test.*” 只会匹配到“test.irs”。(如果 binding key是 “#”,会接受所有的消息)

    3. headers (标题)

      不同于其他三种Exchange,它是根据Message的一些头部信息来分发过滤Message,忽略routing key的属性,如果Header信息和message消息的头信息相匹配,那么这条消息就匹配上了。

    4. fanout (分发)也有翻译为扇出的。

      会忽略routing key的存在,广播所有的消息(一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上)

  4. Queue:消息队列载体,每个消息都会被投入到一个或多个队列。

    构造函数详解:

    	public Queue(String name) {
    		this(name, true, false, false);
    	}
    

    name 队列名字

    	public Queue(String name, boolean durable) {
    		this(name, durable, false, false, null);
    	}
    

    durable 持久队列,如果true(该队列将在服务器重启后继续存在)反之不存在

    	public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete) {
    		this(name, durable, exclusive, autoDelete, null);
    	}
    
    	public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) {
    	}
    

    exclusive 独占队列,只有一个连接被使用,当连接关闭时队列将被删除

    autoDelete 如果为true那么在不使用队列时删除队列

    arguments (可选的;由插件和代理特定的功能(如消息TTL,队列长度限制等)使用)

    消息剩余生存时间【x-message-ttl】 统一设置队列中的所有消息的过期时间,例如设置10秒,10秒后这个队列的消息清零。也可以在发布消息的时候,单独为某个消息指定剩余生存时间,单位毫秒。

    队列自动过期时间【x-expires】 x-expires用于当多长时间没有消费者访问该队列的时候,该队列会自动删除,可以设置一个延迟时间,如仅启动一个生产者,10秒之后该队列会删除;或者启动一个生产者,再启动一个消费者,消费者运行结束后10秒,队列也会被删除。

    队列最大消息数目【x-max-length】 x-max-length:用于指定队列的长度,如果不指定,可以认为是无限长,例如指定队列的长度是4,当超过4条消息,前面的消息将被删除,给后面的消息腾位。

    队列存储所有消息的最大存储【x-max-length-bytes】 x-max-length-bytes: 用于指定队列存储消息的占用空间大小,当达到最大值是会删除之前的数据腾出空间。

    消息优先级【x-max-priority】 x-max-priority: 设置消息的优先级,优先级值越大,越被提前消费。

    死亡交换机【x-dead-letter-exchange】 和死亡路由键【 x-dead-letter-routing-key】 当队列中的消息过期,或者达到最大长度而被删除,或者达到最大空间时而被删除时,可以将这些被删除的信息推送到其他交换机中,让其他消费者订阅这些被删除的消息,处理这些消息。

    延迟模式Lazy mode【x-queue-mode=lazy】 将队列设置为延迟模式,在磁盘上保留尽可能多的消息以减少RAM使用; 如果未设置,队列将保留内存缓存以尽快传递消息。先将消息保存到磁盘上,不放在内存中,当消费者开始消费的时候才加载到内存中。

    主定位器Master locator【x-queue-master-locator】 将队列设置为主位置模式,确定在一个或多个节点上声明时,队列主机所在的规则。

  5. Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。

  6. Routing Key:路由关键字,exchange根据这个关键字进行消息投递。

  7. vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离(默认的vhost:“/”)。

  8. channel:消息通道,是应用程序(生产与/或消费)和broker之间TCP连接内的虚拟连接,解决TCP连接数量限制及降低TCP连接代价。在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

以“amq”开头的队列名称是由 broker 为内部使用而保留的。试图声明一个带有违反此规则的名称的队列,将导致一个 channel-level 异常。

队列在使用之前必须先声明,如果队列不存在,声明一个队列将导致它被创建。如果队列已经存在并且其属性与声明中的相同,则声明不起作用;如果属性不同,则会出现异常(406)。

发布了479 篇原创文章 · 获赞 149 · 访问量 58万+

猜你喜欢

转载自blog.csdn.net/qq_36850813/article/details/103995349