一.kafka吞吐量
kafka吞吐量大原因
1.kafka采用追加写入消息的方式,只能在日志文件末尾追加写入新的数据,不允许修改已写入的消息。
kafka采用零拷贝技术,确切的说是sendfile -- java的FileChannel.transferTo方法。
零拷贝:首先在内核驱动程序处理I/O数据的时候,他不在需要进行上下文的切换,节省了内核缓冲区与用户态应用程序缓冲区之间的数据拷贝,
同时他利用直接存储器访问技术执行I/O操作,因此也避免了OS内核缓冲区之间的数据拷贝。
2.采用页缓存,因此直接命中缓存
高吞吐量、低延迟的设计目标
1.大量的使用操作系统页缓存,内存操作速度快且命中率高
2.kafka不直接参与物理I/O操作,而是交由最擅长此时的操作系统来完成。
3.采用追加写入方式,摒弃了缓慢的磁盘随机读/写操作。
4.使用以sendfile为代表的零拷贝技术加强网络间的操作传输效率。
二.消息的持久化
1.解耦消息发送和消息消费:通过消息持久化式的生产方不在直接和消费者方耦合,kafka只是简单地把消息生产出来交给kafka服务器保存,
由此提高了整体的吞吐量。
2.实现灵活的消息处理:对于已经处理过的消息可能在未来的某个时间点重新处理一次,即所谓的消息重演。
消息持久化可以很方便的实现这样的需求。
三.负载均衡和故障迁移
1.负载均衡:通过智能化的分区领导者选举实现的。
2.故障迁移:服务器与备份服务器之间采用心跳维持的(会话机制),当心跳无法维持或主服务器注册到服务中心的挥发超时到期了,认为主服务器无法正常工作,
集群会启用某个备份服务器来代替工作。
四.伸缩性
kafka服务器上的状态统一交由zookeeper保管。当然kafka会保留很轻量级的内部状态,状态维护一致性代价很低。
五.kafka的使用场景
1.消息传输
2.网站行为日志追踪
3.审计数据收集
4.日志收集
5.Event sourcing 领域驱动设计(DDD) : 使用序列标识状态变更,这个和kafka的设计特性相同。
6.流式处理