Java 卡夫卡生产者回调性能
我让Kafka Product将消息发送给Kafka,并使用帮助存储过程将消息记录在OnSuces和onFailure中的数据库中。如代码所示,我正在使用异步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线程中执行 因此,生产商应该合理地加快生产速度,否则他们将延迟生产 从其他线程发送消息。如果你想执行 阻塞或计算开销大的回调,建议 在回调主体中使用您自己
@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吗?您必须进行试验;这取决于您的数据库性能。您可能需要对结果进行批处理,并将其分批提交给数据库以提高性能(在服务器崩溃时有丢失数据的风险).