21-Kafka扩展问题

Kafka为何如此之快?

由于Kafka遵循了一定的策略,这也是它设计的一部分,以使得它性能更好、更快。;

  • 顺序写IO:现代操作系统将其大不部分可用的内存分配给磁盘缓存,并且更快的用于存储和检索顺序数据;
  • 零拷贝:由于根本没有修改数据,因此将磁盘中的数据不必要的加载到应用程序内存中,因此,它没有将其加载到应用程序中,而是通过Socket字节,缓冲区以及网络从context缓存区发送了相同的数据;sendFile
  • 消息批处理:为了避免多次网络交互,将多个消息分组在一起;
  • 消息压缩:在通过网络传输消息之前,使用gzip、snappy等压缩算法对消息进行压缩,然后在Consumer中使用API将其解压。

Kafka和其他消息队列的区别

  • Kafka操作的是序列文件I / O(序列文件的特征是按顺序写,按顺序读),为保证顺序,Kafka强制点对点的按顺序传递消息,这意味着,一个consumer在消息流(或分区)中只有一个位置。
  • Kafka不保存消息的状态,即消息是否被“消费”。一般的消息系统需要保存消息的状态,并且还需要以随机访问的形式更新消息的状态。而Kafka 的做法是保存Consumer在Topic分区中的位置offset,在offset之前的消息是已被“消费”的,在offset之后则为未“消费”的,并且offset是可以任意移动的,这样就消除了大部分的随机IO。
  • Kafka支持点对点的批量消息传递。
  • Kafka的消息存储在OS pagecache(页缓存,page cache的大小为一页,通常为4K,在Linux读写文件时,它用于缓存文件的逻辑内容,从而加快对磁盘上映像和数据的访问)。

推拉模式的比较

推模式

  • 推模式优点
    • 消息实时性高
    • 对于消费者使用来说更简单
  • 推模式缺点
    • 推送速率难以适应消费速率

拉模式

  • 拉模式优点
    • 拉模式下 Broker 就相对轻松了
    • 拉模式可以更合适的进行消息的批量发送
  • 拉模式缺点
    • 消息延迟
    • 消息忙请求,忙请求就是比如消息隔了几个小时才有,那么在几个小时之内消费者的请求都是无效的,在做无用功。

RocketMQ和Kafka对于拉模式的优化

  • Kafka的长轮询
    • 消费者去 Broker 拉消息,定义了一个超时时间,也就是说消费者去请求消息,如果有的话马上返回消息,如果没有的话消费者等着直到超时,然后再次发起拉消息请求。

21-Kafka扩展问题
https://x-leonidas.github.io/2022/02/01/11技术栈/MQ/21-Kafka扩展问题/
作者
听风
发布于
2022年2月1日
更新于
2024年12月23日
许可协议