生产者

生产消息,并将其发布到消息代理服务器中。

消费者

连接到消息代理服务器,并订阅队列中的消息

消息

由有效载荷和标签组成

  1. 有效载荷:生产者要发送的有效信息
  2. 标签:描述发送的有效载荷,以及谁能得到该消息的拷贝

信道(channel)

  1. 建立在真实tcp连接上的虚拟连接
  2. 每个信道都有一个唯一ID
  3. 信道的个数不受限制

amqp消息路由组成部分

  1. 交换器
  2. 队列
  3. 绑定(路由键)

消息消费

  1. basic.consume:当消费者处理完消息后会继续获取该队列中的有效消息
  2. basic.get:只获取队列中的一条消息
    ?basic.consume是持续消费中有效提升吞吐量的方法,而不是循环使用basic.get

消息确认(消息被从队列安全移除)

  1. 队列auto_ack设置为true
  2. 向队列发送basic.ack命令

消息拒绝

  1. 直接与消息服务器断开(存在性能隐患)
  2. 发送basic.reject命令给队列
    ?如果requeue为true,消息重新归队发送给其他消费者
    ?如果reqeue为false,则被移除队列;最新版本中有dead letter的死信队列
    3.也可以直接发送basic.ack,好处是版本兼容

队列(

  1. 为消息提供了住所,消息在这里等待消费
  2. 对于负载均衡来说,队列是一个绝佳的方案
  3. 消息在rabbitmq的最后一站(除非消息进入黑洞)
    ### 创建队列
  4. 使用queue.declare声明队列(生产者和消费者均可)
  5. exclusive设置为true,队列变为私有,只有你的应用程序才能消费
  6. auto-delete设置为true,当最后一个订阅者断开连接后队列自动删除
  7. passive设置为true,用于检测队列是否存在,不存在返回错误
    ?当不指定队列名称时,会随机生成并返回该名称
    ?如果队列存在则什么都不做
    ?信道订阅了队列时不可以声明队列,应先取消订阅将信道设置为“传输”模式