作者回复: 厉害!感觉比我写的简洁:)
作者回复: 是的。前些天在知乎上就这个问题也解答了一下,有兴趣可以看看:https://www.zhihu.com/question/327925275/answer/705690755
作者回复: 嗯嗯,好的:)
作者回复: 我个人觉得是很不错的答案,自己也学到了一些:)
作者回复: 1. 如果producer指定了要发送的目标分区,消息自然是去到那个分区;否则就按照producer端参数partitioner.class指定的分区策略来定;如果你没有指定过partitioner.class,那么默认的规则是:看消息是否有key,如果有则计算key的murmur2哈希值%topic分区数;如果没有key,按照轮询的方式确定分区。
2. 这个层级其实是逻辑概念。在物理上还是以日志段(log segment)文件的方式保存,日志段文件在内存中有对应的Java对象,里面关联了你说的这些。
作者回复: 目前Kafka的设计中多个分区的话无法保证全局的消息顺序。如果一定要实现全局的消息顺序,只能单分区
作者回复: 在一个消费者组下,一个分区只能被一个消费者消费,但一个消费者可能被分配多个分区,因而在提交位移时也就能提交多个分区的位移。
针对你说的第二种情况,答案是:是的。有一个消费者将无法分配到任何分区,处于idle状态。
作者回复: 我个人认为维护成本不高。Kafka中消费进度由clients端来操作,即消费者来决定什么时候提交位移,而且是提交到专属的topic上,与副本本身关联不大。实际上社区最近正在讨论是否允许follower副本提供读服务。不过我同意的是,follower副本提供读服务后会推高follower所在broker的磁盘读IO
作者回复: 如果retries>0并且max.in.flight.requests.per.connection>1有可能出现消息乱序的情况
作者回复: server = Broker
作者回复: 只能是分散负载了,多做一些分区。
作者回复: Kafka提供了消费者组实现你说的这个需求~~
作者回复: “同一主题下的分区有没有可能到不同的borker上?” ——非常可能,而且也是期望的结果。
“同一分区的副本有没有可能在不同的borker上” —— 必须如此。同一分区的不同副本必然在不同的broker上。
作者回复: 一个分区的N个副本一定在N个不同的Broker上。
作者回复: 取不出数据时,有什么报错吗?另外你的fetch.max.bytes值多少?