消息分发系统需要在初始化时推送全量,全量数据比较大,这个量可能会重复计算。kafka是如何将数据直接推送过去的呢?
有一些是有依赖关系的数据。不同topic的数据是没有关系的,但是我们的系统,不同的topic的数据是有耦合关系的。
增加一种角色,该角色在内部保存一份全量,当用户请求时,直接将序列化好的数据直接发送给下一级用户。
如果我重启之后,下一级都记录了自己的数据消费位置,此时不需要再下发全量了,避免了下发全量的开销。
kafka对外提供producer的API,kafka不担心producer挂了,kafka只需要保证broker没有问题即可,这样kafka做的就是薄薄的一层broker的设计就可以了,使整个系统非常的简洁,扁平化,没有多个树形broker的支持。
在分布式系统中,不要设计出没有超时的永久阻塞调用,在线上遇到了这样一个问题:下级在等待阻塞在recv接收消息,结果上一级向下级发送数据时,网络连接异常,标记该连接为CLOSE。这样下一级无感该网络异常的变化,还在阻塞在recv处,导致该节点无法接受到配置。最好的做法是下一级定期向上一级发送心跳信息。
producer会向leader发送消息,leader broker接收到消息后,有3种选择:1,不确认继续想下发,2等待local log写入,3 等待所有的replication都写完再向下发下一条。
consumer会定期向上一级发送心跳信息,如果下一级不发送心跳信息,kafka的broker就会将节点剔除。
阅读(1103) | 评论(0) | 转发(0) |