kafka的一些工作总结
1.如果kafka一个topic下有多个partition(比如18个),如何将数据平均分配到每个partition?
(1)如果能够一次性能够获取总数量,可以用数据的总数量/partition数量(18), 取平均后分配数据;
(2)如果数据是逐一获取的,不能事先获取总数量,可以用获取的数据取hash值的绝对值%partition数量(18),余数为0-17,取余数为partition的索引;
var partition = Math.Abs(data.GetHashCode())%18;
(3)可以用random取[0-17]之间的随机数,分配到partition。
2.同一个用户组group如何保证多个用户平均分配消费信息?
(1)如果使用一个消费进程,那么一个消费者会同时消费18个partition,按顺序消费;
(2)如果使用2-18个消费进程,那么2-18个消费者会平均分配这18个partition;
(3)如果使用19个消费进程,那么会剩余一个空闲的消费进程;
(4)如果18个partition中只有9个partition存在消费数据,另外9个partition是空的(没有待消费数据的partition),此时若开启了9个消费进程,其实不一定9个进程能够同时消费,因为有的消费进程可能会分配到两个空的partition, 一般相邻的两个分区会分配同一个消费者,partition[0,1]=>customer1; partition[2,3]=>customer2;........partition[16,17]=>customer9;可以同时开启18个进程,那么就会有9个进程消费,9个进程空闲;
3.当增加或减少消费者时,kafka 会rebalancing 消费者;
4.消费者组groupA在消费topicA时,如果使用groupB来消费topicA,groupB会消费完整的topicA,并不会消费topicA未消费完成的消息。groupA/groupB是相对独立的;