kafka 高性能IO

1、批量消息提升服务端broker处理能力,减少了broker处理请求的次数
(1)发送端
Kafka 的 Producer 只提供了单条发送的 send() 方法,并没有提供任何批量发送的接口。原因是,Kafka 根本就没有提供单条发送的功能,Kafka 的客户端 SDK 在实现消息发送逻辑的时候,采用了异步批量发送的机制。当你调用 send() 方法发送一条消息之后,无论你是同步发送send(ProducerRecord<K,V> record)还是异步发送send(ProducerRecord<K,V> record, Callback callback),Kafka 都不会立即就把这条消息发送出去。它会先把这条消息,存放在内存中缓存起来,然后选择合适的时机把缓存中的所有消息组成一批,一次性发给 Broker。(linger.ms和batch.size)
(2)broker端
不会将这一批消息拆开,而是作为整体处理
(3)consumer端
consumer把这批消息拆开,一条一条处理
2、使用顺序读写提升磁盘IO性能
对于每个分区,把从producer收到的消息,顺序写入对应的log文件中,写满一个,再写下一个;
读取的时候也是从某个位置开始顺序的读取
3、缓存,利用PageCache加速读写消息
读写文件时都是从PageCache中读取,如果PageCache中没有,则os引发断页中断,程序的读取进程阻塞,OS把文件读取到PageCache中,程序再从PageCache中读取。OS清理内存中缓存的策略LRU

PageCache 是由操作系统来维护的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了实现高性能Kafka从以下几个方面进行了优化: 1. 批处理:Kafka通过批量处理消息来提高性能。生产者可以将多个消息一起发送到Kafka代理,而不是单独发送每个消息。消费者也可以一次拉取多个消息,而不是单独拉取每个消息。这种批处理方式可以减少网络开销和磁盘IO,从而提高性能。 2. 零拷贝:Kafka使用零拷贝技术来避免数据在内存和磁盘之间的复制。当消息从生产者发送到Kafka代理时,Kafka可以直接将消息从内存复制到网络套接字缓冲区中,而不需要将消息从内存复制到用户空间缓冲区,再从用户空间缓冲区复制到内核空间缓冲区,最后再从内核空间缓冲区复制到网络套接字缓冲区。这种零拷贝方式可以减少CPU和内存的开销,从而提高性能。 3. 分区和副本:Kafka将每个主题分成多个分区,并将每个分区的数据复制到多个副本中。这种分区和副本的方式可以提高并发性和可靠性。生产者可以将消息发送到不同的分区,消费者可以从不同的副本读取消息,从而提高并发性。如果某个副本失效,Kafka可以从其他副本中恢复数据,从而提高可靠性。 4. 高效压缩:Kafka支持多种压缩算法,包括Gzip、Snappy和LZ4。这些压缩算法可以在减少网络传输数据的同时,保证数据的可靠性和完整性。 下面是一个使用Kafka Python客户端库kafka-python发送和接收消息的例子: ```python from kafka import KafkaProducer, KafkaConsumer # 生产者发送消息 producer = KafkaProducer(bootstrap_servers=['localhost:9092']) producer.send('test', b'hello world') # 消费者接收消息 consumer = KafkaConsumer('test', bootstrap_servers=['localhost:9092']) for message in consumer: print(message.value) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值