spring kafka消息同步发送、异步发送、异步回调和分区路由发送
- 同步发送
- 异步发送
- 异步发送失败回调
- 分区路由发送
我们在使用spring kafka发送消息的时候是调用send方法点进send方法发现有很多重载方法,下面我们介绍下使用spring kafka同步/异步发送消息并接收异步回调
同步发送
最简单的同步发送方式如下:
public class KafkaServer {
@Autowired
private KafkaTemplate kafkaTemplate;
public void send(){
try {
kafkaTemplate.send("topic","111111111").get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
在这里,send()方法先返回了一个Future对象,然后调用Future对象的get()方法等待kafka响应。如果服务器返回错误,get()方法会抛出异常。如果没有发生错误,我们会得到一个RecordMetadata对象,可以用它获取消息的偏移量。同步发送需要等待kafka服务器的响应吞吐相对较低
异步发送
异步发送方式更简单些,只需要把同步发送的get()方法去掉即可,方式如下:
public class KafkaServer {
@Autowired
private KafkaTemplate kafkaTemplate;
public void send(){
kafkaTemplate.send("test","111111111");
}
}
异步发送相比同步发送能处理更多的消息耗时更少,大多数情况下我们都不需要等待响应,所以大多数情况下我们都会使用异步发送。但是在遇到消息发送失败时我们不能准确的处理,所以我们需要一个异步发送消息失败的回调。
异步发送失败回调
直接上代码:
@Component
public class KafkaSendResultHandler implements ProducerListener {
private static final Logger log = LoggerFactory.getLogger(KafkaSendResultHandler.class);
@Override
public void onSuccess(ProducerRecord producerRecord,RecordMetadata recordMetadata) {
log.info("Message send success : " + producerRecord.toString());
}
@Override
public void onError(ProducerRecord producerRecord, Exception exception) {
log.info("Message send error : " + producerRecord.toString());
}
}
@Service
public class KafkaServer {
@Autowired
private KafkaTemplate kafkaTemplate;
@Autowired
private KafkaSendResultHandler producerListener;
public void send(){
kafkaTemplate.setProducerListener(producerListener);
kafkaTemplate.send("topic","11111");
}
}
在这里我们实现了ProducerListener 接口重写了onSuccess()和onError方法,然后在kafkaServer中我们增加了 kafkaTemplate.setProducerListener(producerListener);
回调类里面我们可以根据业务处理对应发送失败的消息,这样我们讲究解决了发送失败的问题,下面我们看下如何按路由键将消息发送到对应分区。
分区路由发送
当我们的分区数有多个时并且对数据顺序有严格时我们需要保证同样的一条数据发送到同一个分区上,针对这种情况spring kafka提供了对应的发送接口,下面是代码:
@Service
public class KafkaServer {
@Autowired
private KafkaTemplate kafkaTemplate;
public void send(){
// 自定义路由key,唯一
String routeKey = "";
kafkaTemplate.send(new ProducerRecord("topic",routeKey, "111"));
}
}
在这里我们直接调用send() 方法里面传入ProducerRecord对象其中routeKey 就是路由到不同分区的参数。
好了,今天发布的内容就这些了,,欢迎转载!!!!