特性
高吞吐
kafka每秒能处理十万次的消息(单机吞吐10w和rocketmq一样)
零拷贝
传统的「从磁盘读数据然后从网卡发出」的过程:
使用零拷贝:
DMA
Direct Memory Access, 所谓的零拷贝指的就是利用DMA来实现无「用户态」和「内核态」之间的数据拷贝
传统上硬件访问内存需要CPU控制并通过操作系统调度,但某些硬件可以直接访问内存不用经过CPU和OS:
支持DMA的硬件有:
golang中使用DMA零拷贝可以使用Sendfile juejin.cn/editor/draf…
缺点
只分区有序
只是partition有序, 而不是全局有序
不支持延迟消息
可以自己实现, 通过redis的zset, 其中score就是要发布的时间, 然后通过一个cronjob定时读比较score和当前时间戳
多Topic性能下降明显
- 在 topic 较少时,Kafka 的吞吐量、延迟更低
- 在 topic 从 68 到 256 的增长过程中, Kafka 性能劣化 98%
- 在 topic 从 68 到 256 的增长过程中, RocketMQ 性能仅劣化 16%
原因在于kafka当topic增多, 每个broker里的partition就会变多, 磁盘随机读写的概率变高
相反,RocketMQ 在物理上只存在一个文件,topic 和 分区都是逻辑概念,所以 topic 增加不会导致 RocketMQ 性能的急剧下降。因此,Kafka 适合少量 topic 的场景, RocketMQ 适合多 topic 场景。
Zookeeper的应用
信息存储
/brokers下都是broker的临时节点
/consumers下都是consumer的临时节点
/controller是controller的临时节点
Partition
一个partition能被消费到的