前言
前面已经介绍了Kafka的架构知识并引出了Kafka的相关专业名称进行解释
这次分享一下Kafka对生产者发送消息进行处理的运行机制和原理
生产者发送消息两种方式
同步发送消息
程序中线程执行完消息发送操作之后会等待Kafka的消息回应ack
默认等待30秒没有回应就会抛出异常
等待时间和重试次数都可以在设置参数中调整
同步发送消息,消息丢失一般就是长时间没有响应,对这个消息进行消息发送补偿或者持久化丢失消息的记录,处理比较简单
异步发送消息
⽣产者发送完消息后就可以执⾏之后的业务,Kafka代理节点在收到消息后执行完成之后异步调用生产者提供的callback回调方法,这个方法可以让我们对成功或者失败做一些后续处理
异步发送消息,会有发生消息丢失的风险,此时需要使用Kafka的持久化机制防止消息丢失
Kafka是先持久化磁盘后对消息进行读取的转发给消费者的
持久化优化参数ack
ack = 0 不需要Kafka代理节点持久化消息,直接返回ack 消息丢失最高
ack=1(默认): 主代理节点持久化到主题分区,才返回ack给⽣产者,性能和安全性是最均衡的
ack=-1/all。 所有代理节点都把消息持久化到主题分区,才返回ack给⽣产者,这种是最安全的,但是性能是最差的
消息发送缓冲区
kafka默认会创建⼀个消息缓冲区,⽤来存放要发送的消息,缓冲区是32MB
当消息缓冲区中累积的消息总大小达到或超过 16KB 时,线程会将这些消息打包起来发送代理节点
如果不够16kb也会 等待一段时间 (默认 0ms,即立即发送,有参数可以自己设置) 后将这些消息打包起来发送到Kafka的代理节点
消息发送缓冲区是可以增加吞吐量但是也增大了延迟,设置等待时间也是对业务中延迟和吞吐量的一种衡量
综上所述,Kafka应对异步发送消息,防止消息丢失的方法有: 1、Kafka自身的消息持久化机制2、callbak回调监控可以做到对丢失消息进行监控