Kafka 生产者缓存

不建议使用:

java 复制代码
public void produce(String message) {
    DmsProducer<String, String> producer = new DmsProducer<String, String>();
    try {
        producer.produce("test1",0, "key", message);
    } finally {
        producer.close();
    }
}

原因:

每次调用produce函数时,都会新建一个producer,每次都需要进行新建与broker连接->获取分区元数据->生产消息的过程,存在性能瓶颈

正确用法:

java 复制代码
private DmsProducer producer;

public void init() {
    this.producer = new DmsProducer();
}

public void produce(String message) {
    if (producer == null) {
        this.init();
    }
    produce(message);
}

public void tearDown() {
    if (this.producer != null) {
        producer.close();
    }
}

进阶优化:

按照上面的使用方式,如果在多线程的环境下,可能会出现一个producer单个sender线程会有性能瓶颈(单发送线程),可能导致,导致入大于出,最终缓存堆积

示例代码:

private ProducerLru cache = new ProducerLru(5);

java 复制代码
class ProducerLru<k, v> extends LinkedHashMap<k, v> {
    
    private int capacity;
    
    public ProducerLru(int capacity) {
        super(capacity, 0.75f, true);
        this.capacity = capacity;
    }
    
    @Override
    protected boolean removeEldestEntry(Map.Entry<k, v> eldest) {
        if (size() > capacity) {
            if (eldest.getValue() instanceof  DmsProducer) {
                DmsProducer producer = (DmsProducer) eldest.getValue();
                producer.close();
            }
        }
        return super.size() > capacity;
    }
    
}

public static void main(String[] args) throws Exception {
    Main main = new Main();
    String topicA = "topicA";
    DmsProducer producer;
    if (main.cache.get(topicA) != null) {
        producer = (DmsProducer) main.cache.get(topicA);
        main.cache.put(topicA, producer);
    } else {
        producer = new DmsProducer();
    }
    main.cache.put(topicA, producer);
}

上述示例中,producerLru的key可以是topic名称,如果是多个用户场景下,也可以以用户名作为key,可以根据实际业务场景进行调整

相关推荐
猿究院_夏燊3 小时前
Spring Bean 生命周期
java·后端·spring
Chenyu_3103 小时前
DPDK、TC 和 XDP:Linux 高性能网络到底在优化什么
linux·服务器·网络·缓存
流烟默4 小时前
MCP第 5 篇:用 Spring AI 写 MCP:注解、自动配置、ChatClient 集成
人工智能·spring·mcp封装
来福猿7 小时前
SpringCloud Config 源码分析:配置拉取、刷新与多环境管理
后端·spring·spring cloud
雷一言说10 小时前
Spring AI 2.0 RAG:用 Metadata Filter 做多租户检索隔离
java·spring
摇滚侠10 小时前
《大模型应用开发实践:基于 Spring AI+DeepSeek 实现》第 11 章 大模型技术概览 阅读笔记 1
人工智能·笔记·spring
我不会起名字32210 小时前
Kafka 分区数到底设几个:吞吐量、顺序性与 rebalance 代价的取舍
kafka·消息队列·调优·分区
hflmwl816 小时前
RedisDesktopManager安装包中文版官方下载,redis可视化客户端工具下载
数据库·redis·缓存·可视化客户端工具
一枕槐安48716 小时前
大模型应用后端设计:上下文管理、缓存、降级策略的工程方案总结
java·spring·缓存
步行cgn16 小时前
@RequestMapping 注解详解
java·后端·spring