zoukankan      html  css  js  c++  java
  • 消息中间件三、RabbitMQ学习一

    由于学习的课程为二期(享学)的教学,所以一期的activeMQ 不在进行讲解(等抽空自行学习后在记录)

    下面就RabbitMQ学习进行记录

    定义

    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的

    AMQP——这里只简单记录定义——详细内容请自行百度

    AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,

    为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制

    RabbitMQ包括的要素——

    由于本人没有实际使用过RabbitMQ所以下面内容均为课件内容

    生 产 者 、 消 费 者 、 消 息

      生产者:消息的创建者,发送到 rabbitmq;

      消费者:连接到 rabbitmq,订阅到队列上,消费消息,持续订阅(basicConsumer)和单条订阅(basicGet).

       消息:包含有效载荷和标签,有效载荷指要传输的数据,,标签描述了有效载荷,并且 rabbitmq 用它来决定谁获得消息,消费者只能拿到有效载荷, 并不知道生产者是谁。

    交 换 器 、 队 列 、 绑 定 、 路 由 键

      队列通过路由键(routing key,某种确定的规则)绑定到交换器,生产者将消息发布到交换器,交换器根据绑定的路由键将消息路由到特定队列,

      然后由订阅这个队列的消费者进行接收。 (routing_key 和 绑定键 binding_key 的最大长度是 255 个字节)

    消息的确认
      消费者收到的每一条消息都必须进行确认(自动确认和自行确认)。

       消费者在声明队列时,可以指定 autoAck 参数,当 autoAck=false 时,RabbitMQ 会等待消费者显式发回 ack 信号后才从内存(和磁盘,如果是持久化消 息的话)中移去消息。否则,RabbitMQ 会在队列中消息被消费后立即删除它。

      采用消息确认机制后,只要令 autoAck=false,消费者就有足够的时间处理消息(任务),不用担心处理消息过程中消费者进程挂掉后消息丢失的问题, 因为 RabbitMQ 会一直持有消息直到消费者显式调用 basicAck 为止。

      当 autoAck=false 时,对于 RabbitMQ 服务器端而言,队列中的消息分成了两部分:一部分是等待投递给消费者的消息;一部分是已经投递给消费者, 但是还没有收到消费者 ack 信号的消息。如果服务器端一直没有收到消费者的 ack 信号,并且消费此消息的消费者已经断开连接,则服务器端会安排该消 息重新进入队列,等待投递给下一个消费者(也可能还是原来的那个消费者)。 

      RabbitMQ 不会为未 ack 的消息设置超时时间,它判断此消息是否需要重新投递给消费者的唯一依据是消费该消息的消费者连接是否已经断开。这么 设计的原因是 RabbitMQ 允许消费者消费一条消息的时间可以很久很久。

    常见问题

      如果消息达到无人订阅的队列会怎么办?消息会一直在队列中等待,RabbitMq 默认队列是无限长度的。

      多个消费者订阅到同一队列怎么办?消息以循环的方式发送给消费者,每个消息只会发送给一个消费者。

      消息路由到了不存在的队列怎么办?一般情况下,凉拌,RabbitMq 会忽略,当这个消息不存在,也就是这消息丢了

    虚拟主机

      虚拟消息服务器,vhost,本质上就是一个 mini 版的 mq 服务器,有自己的队列、交换器和绑定,最重要的,自己的权限机制。Vhost 提供了逻辑上的 分离,可以将众多客户端进行区分,又可以避免队列和交换器的命名冲突。Vhost 必须在连接时指定,rabbitmq 包含缺省 vhost:“/”,通过缺省用户和 口令 guest 进行访问。

      rabbitmq 里创建用户,必须要被指派给至少一个 vhost,并且只能访问被指派内的队列、交换器和绑定。Vhost 必须通过 rabbitmq 的管理控制工具创 建。

    交换器类型

      共有四种 direct,fanout,topic,headers,其种 headers(几乎和 direct 一样)不实用,可以忽略。 

      Direct 

        路由键完全匹配,消息被投递到对应的队列, direct 交换器是默认交换器。声明一个队列时,会自动绑定到默认交换器,并且以队列名称作为路由 键:channel->basic_public($msg,’’,’queue-name’)

        特点:路由键完全(精确)匹配,King 路由键精准匹配 King的队列,其他均不匹配

      

      Fanout
        消息广播到绑定的队列,不管队列绑定了什么路由键,消息经过交换器,每个队列都有一份。

        特点:全部匹配,所有队列都会收到消息

      Topic

        通过使用“*”和“#”通配符进行处理,使来自不同源头的消息到达同一个队列,”.”将路由键分为了几个标识符,“*”匹配 1 个,“#”匹配一个 或多个。

        特点:根据定义规则匹配,

          King.kafka—匹配— King.# 队列     #.kafka 队列

          King.jvm—匹配— King.# 队列     #.jvm队列

          mark.kafka—匹配— mark.# 队列     #.kafka 队列

          mark.jvm—匹配— mark.# 队列     #.jvm队列

        注:当路由键为King.kafka 时  King.#和king.*都可以匹配上,但是当路由键为king.kafka.first时只能匹配King.#

  • 相关阅读:
    <数据结构基础学习>(四)链表 Part 2
    <Android基础> (四) Fragment Part 2
    swagger忽略方法里参数的方法
    ActiveMq
    Tomcat日志归档
    java代理的实现
    包装类型和基础类型是如何比较的
    hashmap
    可达性分析中,可以作为GcRoots的对象
    使用Navicat 连接oracle出现 “ORA-03135: Connection Lost Contact”
  • 原文地址:https://www.cnblogs.com/yutf/p/11551540.html
Copyright © 2011-2022 走看看