Kafka rocketmq - worldgreen/freamwork-test GitHub Wiki

kafka

  1. 单播-多播实现
    • 单播:所有的消费者在同一个组下
    • 多播:所有的消费者在不同组下
  2. 发消息
    • 消息放在队列中,后台开一个线程sender不断从队列中取消息发给topic 的partion
    • sender同时从broker中取topic 相关的信息
  3. 消费消息
    • 消费模式:1 不指定partion subscribe 2 指定partion assign
    • 确认模式:
      • 自动的,周期性的ack
      • consumer.commitSync() //调用commitSync,手动同步ack
      • 每处理完1条消息,commitSync 1次
    • 不重复消费的方法
      • 把数据和offset保存在数据库中
    • 自己保存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
  4. 集群管理
    • broker 生死,监听broker 上的 /broker/ids节点
    • Controller 中央控制:通过zookeeper 在broker中选一个Controller,用controller控制其他broker,让Controller监听 /broker/id
    • topic/partion 增删,Controller监听zookeeper变化,通知其他broker

rocketmq

  1. 分布式事务:
    • update db和 insert message 放到同一个事务中,后台扫描message表发送消息
  2. 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
  3. 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
  4. produce
    • queue ID 每个master 有writeQueueNums 个queue
  5. broker 是否已死
    • broker 周期向name service 发心跳, produce,或 consumer 从name service 中查看broker信息
  6. 存储
    • Kafka 每个partion 对应一个日志文件
    • rocketmq 一台机器所有topic 所有 queue 放到一个文件中,后台线程异步同步到 consumer queue
  7. consumer 模式
    • pull和push用法上的基本差别就是:pull是客户端主动去拉取消息,push是注册了一个回调,当有新消息,该回调被调用。
    • 在pull里面,所有MessageQueue是向我们暴露的,我们需要自己去手动遍历所有的queue;而在push里面,我们只指定了订阅的topic,而MessageQueue是向我们隐藏的,在其内部做了“负载均衡”。
  8. 负载均衡
    • consumer 向broker 发送心跳,直接让consumer和所有broker广播通信
    • broker 收到心跳后维护全局consumer信息,
    • 每个 consumer从broker获得全局信息,3个关键参数,id, ids, messageQueueid
    • 把信息传给分配器进行分配