这期内容当中小编将会给大家带来有关消息中间件Kafka、RocketMQ该怎么理解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
消息中间件的应用场景
主流 MQ 框架及对比
说明
Kafka 优点
非常成熟,生态丰富,与 Hadoop 连接紧密
吞吐非常高,可用性高sharding提升 replication 速度
主要功能:pub-sub,压缩支持良好
可按照 at least once, at most once 进行配置使用,exactly once 需要 Consumer 配合
集群部署简单,但 controller 逻辑很复杂,实现partition 得多副本、数据一致性
controller 依赖 ZooKeeper
异步刷磁盘(除了钱的业务,很少有同步 flush 的需求)
Kafka 缺点
RocketMQ
Pulsar
发展趋势
各公司发展
快手:Kafka所有场景均在使用特殊形态的读写分离数据实时消费到 HDFS在有明显 lag 的 consumer 读取时,broker 把请求从本地磁盘转发的 HDFS不会因为有 lag 的 consumer 对日常读写造成明显的磁盘随机读写由于自己改造,社区新功能引入困难
阿里巴巴:开源 RocketMQ
字节跳动在线场景:NSQ→RocketMQ离线场景:Kafka→自研的存储计算分类的 BMQ(协议层直接兼容Kafka,用户可以不换 client)
百度:自研的 BigPipe,不怎么样
美团:Kafka 架构基础上用 Java 进行重构,内部叫 Mafka
腾讯:部分使用了自研的 PhxQueue,底层是 KV 系统
滴滴:DDMQ对 RocketMQ 和 Kafka 进行封装多机房数据一致性可能有问题
小米:自研 Talos架构类似 pulsar,存储是 HDFS,读场景有优化
Kafka
Kafka 是什么?
开源的消息引擎系统(消息队列/消息中间件)
分布式流处理平台
发布/订阅模型
削峰填谷
Kafka 术语
Topic:发布订阅的主题
Producer:向Topic发布消息的客户端
Consumer:消费者
Consumer Group:消费者组,多个消费者共同组成一个组
Broker:Kafka的服务进程
Replication:备份,相同数据拷贝到多台机器Leader ReplicaFollower Replica,不与外界交互
Partition:分区,解决伸缩性问题,多个Partition组成一个Topic
Segment:partition 有多个 segment 组成
Kafka 如何持久化?
Kafka 文件存储机制
https://www.open-open.com/lib/view/open1421150566328.html
每个 partition 相当于一个巨型文件→多个大小相等 segment 数据文件中
每个 partition 只需要顺序读写就行了,segment 文件生命周期由配置决定
segment file 组成:index file:索引文件data file:数据文件
segment file 文件命名规则:全局第一个 segment 是 0后序每个加上全局 partition 的最大 offset
一对 segment file
message 物理结构
分区
为什么分区?
分区策略?
Kafka 是否会消息丢失?
只对“已提交”的消息做有限度的持久化保证已提交的消息:消息写入日志文件有限度的持久化保证:N个 broker 至少一个存活
生产者丢失数据producer.send(msg) 异步发送消息,不保证数据到达Kafkaproducer.send(msg, callback) 判断回调
消费者程序丢失数据应该「先消费消息,后更新位移的顺序」新问题:消息的重复处理多线程异步处理消息,Consumer不要开启自动提交位移,应用程序手动提交位移
控制器
控制器如何选购?
在 ZooKeeper 创建 /controller 节点,第一个创建成功的 Broker 被指定为控制器。
控制器有什么用?
控制器故障转移
Kafka 的 ZooKeeper 存储结构
分布式事务的应用场景
两阶段最终一致
如何保证最终一致?
为了保证最终一致,消息系统和业务程序需要保证:
消息发送的一致性:消息发送时,一阶段事务和消息发送必须同时成功或失败
消息存储不丢失:消息发送成功后,到消息被成功消费前,消息服务器(broker)必须存储好消息,保证发生故障时,消息不丢失
消费者不丢失消息:处理失败不丢弃,重试直到成功为止
消息发送的一致性如何保证?
目标 :本地事务、消息发送必须同时成功/失败
问题
发送异常会如何?
1 异常,半消息发送失败,本地 DB 没有执行,整个操作失败,DB/消息的状态一致(都没有提交)
2 异常/超市生产者以为失败了,不执行 DBbroker 存储半消息成功,等不到后续操作,会询问生产者是提交还是回滚(第6步)
3 DB操作失败:生产者在第 4 步告知 broker 回滚半消息
4 提交/回滚半消息失败:broker 等不到这个操作,触发回查(第 6 步)
5、6、7回查失败:RocketMQ 最多回查 15 次
上述就是小编为大家分享的消息中间件Kafka、RocketMQ该怎么理解了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注天达云行业资讯频道。