为什么使用队列,为什么使用RabbitMQ队列
消息队列用于系统之间解耦,通过高性能消息中间件,提升系统吞吐量,降低导致系统耦合。
当前有各种消息队列,RabbitMQ、Kafka、ActiveMQ等,为什么使用RabbitMQ? <!--more-->
消息队列从使用场景来分为两类:
- 一类是大数据的数据流处理,数据采集者作为生产者数据通过消息队列从到后端处理。这种场景要求高吞吐高并发,Kafka专门为这种场景设计。
- 另一类是消息高可靠低时延在系统之间传递,这种场景要求可靠性高,消息不能丢;要求时延低。AMQP协议专门为这种场景设计,RabbitMQ是AMQP协议实现者之一,也是当前使用的最广的AMQP消息队列。
典型的消息队列处理流程
以一个提供网页转PDF的Web应用为例,描述消息处理流程。
- 用户发送网页转PDF请求到Web应用
- Web应用发送一个消息到RabbitMQ,包括网页内容、用户名、邮箱等
- RabbitMQ的Exchange接收到消息后,将消息路由到某一个队列
- PEF生成器消费队列的消息,生成PDF
基本概念
- 生产者
- 消费者
- 服务器 Broker:Broker是一个物理上的服务器(或虚拟机),它是部署了消息中间件并接收处理客户端请求的实体。
- 队列 Queue:用于存储消息的一块缓存
- 消息 Message
- 连接 Connection:应用与RabbitMQ Broker之间的TCP连接
- 通道 Channel:连接内的虚拟连接,应用生产或消费队列中的消息时,都是通过Channel完成的
- 绑定 Binding:Queue与Exchange之间连接
- 路由键 Routing Key:Exchange根据Routing Key来决定将消息投递到哪个队列,类似消息的地址
- 用户 User:RabbitMQ连接需要用户密码认证;同时可以给用户设定读、写等权限
- 虚拟主机 Virtual Host:Virtual Host用来区使用同一个RabbitMQ实例的多个应用。connections, exchanges, queues, bindings, user permissions, policies and some other things 都属于Virtual Host。
Exchange 类别
- Direct Exchange
Direct Exchange 根据 Routing Key 投递消息,Routing Key 由生产者在生产消息时候设置到消息头内。 Direct Exchange投递规则是 精确匹配 Binding Key 与 Routing Key 。
- Default Exchange
Default Exchange 是一个系统预定义的、Routing Key 为空字符串 "" 的 Direct Exchange 。每个 Queue 都自动绑定到 Default Exchange ,其 Routing Key 就是 队列名称。
- Topic Exchange
Topic Exchange 根据通配符匹配规则投递消息:匹配 Routing Key 与 Routing Pattern , Routing Pattern 在 binding 时候指定。
- Fanout Exchange
Fanout Exchange 将消息投递到所有队列。
- Headers Exchange
Headers Exchange 根据头部选项投递消息,通过 "x-match" 定义匹配动作: any, all
- Dead Letter Exchange
如果消息找不到投递队列,则会被丢弃;RabbitMQ提供了 Dead Letter Exchange ,用于记录无法投递的消息。
Reference
RabbitMQ for beginners - What is RabbitMQ?
RabbitMQ Exchanges, routing keys and bindings
RabbitMQ(一)AMQP简介
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。