2021 December 10 MQ
MQ
应用场景
应用思考
- 生产端可靠性投递
- 消费端幂等
- 高可用
- 低延迟
- 可靠性
- 堆积能力
- 扩展性
技术选型
- MQ的性能、优缺点、业务场景
- 集群架构模式,分布式、可扩展、高可用、可维护
- 综合成本问题,集群规模、人员成本
ActiveMQ
- JMS(Java Messae Service)规范
- JMS:实现JMS接口的消息中间件
- Provider(MessageProvider):消息的生产者
- Consumer(MessageConsumer):消息的消费者
- PTP(Point to Point):点对点消息模型
- Pub/Sub(Publish/Subscribe):发布/订阅消息模型
- Queue:队列目标,即消息队列,一般会进行真正的物理存储
- Topic:主题目标
- ConnectionFactory:连接工厂,JMS用它创建连接
- Connection:JMS客户端到JMS Provider的连接
- Destination:消息的目的地
- Session:会话
- 消息格式定义
- StreamMessage:原始值的数据流
- MapMessage:键值对
- TextMessage:字符串对象
- BytesMessage:未解释字节的数据流
- ObjectMessage:序列化Java对象
- ActiveMQ
- 服务性能:性能一般
- 数据存储:默认采用kahadb(索引文件形式存储),也可以使用高性能的google leveldb(内存数据库存储),或者可以使用MySQL、Oracle进程消息存储
- 集群架构:可以与zookeeper进行构建主备集群模型,且多套的主备模型直接采用Network的方式构建分布式集群
- 集群架构模式
- Master-Slave:主从方式(双机热备机制)
- Network
- 网络通信方式
- 多套Master-Slave之间的network
RocketMq
- 一款分布式、队列模型的消息中间件。适用于高并发、高性能、海量数据场景的消息中间件
- 支持集群模型、负载均衡、水平扩展能力
- 亿级别的消息堆积能力
- 采用零拷贝原理、顺序写盘、随机读(索引文件)
- 丰富API使用
- 底层通信框架采用Netty NIO框架
- NameServer代替zookeeper
- 强调集群无单点,可扩展。任一点高可用,水平可扩展
- 消息失败重试机制、消息可查询
- 术语
- Producer:消息生产者,负责生产消息,一般由业务系统负责生产消息
- Consumer:消息消费者,负责消费消息,一般是后台系统负责异步消费
- Push Consumer:Consumer的一种,需要向Consumer对象注册监听
- Pull Consumer:Consumer的一种,需要主动请求Broker拉取消息
- Producer Group:生产者集合,一般用于发送一类消息
- Consumer Group:消费者集合,一般用于接受一类消息进行消费
- Broker:MQ消息服务,中转角色,用于消息存储与生产消费转发
- 集群架构模型
- 包括单点模式、主从模式、双主模式以及生产常用的多主多从模式
- Producer集群:生产者集群
- Consumer集群:消费者集群
- NameServer集群:超轻量级配置中心,只做集群元数据存储和心跳工作,不必保障节点间数据强一致性
- Broker:通常Master与Slave为一组服务,互为主从节点,通过NameServer与外部的Client端暴露统一的集群入口
RabbitMQ
- 集群架构
- 主备模式:一个主备方案(主节点如果挂了,从节点提供服务,和ActiveMQ一样利用zookeeper做主/备)
- 远程模式:远距离通信和复制,可以实现双活的一种模式,简称shovel模式
- 镜像模式:保证数据100%不丢,实际工作中用的最多
- 多活模式:实现异地数据复制的主流模式(需要依赖RabbitMQ的federation插件)federation插件是一个不需要构建cluster,而在broker之间传输消息的高性能插件
kafka
- 主要特点是基于pull的模式来处理消费,追去高吞吐量,一开始的目的就是用于日志收集和传输
- 0.8版本后开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的数据收集业务
- 特点
- 高性能原因
- 顺序写,提高磁盘利用率
- page cache,空中接力,高效读写:将IO操作放入内存中操作
- 后台异步、主动flush
- 预读策略,IO调度
- 集群模式(zookeeper集群)