Go语言入门-RabbitMQ原理篇 | 青训营笔记

51 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天

本堂课重点内容

  • 消息队列
  • RabbitMQ原理

1 基本概念

1.1 术语

队列
最大特性:FIFO(先进先出)

消息队列
服务间异步通信的容器

AMQP(Advanced Message Queue Protocol)
一个提供统一消息服务的应用层标准高级消息队列协议,是一个通用的应用层协议

RabbitMQ
实现了AMQP高级消息队列协议的服务,采用Erlang语言编写

1.2 AMQP概念

  • Producer/Publisher:即数据的发送方(生产者)
    • 消息Message包含两个字段
      • 有效载荷(payload):数据
      • 标签(label):决定将该消息放到哪个队列中
  • Exchange:即rabbitmq内的消息交换器(路由)
    • exchange从生产者那收到消息后,一般会指定一个Routing Key,来指定这个消息的路由规则,当然Routing Key需要与Exchange Type及Binding key联合使用才能最终生效,根据路由规则,匹配查询表中的routing key,分发消息到queue中。
    • Exchange Type
      • Direct
      • topic
      • fanout
  • Binding(绑定)
    • 绑定exchange和queue时会指定一个binding key
    • 但Binding key并不是在所有情况下都生效,它依赖于Exchange Type。
  • queue
    • 内部对象,用于存储消息
    • 一个message可以被同时拷贝到多个queue中
    • 生产者和消费者都需要尝试创建队列
  • Connection和Channel:RabbitMQ对外提供的API中最基本的对象
    • connection
      • TCP连接
      • Producer和Consumer都是通过TCP连接到RabbitMQ Server的
    • Channel
      • 建立在上述的TCP连接中,因为建立TCP Connection的开销将是巨大的,所以其是为了节省rabbitmq开销
  • Consumer:消费者
  • Broker: 即RabbitMQ Server
  • Virtual host:即虚拟主机当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue

2 RabbitMQ

2.1 转发流程

  • 生产者发布消息到exchange
  • exchange接收消息,并根据路由转发到相应队列
  • 队列暂存消息,直到被消费者处理
  • 消费者处理消息

2.2 转发类型 exchange type

  • direct
    • exchange会将收到的消息的标签与binding key进行匹配,并将其转发到成功匹配的队列中
    • 如图所示,ex1将具有k1标签的消息转发到了q1处,c1获得了data1 image.png
  • topic
    • direct 的通配符模式
    • 如图所示,*可以匹配任意长度的字符串

image.png

  • fanout
    • 不需要匹配label和binding key
    • exchange将收到的消息复制多份转发到与自己绑定的队列
    • 如图所示,c1和c2都收到了消息

image.png 模拟工具来自:RabbitMQ Simulator (tryrabbitmq.com)