Queue Awesome
考虑维度
- 持久化
- 顺序性
- 消息交付保证
- 语言支持
- 维护难易度
- 单机
- 集群
- 功能
- 延迟队列
- 请求 & 响应
- Dedup
- 优先级队列
- 死信队列
- 重试队列
- 消费模式 - 推拉
- 广播消费
- 消息回溯 - 是否持久化
- 消费堆积
- 持久化
- 消息追踪
- 消息过滤
- 多租户
- 协议 - STOMP, MQTT, AMQP, Websocket
- 流量控制
- 消费顺序性
- 安全机制
- 幂等
- 事务
- 规模
- 万/s
- 百万/s
- 更高
推荐
- 优先考虑: Redis, Nats, 关系型数据库
区别
- 存储
- 短期
- 消费后即删除
- 正常的 MQ
- 长期
- 基于 Offset 消费,设置保留时间
- 兼任半个 DB 的能力 - Kafka、Nats JetStream、RocketMQ
- 短期
- Apache Pulsar
- by Yahoo 2016
- 计算和存储分离
- BookKeeper
- Apache Kafka
- by Linkedin 2010
- RocketMQ
- by Alibaba
- fork Kafka
- RabbitMQ
- AMQP, MQTT, STOMP, HTTP
- ActiveMQ
- HiveMQ
- Redis
- nats-io/nats-server
- liftbridge-io/liftbridge
- ⚠️ 不维护
- 概念接近 Kafka
- https://liftbridge.io/docs/feature-comparison.html
- vs. NATS Streaming
- nats-io/nats-streaming-server
- ⚠️ 已废弃 - 使用 jetstream - nats 启动添加 -js
- Protocol Buffer 编码
- 持久化
- QoS
- 流控
- liftbridge-io/liftbridge
- bloomberg/blazingmq
- Apache-2.0, C++
- 不做长期存储
- redpanda-data/redpanda
- BSL, C++,Go
- 兼容 Kafka 协议
- No Zookeeper
- confluentinc/ksql
- Confluent Community License, Java
- cashapp/pranadb
- Apache-2.0, Go
- nsqio/nsq
- 开发相对没有那么活跃
- ZeroMQ
- IPC
- TaskQueue/任务队列 - 通常在 Queue 上抽象服务功能,通常支持 cron
- celery
- Python
- bull
- Node.js
- celery
- Streaming Processing
- Hazelcast Jet
- Apache Kafka Streams
- Apache Flink
- Apache Spark
- Apache Storm
- Apache Samza
- Apache Beam
- Apache ActiveMQ Artemis
- AMQP protocol support
- OpenWire support for ActiveMQ 5 clients
- MQTT support
- STOMP protocol support
- HornetQ Core protocol support for HornetQ 2.4,2.5 clients
- JMS 2.0 and 1.1 support
- High availability with shared store and non shared store (replication)
- Flexible Clustering
- High performance journal for message persistence
- Queue memory limitation
- SSL support
- Management over JMX, JMS and core protocol
- Large message support
- Topic hierarchies
- Producer flow control
- Consumer flow control
- Diverts
- Last value queue
- Message Groups
- OSGi support
Protocol
- STOMP - Simple Text Oriented Message Protocol
- 端口 61613
- 类 HTTP
- 基于文本 frame 通讯
- Client: SEND, SUBSCRIBE/UNSCRIBE, ACK/NACK
- Server: MESSAGE, RECEIPT, ERROR
- 1.1 - 支持心跳, NACK, Virtual Host
- 1.2 - 2012-10-22
- 支持
\r\n
而不只是\n
, ACK 头 - 支持重复 Frame 头, content-length & content-type 头
- 要求服务端支持 STOMP frame
- 链接驻留
- 订阅和事务的 Scope 和唯一标识
- RECEIPT
- 支持
- MQTT - Message Queue Telemetry Transport
- 端口 1883
- 由 IBM 为嵌入式设备 Telemetry 设计
- 适用于 Low Bandwid、High Latency、Data Limit、Fragile Connection 场景
- 二进制格式 - 2 byte 头
- Pub/Sub
- 可靠 - QOS
- 安全 - Auth、TLS/SSL
- 简单
- Connect/Disconnect + Publish + Subscribe/Unscribe
- AMQP - Advanced Message Queue Protocol
- 端口 5672
- 2006 JP Morgan
- 作为中间件 - 解决业务耦合问题
- 设计为可替代的消息中间件 - 很多实现
- 0.9.1 和 1.0 不兼容 - RabbitMQ 为 0.9.1, ActiveMQ 为 1.0
- Openwire
- 端口 61616
Server
- 考虑选择的标准
- 队列特性
- 分发保证
- At Least Once
- At Most Once
- Exactly Once
- 模式
- Pull
- Push
- Request/Replay
- Consumer Group/负载均衡
- 优先级
- 消息保留和持久化
- 介质 - 文件、内存、分片、副本、DB
- TTL - Rentention
- 长短期存储 - 归档
- Filter
- Dedup
- Message Size
- Flow control - rate matching/limiting
- 多租户 - 分片/Topic/Subject
- 分发保证
- 场景
- 事务
- 嵌入式
- RPC
- Event
- IPC
- 集成能力
- AMQP, MQTT, STOMP, HTTP, WebSocket, Kafka
- 集群容错
- 路由分发能力
- 部署模式
- 服务特性
- 安全
- AuthN
- AuthZ
- 队列特性
Delayed Message
- RabbitMQ:支持使用 TTL(Time To Live)和死信队列来实现延时队列。
- RocketMQ:支持通过设置消息的延时等级来实现延时队列。
Kafka- ActiveMQ:支持使用 Scheduled Message 和 Redelivery Policy 来实现延时队列。
- Redis:通过使用 zset 有序集合来实现延时队列。
- ZeroMQ:支持使用定时器来实现延时队列。
- NSQ:支持通过设置消息的 TTL 来实现延时队列。
- Beanstalkd:支持使用 Delay Job 来实现延时队列。
- Pulsar