存在2个业务同时写入的情况
2个可能原因
- 当时发生了rebalance
- 2个业务默认hash算法不一样
- java kafka client默认的hash:crc32
- sarama client : FNV-1a
补充: 从kafka源码看大量特性的逻辑是在客户端实现,比如题主遇到的key相同但是partion却不一样。 以java客户端为例,一共三大类partition计算方案:
- record指定partition就使用指定的partition
- 没有指定partition且没有指定Partitioner(partition选择器)
- 指定key: 对key进行hash取模 详见:
org.apache.kafka.clients.producer.internals.DefaultPartitioner
- 没有指定key: 轮询
- 指定key: 对key进行hash取模 详见:
- 自定义Partitioner(partition选择器)
https://cwiki.apache.org/confluence/display/KAFKA/Clients#Clients-HowTheKafkaProjectHandlesClients
核心业务只建议使用官方提供的java客户端
-
不用BTree。
BTree操作复杂度是O(log N),被认为基本上等价于常量时间。但是对磁盘操作则不然,磁盘每次操作大概要10ms,并且每个磁盘在同一时刻只能做一个寻址,所以并行化非常受到限制。
-
appends to files
all operations are O(1) and reads do not block writes or each other
-
ConcurrentSkipListMap