消息队列
基础概念
常见的消息队列产品
- ActiveMQ,是Apatche出品的、采用Java语言编写的、完全基于JMS1.1规范的、面向消息的中间件
- RabbitMQ,采用Erlang语言实现的AMQP协议的消息中间件
- RocketMQ,是阿里开源的、由Java语言编写的消息中间件,现已经捐献给了Apache基金会
- ZeroMQ,基于C/C++开发的消息中间件
- Kafka
功能维度
队列特性
- 优先级队列
- 延时队列
- 重试队列
- 死信队列
消息发送方式
- 同步发送
- 异步发送
- 单向发送,不可靠消息发送方式,消息有丢失的风险,但效率最高,常用于日志等
发送数量
- 批量发送
- 单条发送
消费模式
- Push(推)
- 由Broker主动将消息推送给Consumer
- 实时性高,但需要评估Consumer的消费能力,避免超出Consumer的处理范围
- Pull(拉)
- 由Consumer主动从Broker拉取消息
- 实时性低,Consumer会根据自身的处理能力拉取消息
消息传递模式
- 点对点(P2P,Point-To-Point)
- 发布与订阅(Pub/Sub)
回溯消费
回溯消费是指消息在消费完成之后,还能再次消费之前被消费的消息
- 使用场景
- 索引恢复
- 本地缓存重建
- 业务补偿
消息堆积与持久化
- 使用场景
- 流量削峰填谷
- 堆积方式
- 磁盘堆积
- 内存堆积
消息轨迹
消息审计
消息过滤
消息过滤是指按照既定规则为下游用户(Consumer)提供指定类别的消息
多租户
多重租赁技术,可以确保各用户间数据的隔离性。例如BabbitMQ可以支持多租户技术
消息队列常见协议
- AMQP
- MQTT
- STOMP
- XMPP
跨语言支持
是否支持多客户端语言(C、C++、Java、Go、PHP、Python等)
流量控制(Flow Control)
指发送方和接收方速度不匹配时,提供速度匹配服务来抑制发送速度
- 实现方式
- 滑动窗口
- 令牌桶
- Stop-And-Wait
消息顺序性
指的是保证消息的有序性
安全机制
- 身份认证,指客户端与服务端连接进行身份认证,常见的认证方式:
- SSL
- SASL
- TLS
- 权限控制,指对服务端进行的操作的权限控制,包括客户端读写、集群控制等
消息幂等性
指的是一次和多次消费(重复消费)产生的结果是一样的
- 解决方式
- 在下游用户(Consumer)端,通过去重表进行保证
事务性消息
性能维度
吞吐量
影响性能的项
-
内存、磁盘、CPU
-
宽带、IO
-
集群规模
-
分区数与副本因子
-
事务、顺序消息、定时消息、幂等性等
-
日志、数据刷盘策略
可靠性和可用性
是否支持数据持久化与数据备份
运维管理
- 资源申请、审核
- 监控
- 告警
- 管理
- 容灾
- 部署
- 社区活跃度以及生态
事件消息总线
简述
- 事件总线是一种软件设计模式和架构,允许软件应用程序的组件或服务之间进行通信。它充当应用程序不同部分之间通信的中介,允许它们在不需要组件之间直接耦合的情况下进行通信和交换数据
- 事件总线概念类似于消息队列,其中消息(也称为“事件”)被广播给订阅了特定类型事件的侦听器。事件总线模式支持组件之间的松散耦合,使得修改或替换组件更容易,而不会影响应用程序的其余部分
- 事件总线使用各种技术实现,例如内存数据结构、消息队列或发布-订阅系统,具体取决于应用程序的具体要求
常见实现方式
- Java 消息服务 (JMS):一种基于 Java 的消息传递标准,它为基于 Java 的事件总线实现定义了一个通用接口
- Apache Kafka:一个开源的分布式事件流平台,通常用作大数据和流应用程序的高性能事件总线
- RabbitMQ:一个实现高级消息队列协议 (AMQP) 的开源消息代理,通常用作微服务架构的事件总线
- Microsoft Azure 事件网格:Microsoft Azure 提供的完全托管的事件路由服务,支持事件驱动的体系结构和无服务器应用程序