MQ选择
一、Kafka
1、kafka是什么以及应用场景
- 分布式流式处理平台,一种高吞吐量、分布式、基于发布/订阅的消息中间件,Apache开源项目
- 消息队列
- 容错的持久方式存储记录消息流:Kafka 会把消息持久化到磁盘
- 流式处理平台:在消息发布的时候进行处理,Kafka 提供了一个完整的流式处理类库
- 场景
- 消息队列:建立实时流数据管道,以可靠地在系统或应用程序之间获取数据。
- 数据处理: 构建实时的流数据处理程序来转换或处理数据流。
2、kafka消息模型
- 发布订阅模型
-
使用主题(Topic) 作为消息通信载体,类似于广播模式;发布者发布一条消息,该消息通过主题传递给所有的订阅者,在一条消息广播之后才订阅的用户则是收不到该条消息的。在发布 - 订阅模型中,如果只有一个订阅者,那它和队列模型就基本是一样的了。所以说,发布 - 订阅模型在功能层面上是可以兼容队列模型的。
-
RocketMQ 的消息模型和 Kafka 基本是完全一样的。唯一的区别是 Kafka 中没有队列这个概念,与之对应的是 Partition(分区)。
3、Kafka架构
- broker: Kafka服务器,负责消息存储和转发,一个集群由多个 broker 组成。一个 broker 可以容纳多个 topic。
- topic:消息类别,Kafka按照topic来分类消息,可以理解为一个队列,一个 Topic 又分为一个或多个分区
- partition: topic的分区,一个topic可以包含多个partition, topic 消息保存在各个partition上。offset:消息在日志中的位置,可以理解是消息在partition上的偏移量,代表该消息的唯一序号
- Producer:消息生产者,将数据PUSH给broker
- Consumer:消息消费者,因为Kafka代理是无状态的,这意味着消费者必须通过使用分区偏移来维护已经消耗了多少消息。消费者向broker拉取消息
- Consumer Group:消费者分组,每个Consumer必须属于一个group,这是 kafka 用来实现一个 topic 消息的广播(发给所有的 consumer)和单播(发给任意一个 consumer)的手段。一个 topic 可以有多个 Consumer Group
- Zookeeper:保存着集群 broker、 topic、 partition等数据;另外,还负责broker故障发现, partition leader选举,负载均衡等功能
4、kafka多副本机制
-
分区(Partition)中的多个副本之间会有一个叫做 leader 的家伙,其他副本称为 follower。我们发送的消息会被发送到 leader 副本,然后 follower 副本才能从 leader 副本中拉取消息进行同步。
生产者和消费者只与 leader 副本交互。你可以理解为其他副本只是 leader 副本的拷贝,它们的存在只是为了保证消息存储的安全性。当 leader 副本发生故障时会从 follower 中选举出一个 leader