消息队列Kafka Topic: 逻辑队列,不同Topic可以建立不同的Topic
Cluster: 物理集群,每个集群中可以建立多个不同的Topic
Producer: 生产者,负责将业务消息发送到Topic中
- 批量发送
- 数据压缩
Consumer: 消费者,负责消费Topic中的消息
ConsumerGroup: 消费者组,不同组Consumer消费进度互不干涉
Offset: 消息在partition内的相对位置信息,可以理解为唯一lD,在partition内部严格递增。
Replica: 每个分片有多个Replica,Leader Replica将会从ISR中选出。
Broker:
-
采用顺序写的方式进行写入,以提高写入效率
-
如何找到消息: Consumer通过发送FetchRequest请求消息数据,Broker会将指定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer,那么是如何寻找到细节的呢:
- 二分找到小于目标offset的最大文件
- 二分找到小于目标offset的最大索引位置
- 二分找到小于目标时间戳最大的索引位置,再通过寻找offset的方式找到最终数据。
-
零拷贝:将数据在内核空间直接从磁盘文件复制到网卡中,而不需要经由用户态的应用程序之手
缺点:
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖PageCache
- Controller和Coordinator和Broker在同一进程中,大量IO会造成其性能下降
BMQ
存算分离。兼容Kaka
BMA的重启、替换、扩容、缩容方面都远比Kafka要快,可以在秒级完成这些操作
- Broker-Partition
保证对于任意分片,在同一时刻只能在一个Broker上存活
- 数据校验
- 在Buffer读写处完成可以快速吞吐
- flush到硬盘,建立索引点和检查点
RocketMQ
为分布式应用系统提供异步解耦和削峰填谷
RockerMQ可以分为Producter,Consumer,Broker三个部分