Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 卡夫卡生产者回调性能_Java_Spring Boot_Apache Kafka_Spring Kafka_Kafka Producer Api - Fatal编程技术网

Java 卡夫卡生产者回调性能

Java 卡夫卡生产者回调性能,java,spring-boot,apache-kafka,spring-kafka,kafka-producer-api,Java,Spring Boot,Apache Kafka,Spring Kafka,Kafka Producer Api,我让Kafka Product将消息发送给Kafka,并使用帮助存储过程将消息记录在OnSuces和onFailure中的数据库中。如代码所示,我正在使用异步 我是否应该将存储库中的callStoredProcedure方法标记为已同步以避免死锁?我相信不需要同步,因为回调将在单个线程中顺序执行 从下面的链接 请注意,回调通常会在的I/O线程中执行 因此,生产商应该合理地加快生产速度,否则他们将延迟生产 从其他线程发送消息。如果你想执行 阻塞或计算开销大的回调,建议 在回调主体中使用您自己

我让Kafka Product将消息发送给Kafka,并使用帮助存储过程将消息记录在OnSuces和onFailure中的数据库中。如代码所示,我正在使用异步

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

  • 从下面的链接

  • 请注意,回调通常会在的I/O线程中执行 因此,生产商应该合理地加快生产速度,否则他们将延迟生产 从其他线程发送消息。如果你想执行 阻塞或计算开销大的回调,建议 在回调主体中使用您自己的执行器来并行处理

    我应该在其他线程中执行回调吗? 你能分享一下如何在其他线程中执行回调的代码片段吗。类似于3个线程中的并行回调

    我的代码片段

    @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");
        
                        }
                    });
        
                }
    
    @Autowired
    私有Myrepository Myrepository;
    公共无效sendMessageToKafka(列表消息){
    for(字符串s:消息){
    future=kafkaTemplate.send(主题名、消息);
    future.addCallback(新ListenableFutureCallback(){
    @凌驾
    成功时公共无效(SendResult结果){
    System.out.println(“已发送消息”+result.getRecordMetadata().timestamp());
    myrepository.CallStoredProcess(结果“成功”);
    }
    @凌驾
    失效时的公共无效(可丢弃的ex){
    System.out.println(“发送失败”);
    myrepository.CallStoredProcess(结果为“失败”);
    }
    });
    }
    
    
    private final executor service exec=Executors.newSingleThreadExecutor();
    ...
    this.exec.submit(()->myrepository.CallStoredProcess(结果,“成功”));
    
    任务仍将在单个线程(但不是Kafka IO线程)上运行


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

    谢谢您的回复。我需要发布大约20000条消息。我会从rest端点读取20k条消息,将消息发布到Kafka并调用存储的每个消息的过程(具有简单的插入)。因此,您建议使用ExecutorService或ThreadPoolTaskExecutor吗?您必须进行试验;这取决于您的数据库性能。您可能需要对结果进行批处理,并将其分批提交给数据库以提高性能(在服务器崩溃时有丢失数据的风险).