我正在用Spring Boot编写应用程序,因此我要写给Kafka:
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
然后进入我的方法:
kafkaTemplate.send(topic, data)
但是我觉得我只是依靠它来工作,我怎么知道它是否起作用?如果它是异步的,那么返回200代码并希望它能正常工作是个好习惯吗?我很困惑。如果没有Kafka,这不会失败吗?是否不应该提示我捕获异常?
答案 0 :(得分:1)
是的,如果Kafka不可用,则.send()
呼叫将失败,但是如果您异步发送它,则不会通知任何人。您可以指定将来最终完成时要执行的回调。完整的界面规范:https://kafka.apache.org/20/javadoc/org/apache/kafka/clients/producer/Callback.html
来自此处的官方Kafka Javadoc:https://kafka.apache.org/20/javadoc/index.html?org/apache/kafka/clients/producer/KafkaProducer.html
完全无阻塞的用法可以利用Callback参数来 提供在请求完成后将调用的回调。
ProducerRecord<byte[],byte[]> record = new ProducerRecord<byte[],byte[]>("the-topic", key, value); producer.send(myRecord, new Callback() { public void onCompletion(RecordMetadata metadata, Exception e) { if(e != null) { e.printStackTrace(); } else { System.out.println("The offset of the record we just sent is: " + metadata.offset()); } } });
答案 1 :(得分:1)
除了@mjuarez提到的内容外,您还可以尝试使用两个卡夫卡生产者属性。其中一个是ProducerConfig.ACKS_CONFIG
,它使您可以设置对于用例来说安全的确认级别。该旋钮具有三个可能的值。来自卡夫卡doc
acks=0
:生产者不在乎来自服务器的确认,而是将其视为已发送。acks=1
:这意味着领导者会将记录写到其本地日志中,但会做出响应而无需等待所有关注者的完全确认。acks=all
:这意味着领导者将等待整套同步副本确认记录。另一个属性是ProducerConfig.RETRIES_CONFIG
。设置大于零的值将导致客户端重新发送其发送失败并带有潜在的瞬时错误的任何记录。
答案 2 :(得分:-2)
您可以在向kafka发送消息时使用以下命令:
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic-name
在运行上面的命令时,您应该运行代码,如果发送消息成功,则必须在控制台上打印消息。
此外,如果无法建立与资源的任何其他连接,则同样地,进行任何类型的操作也会导致异常的产生。