kafka 生产者拦截器

生产者拦截器

kafka 消息发送到Broker 之前大概需要经过 生产者拦截器序列化器分区器 等一系列处理。本文主要介绍生产者拦截器

生产者拦截器可以在消息发送之前对消息进行拦截。它可以改变消息内容,包括key , value ,topic 等任何信息

通常不推荐修改key , topic , 我们可以给消息添加一些额外信息,比如版本号,过滤一些"非法"消息等。

拦截器接口介绍

java 复制代码
public interface ProducerInterceptor<K, V> extends Configurable {
    ProducerRecord<K, V> onSend(ProducerRecord<K, V> var1);

    void onAcknowledgement(RecordMetadata var1, Exception var2);

    void close();
}

生产者拦截器接口包含三个方法

  • onSend 方法可以对消息进行定制化修改

  • onAcknowledgement 在消息被应答或者发送失败时执行 该方法在IO线程执行,所以不要执行一些耗时操作,会影响消息投递速度

  • close 用于执行一些资源释放的工作

自定义生产者拦截器Demo

该生产者拦截器给消息添加个包含版本号信息的Header ,配置生产者

ProducerConfig.INTERCEPTOR_CLASSES_CONFIG 属性使其生效

java 复制代码
    private Map<String, Object> produceConfigs() {
        Map<String, Object> configMap = new HashMap<>();
        configMap.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
                "localhost:9092");
        configMap.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class);
        configMap.put(ProducerConfig.PARTITIONER_CLASS_CONFIG,CustomPartitioner.class);
        configMap.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, Arrays.asList(CustomerProduceInterector.class));
        return configMap;
    }
java 复制代码
public class CustomerProduceInterector implements ProducerInterceptor {
    @Override
    public ProducerRecord onSend(ProducerRecord producerRecord) {
    
        producerRecord.headers().add(new RecordHeader("version","v1".getBytes()));
        return producerRecord;
    }

    @Override
    public void onAcknowledgement(RecordMetadata recordMetadata, Exception e) {
        System.out.println("onAcknowledgement  ....");
    }

    @Override
    public void close() {

    }

    @Override
    public void configure(Map<String, ?> map) {

    }
}

结语

生产者拦截器还是比较简单,相应的还有消费者拦截器,我们平常业务也未必用到,殊途同归,在一些RPC框架比如dubbo服务提供方和消费端都有类似的拦截器,可以做一些链路追踪等等。

以上就是我个人的理解 喜欢的一起关注交流学习

相关推荐
冷小鱼15 小时前
消息队列(MQ)技术全景科普:从选型到AI+未来
人工智能·kafka·rabbitmq·rocketmq·mq·pulsar
许彰午20 小时前
CacheSQL:一个面向政务系统的内存缓存数据库中间件
java·数据库·缓存·中间件·面试·开源软件·政务
运维老司机1 天前
Kafka 单节点部署(Docker Compose + 数据持久化)
分布式·docker·kafka
JAVA面经实录9171 天前
如何选择适合项目的「限流 / 熔断 / 降级」方案
java·spring·kafka·sentinel·guava
ezreal_pan2 天前
Kafka Docker 部署持久化避坑指南:解决重启后 Cluster ID 不匹配问题
分布式·docker·zookeeper·容器·kafka·devops
亿牛云爬虫专家2 天前
Go爬虫进阶:如何优雅地在Colly框架中实现无缝代理切换?
爬虫·中间件·golang·爬虫代理·colly框架·代理切换·api提取
小张小张爱学习2 天前
Kafka面试题
分布式·kafka
SuperherRo2 天前
服务攻防-中间件安全&Apache&Tomcat&Jetty&Weblogic&AJP协议&反序列化&CVE漏洞
中间件·tomcat·apache·jetty·weblogic
空中海2 天前
第四篇:进阶篇 — 缓存、消息队列、安全与常用中间件
安全·缓存·中间件
Devin~Y2 天前
大厂Java面试实录:Spring Boot/Cloud + Redis/Kafka + JWT + RAG/Agent(小Y翻车版)
java·spring boot·redis·spring cloud·kafka·spring security·jwt