【问题标题】:Kafka Producer Callback performanceKafka Producer 回调性能
【发布时间】:2020-12-17 19:21:36
【问题描述】:

我有 Kafka Produce,它将消息发送到 kafka。我使用帮助存储过程在 onsucess 和 onFailure 中将消息记录在数据库中。如代码所示,我使用的是异步

  1. 我应该将存储库中的 callStoredProcedure 方法标记为同步以避免死锁吗?我相信不需要同步,因为回调将在单个线程中按顺序执行。

  2. 来自下面的链接

    https://kafka.apache.org/10/javadoc/org/apache/kafka/clients/producer/KafkaProducer.html

请注意,回调通常会在 生产者,因此应该相当快,否则他们会延迟 从其他线程发送消息。如果你想执行 建议阻塞或计算昂贵的回调 在回调主体中使用您自己的 Executor 来并行化处理。

我应该在其他线程中执行回调吗? 并且你可以分享代码sn-p如何在其他线程中执行回调。比如在 3 个线程中并行回调

我的代码sn-p

@Autowired
private Myrepository  myrepository;

public void sendMessageToKafka(List<String> message) {
    
            for (String s : message) {
    
                future = kafkaTemplate.send(topicName, message);
    
                future.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
    
                    @Override
                    public void onSuccess(SendResult<String, String> result) {
    
                        System.out.println("Message Sent  " + result.getRecordMetadata().timestamp());
                        
                        myrepository.callStoredProcedure(result,"SUCCESS");
    
                    }
    
                    @Override
                    public void onFailure(Throwable ex) {
    
                        System.out.println(" sending failed  ");
                        myrepository.callStoredProcedure(result,"FAILED");
    
                    }
                });
    
            }

【问题讨论】:

    标签: java spring-boot apache-kafka spring-kafka kafka-producer-api


    【解决方案1】:
    
    private final ExecutorService exec = Executors.newSingleThreadExecutor();
    
    
    ...
    
    this.exec.submit(() -> myrepository.callStoredProcedure(result,"SUCCESS"));
    
    

    任务仍将在单个线程上运行(但不是 Kafka IO 线程)。

    如果它跟不上您的发布速度,您可能需要使用不同的执行器,例如缓存线程池执行器或 Spring 的 ThreadPoolTaskExecutor

    【讨论】:

    • 感谢您的回复。我需要发布大约 20,000 条消息。我会从休息端点读取 20k 条消息,将消息发布到 Kafka 并调用存储过程(具有简单的插入)每条消息。那么你会推荐使用 ExecutorService 或 ThreadPoolTask​​Executor 吗?
    • 您必须进行实验;这取决于您的数据库性能。您可能需要将结果分批并分批提交到数据库以提高性能(在服务器崩溃的情况下有丢失数据的风险)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2016-03-16
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2020-04-05
    • 2020-11-26
    相关资源
    最近更新 更多