Kafka rocketmq - worldgreen/freamwork-test GitHub Wiki
kafka
- 单播-多播实现
- 单播:所有的消费者在同一个组下
- 多播:所有的消费者在不同组下
- 发消息
- 消息放在队列中,后台开一个线程sender不断从队列中取消息发给topic 的partion
- sender同时从broker中取topic 相关的信息
- 消费消息
- 消费模式:1 不指定partion subscribe 2 指定partion assign
- 确认模式:
- 自动的,周期性的ack
- consumer.commitSync() //调用commitSync,手动同步ack
- 每处理完1条消息,commitSync 1次
- 不重复消费的方法
- 自己保存offset
- Configure enable.auto.commit=false //禁用自动ack
- Use the offset provided with each ConsumerRecord to save your position. //每次取到消息,把对应的offset存下来
- On restart restore the position of the consumer using seek(TopicPartition, long).//下次重启,通过consumer.seek函数,定位到自己保存的offset,从那开始消费
- consumer 是一个单线程程序,coordinator,rebalance, heartbeat等,都是在这个单线程的poll函数里面完成的。
- suascribe 过程
- 每个group, broker选一个broker作为coordinator
- 得到coordinator后,consumer发一个JoinGroup请求
- JoinGroup请求返回之后,发送SyncGroup,得到自己所分配到的partition
- partion分配策略
- 由client决定,不是由coordinator决定
- consumer向coordinator发送JoinGroup消息后,coordinator指定一个consume最为leader,其他为flower
- 然后由leader分配partion,leader通过SyncGroup消息,把分配结果发给coordinator
- 其他consumer也发送SyncGroup消息,获得这个分配结果
- heartbeat
- 每个consumer定期向coordinator发送heartbeat消息,一旦返回了错误消息,就进行 JoinGroup和SyncGroup
- 集群管理
- broker 生死,监听broker 上的 /broker/ids节点
- Controller 中央控制:通过zookeeper 在broker中选一个Controller,用controller控制其他broker,让Controller监听 /broker/id
- topic/partion 增删,Controller监听zookeeper变化,通知其他broker
rocketmq
- 分布式事务:
- update db和 insert message 放到同一个事务中,后台扫描message表发送消息
- Kafka 中一台机器即可能是master也可能是slave, rocketmq 一台机器要么是master,要么是slave,在初始机器配置中定死了
- rocketmq中的queue对应 Kafka 中的partion
- Kafka master和slave逻辑概念,rocketmq物理概念,master broker ID = 0, slave broker ID > 0
- broker Kafka 一个broker 是一台机器, rocketmq 是一个物理概念,有master broker, slave broker
- rocketmq 有相同broker name 的是一个broker
- rocketmq master 不需要选举,Kafka 通过 controller 选 partion 的master
- topic 创建
- Kafka topic, partion数,master/slave比
- rocketmq topic queue数,cluster, 系统自动创建cluster
- client 从 name service 拿到 cluster中的 master列表,
- client遍历列表,向每个master发送 create topic 命令
- master 遍历 name service,进行路由注册
- name service 存 queueDate,一个queue Date 对应一个master
- produce
- queue ID 每个master 有writeQueueNums 个queue
- broker 是否已死
- broker 周期向name service 发心跳, produce,或 consumer 从name service 中查看broker信息
- 存储
- Kafka 每个partion 对应一个日志文件
- rocketmq 一台机器所有topic 所有 queue 放到一个文件中,后台线程异步同步到 consumer queue
- consumer 模式
- pull和push用法上的基本差别就是:pull是客户端主动去拉取消息,push是注册了一个回调,当有新消息,该回调被调用。
- 在pull里面,所有MessageQueue是向我们暴露的,我们需要自己去手动遍历所有的queue;而在push里面,我们只指定了订阅的topic,而MessageQueue是向我们隐藏的,在其内部做了“负载均衡”。
- 负载均衡
- consumer 向broker 发送心跳,直接让consumer和所有broker广播通信
- broker 收到心跳后维护全局consumer信息,
- 每个 consumer从broker获得全局信息,3个关键参数,id, ids, messageQueueid
- 把信息传给分配器进行分配