kafka API 自定义拦截器

Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.

目录

概述

需求:

设计思路

实现思路分析

  • Kafka API 自定义拦截器
    在 Kafka 中,拦截器是一种机制,可以通过在消息发送和消费的过程中添加自定义的逻辑。拦截器可以用于各种用途,例如日志记录、监视、数据转换等。

要实现自定义拦截器,需要创建一个类,实现 Kafka 的 ProducerInterceptorConsumerInterceptor 接口,具体取决于你是要在消息发送还是消息消费时使用拦截器。

以下是一个简单的例子,展示了如何实现一个简单的日志记录拦截器:

import org.apache.kafka.clients.consumer.ConsumerInterceptor;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.OffsetAndMetadata;
import org.apache.kafka.common.Cluster;
import org.apache.kafka.common.TopicPartition;

import java.util.Map;

public class LoggingInterceptor implements ConsumerInterceptor<String, String> {

    @Override
    public ConsumerRecords<String, String> onConsume(ConsumerRecords<String, String> records) {
        // 在消息消费之前运行的逻辑
        // 在这里可以对消息进行处理或记录日志
        for (ConsumerRecord<String, String> record : records) {
            System.out.println("Consumed message: " + record.value());
        }
        return records;
    }

    @Override
    public void onCommit(Map<TopicPartition, OffsetAndMetadata> offsets) {
        // 在提交偏移量之前运行的逻辑
        // 在这里可以记录偏移量或其他信息
    }

    @Override
    public void close() {
        // 关闭拦截器时运行的逻辑
        // 在这里可以清理资源或进行其他操作
    }

    @Override
    public void configure(Map<String, ?> configs) {
        // 初始化拦截器时运行的逻辑
        // 在这里可以读取配置参数或进行其他初始化操作
    }
}

要使用自定义拦截器,首先需要创建一个 Kafka 的配置对象,并将拦截器添加到配置中:

import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.apache.kafka.common.serialization.StringDeserializer;

import java.util.Properties;

public class KafkaInterceptorExample {

    public static void main(String[] args) {
        // 创建生产者配置
        Properties producerConfig = new Properties();
        producerConfig.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        producerConfig.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        producerConfig.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        producerConfig.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, LoggingInterceptor.class.getName());

        // 创建消费者配置
        Properties consumerConfig = new Properties();
        consumerConfig.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        consumerConfig.put(ConsumerConfig.GROUP_ID_CONFIG, "my-consumer-group");
        consumerConfig.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        consumerConfig.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        consumerConfig.put(ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG, LoggingInterceptor.class.getName());

        // 创建生产者和消费者并进行发送和接收消息的操作
        // ...
    }
}

在上面的示例中,我们创建了一个 LoggingInterceptor 类,并将其添加到生产者和消费者的配置中。在运行生产者和消费者时,每条消息都将被打印到控制台上。

需要注意的是,拦截器的运行顺序与它们在配置中的顺序相同。如果你有多个拦截器,它们将按照配置中的顺序依次运行。

这只是一个简单的示例,你可以根据自己的需求进行更复杂的拦截器实现。你可以在拦截器中添加任何你需要的逻辑,例如处理消息、记录日志、修改消息内容等。

- 接口
  - org.apache.kafka.clients.producer.ProducerInterceptor
  - org.apache.kafka.clients.consumer.ConsumerInterceptor
- 方法
  - onSend(ProducerRecord record):在消息发送前对记录进行处理
  - onAcknowledgement(RecordMetadata metadata, Exception exception):在消息确认后对结果进行处理
  - onConsume(ConsumerRecords records):在消息消费前对记录进行处理
  - onCommit(Map offsets):在提交消费位移后处理位移信息
  - close():关闭拦截器
- 配置
  - interceptor.classes:指定拦截器类名
- 注意事项
  - 拦截器按照配置的顺序依次运行
  - 拦截器应该保持状态无关,避免共享状态
  - 异常处理应该做充分的检查与保护

建议和注意事项:

1️⃣ 在使用自定义拦截器时,了解其作用非常重要。它可以让您在发送或消费 Kafka 消息之前后进行定制化处理。

2️⃣ 自定义拦截器的使用场景比较多样化。一些常见的场景包括安全验证、日志记录和消息转换等。

3️⃣ Kafka 提供了 ProducerInterceptorConsumerInterceptor 接口供您实现自定义拦截器。根据您的需求选择合适的接口。

4️⃣ 拦截器的核心方法包括 onSendonAcknowledgementonConsumeonCommitclose。您可以根据需求实现这些方法来实现对记录和结果的处理。

5️⃣ 在配置 Kafka 生产者或消费者时,通过设置 interceptor.classes 参数来指定拦截器的类名。

6️⃣ 在实现拦截器时,需要注意一些细节。例如,拦截器按照配置的顺序依次运行,应保持状态无关,避免共享状态,以及注意异常处理等。

参考资料和推荐阅读

参考资料
官方文档
开源社区
博客文章
书籍推荐
1.暂无

欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!同时,期望各位大佬的批评指正~,如果有兴趣,可以加文末的交流群,大家一起进步哈

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执于代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值