1. Kafka事务的使用
Kafka中的事务特性主要用于以下两种场景:
生产者发送多条消息可以封装在一个事务中,形成一个原子操作。多条消息要么都发送成功,要么都发送失败。
read-process-write模式:将消息消费和生产封装在一个事务中,形成一个原子操作。在一个流式处理的应用中,常常一个服务需要从上游接收消息,然后经过处理后送达到下游,这就对应着消息的消费和生成。
当事务中仅仅存在Consumer消费消息的操作时,它和Consumer手动提交Offset并没有区别。因此单纯的消费消息并不是Kafka引入事务机制的原因,单纯的消费消息也没有必要存在于一个事务中。
Kafka producer API提供了以下接口用于事务操作:
/*** 初始化事务*/
public voidinitTransactions();/*** 开启事务*/
public void beginTransaction() throwsProducerFencedException ;/*** 在事务内提交已经消费的偏移量*/
public void sendOffsetsToTransaction(Mapoffsets,
String consumerGroupId)throwsProducerFencedException ;/*** 提交事务*/
public void commitTransaction() throwsProducerFencedException;/*** 丢弃事务*/
public void abortTransaction() throws ProducerFencedException ;
下面是使用Kafka事务特性的例子,这段代码Producer开启了一个事务,然后在这个事务中发送了两条消息。这两条消息要么都发送成功,要么都失败。
KafkaProducer producer =createKafkaProducer("bootstrap.servers", "localhost:9092","transactional.id”, “my-transactional-id");
producer.initTransactions();
producer.beginTransaction();
producer.send("outputTopic",