目录
1. 数据写入流程
- 1. 数据写入流程
- 2. 数据读取流程
- 3. 读写异常处理流程
说明: 写入操作客户端只和broker交互, 不和zookeeper和bookkeeper交互
- 客户端通过produce进行消息的发送
- produce基于内部的MessageWriter类进行分区操作。分区方法有round-robin(默认)、根据key进行hash分区、自定义分区
- produce连接partition对应的broker节点
- broker调用Bookkeeper客户端并发写多个副本到Bookie
- 当broker收到所有副本的ack确认之后, broker通知客户端消息已经被持久化完成
- consume连接broker,获取到读取消息的topic的分片所在的broker地址,然后连接该broker地址
- 如果消息在broker有缓存,将消息放入receiver队列,consume从队列读取;如果broker没有缓存,broker通过Bookeeper客户端从bookie的任意副本读取数据,返回给客户端
- produce产生失败:当出现网络原因等,在超时时间内进行重试一定次数
- broker端出现宕机:broker是无状态的。由其它broker继续提供服务
- Bookkeeper出现宕机:由其它副本提供消息读取服务 存储节点只负责数据存储, bookkeeper本身是一个集群, 故如果只挂掉一个bookie, 并不影响, 所以broker是不会感知的, 除非所有的bookie都挂掉, 没有足够的副本去写入数据.
- consume产生失败:消息没有被consume进行ack确认,下次可以继续消费。也可以通过failover的subscription进行consume故障转移