1
拦截器原理
Producer
拦截器
(interceptor)
是在
Kafka 0.10
版本被引入的,主要用于实现
clients
端的定
制化控制逻辑。
对于
producer
而言,
interceptor
使得用户在消息发送前以及
producer
回调逻辑前有机会
对消息做一些定制化需求,比如
修改消息
等。同时,
producer
允许用户指定多个
interceptor
按序作用于同一条消息从而形成一个拦截链
(interceptor chain)
。
Intercetpor
的实现接口是
org.apache.kafka.clients.producer.ProducerInterceptor
,其定义的方法包括:
(
1
)
configure(configs)
获取配置信息和初始化数据时调用。
(2)
onSend(ProducerRecord)
:
该方法封装进
KafkaProducer.send
方法中,即它运行在用户主线程中。
Producer
确保在
消息被序列化以及计算分区前调用该方法。
用户可以在该方法中对消息做任何操作,但最好
保证不要修改消息所属的
topic
和分区,
否则会影响目标分区的计算。
(3)
onAcknowledgement(RecordMetadata, Exception)
:
该方法会在消息从
RecordAccumulator
成功发送到
Kafka Broker
之后,或者在发送过程
中失败时调用。
并且通常都是在
producer
回调逻辑触发之前。
onAcknowledgement
运行在
producer
的
IO
线程中,因此不要在该方法中放入很重的逻辑,否则会拖慢
producer
的消息
发送效率。
(4)
close
:
关闭
interceptor
,主要用于执行一些资源清理工作
如前所述,
interceptor
可能被运行在多个线程中,因此在具体实现时用户需要自行确保
线程安全。另外
倘若指定了多个
interceptor
,则
producer
将按照指定顺序调用它们
,并仅仅
是捕获每个
interceptor
可能抛出的异常记录到错误日志中而非在向上传递。这在使用过程中
要特别留意。
2
拦截器案例
1
)需求:
实现一个简单的双
interceptor
组成的拦截链。第一个
interceptor
会在消息发送前将时间
戳信息加到消息
value
的最前部;第二个
interceptor
会在消息发送后更新成功发送消息数或
失败发送消息数。
![](https://i-blog.csdnimg.cn/blog_migrate/643f45122f1e7901383b60bbb99b4ad0.png)
2
)案例实操
(
1
)增加时间戳拦截器
![](https://i-blog.csdnimg.cn/blog_migrate/f343a23038c2550ba53c03e030b0d3e2.png)
(2)统计发送消息成功和发送失败消息数,并在
producer
关闭时打印这两个计数器
![](https://i-blog.csdnimg.cn/blog_migrate/29fb7130f0128898d76ef68640b96f75.png)
(3)
producer
主程序
![](https://i-blog.csdnimg.cn/blog_migrate/2f0ee0977e1b9da770644f95e0dc50c6.png)
3
)测试
(
1
)在
kafka
上启动消费者,然后运行客户端
java
程序。
![](https://i-blog.csdnimg.cn/blog_migrate/a8519c181f934953f6d6eaae2d75d762.png)