kafka的消息是不断追加到文件中的,这个特性使kafka能够充分利用磁盘的顺序读写性能linux
顺序读写不须要硬盘磁头的寻道时间,只需不多的扇区旋转时间,因此速度远快于随机读写缓存
生产者负责写入数据,Kafka会将消息持久化到磁盘,保证不会丢失数据,Kafka采用了俩个技术提升写入的速度。服务器
1.顺序写入:在大学的计算机组成(划重点)里咱们学过,硬盘是机械结构,须要指针寻址找到存储数据的位置,因此,若是是随机IO,磁盘会进行频繁的寻址,致使写入速度降低。Kafka使用了顺序IO提升了磁盘的写入速度,Kafka会将数据顺序插入到文件末尾,消费者端经过控制偏移量来读取消息,这样作会致使数据没法删除,时间一长,磁盘空间会满,kafka提供了2种策略来删除数据:基于时间删除和基于partition文件的大小删除。网络
2.Memory Mapped Files:这个和Java NIO中的内存映射基本相同,在大学的计算机原理里咱们学过(划重点),mmf直接利用操做系统的Page来实现文件到物理内存的映射,完成以后对物理内存的操做会直接同步到硬盘。mmf经过内存映射的方式大大提升了IO速率,省去了用户空间到内核空间的复制。它的缺点显而易见--不可靠,当发生宕机而数据未同步到硬盘时,数据会丢失,Kafka提供了produce.type参数来控制是否主动的进行刷新,若是kafka写入到mmp后当即flush再返回给生产者则为同步模式,反之为异步模式。app
在这以前先来了解一下零拷贝(直接让操做系统的 Cache 中的数据发送到网卡后传输给下游的消费者):平时从服务器读取静态文件时,服务器先将文件从复制到内核空间,再复制到用户空间,最后再复制到内核空间并经过网卡发送出去,而零拷贝则是直接从内核到内核再到网卡,省去了用户空间的复制。异步
Kafka把全部的消息存放到一个文件中,当消费者须要数据的时候直接将文件发送给消费者,好比10W的消息共10M,所有发送给消费者,10M的消息在内网中传输是很是快的,假如须要1s,那么kafka的tps就是10w。Zero copy对应的是Linux中sendfile函数,这个函数会接受一个offsize来肯定从哪里开始读取。现实中,不可能将整个文件所有发给消费者,他经过消费者传递过来的偏移量来使用零拷贝读取指定内容的数据返回给消费者。函数
在Linux kernel2.2 以后出现了一种叫作"零拷贝(zero-copy)"系统调用机制,就是跳过“用户缓冲区”的拷贝,创建一个磁盘空间和内存的直接映射,数据再也不复制到“用户态缓冲区”,系统上下文切换减小为2次,能够提高一倍的性能。性能
kafka中的topic中的内容能够被分为多分partition存在,每一个partition又分为多个段segment,因此每次操做都是针对一小部分作操做,很轻便,而且增长并行操做
的能力大数据
kafka容许进行批量发送消息,producter发送消息的时候,能够将消息缓存在本地,等到了固定条件发送到kafka操作系统
Kafka还支持对消息集合进行压缩,Producer能够经过GZIP或Snappy格式对消息集合进行压缩。
压缩的好处就是减小传输的数据量,减轻对网络传输的压力。
Producer压缩以后,在Consumer需进行解压,虽然增长了CPU的工做,但在对大数据处理上,瓶颈在网络上而不是CPU,因此这个成本很值得
批量发送
和数据压缩
一块儿使用,单条作数据压缩的话,效果不明显
Kafka的设计目标是高吞吐量,它比其它消息系统快的缘由体如今如下几方面:
一、Kafka操做的是序列文件I / O(序列文件的特征是按顺序写,按顺序读),为保证顺序,Kafka强制点对点的按顺序传递消息,这意味着,一个consumer在消息流(或分区)中只有一个位置。
二、Kafka不保存消息的状态,即消息是否被“消费”。通常的消息系统须要保存消息的状态,而且还须要以随机访问的形式更新消息的状态。而Kafka 的作法是保存Consumer在Topic分区中的位置offset,在offset以前的消息是已被“消费”的,在offset以后则为未“消费”的,而且offset是能够任意移动的,这样就消除了大部分的随机IO。
三、Kafka支持点对点的批量消息传递。
四、Kafka的消息存储在OS pagecache(页缓存,page cache的大小为一页,一般为4K,在Linux读写文件时,它用于缓存文件的逻辑内容,从而加快对磁盘上映像和数据的访问)。