基于Kafka消息驱动最终一致事务(二)

时间:2023-03-09 07:41:58
基于Kafka消息驱动最终一致事务(二)

实现用例分析

上篇基于Kafka消息驱动最终一致事务(一)介绍BASE的理论,接着我们引入一个实例看如何实现BASE,我们会用图7显示的算法实现BASE。

aaarticlea/jpeg;base64,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*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" alt="" />

首先介绍使用技术栈

JDK:1.8

Spring:spring-boot,spring-data-jpa

数据库:Mysql

消息服务器:Kafka

数据表

用户库user创建用户表user,更新应用表updates_applied

CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`amt_sold` INT(11) NOT NULL DEFAULT '',
`amt_bought` INT(11) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
); CREATE TABLE `updates_applied` (
`trans_id` INT(11) NOT NULL,
`balance` VARCHAR(50) NOT NULL,
`user_id` INT(11) NOT NULL
);

交易库transaction创建交易库表transaction

CREATE TABLE `transaction` (
`xid` INT(11) NOT NULL AUTO_INCREMENT,
`seller_id` INT(11) NOT NULL,
`buyer_id` INT(11) NOT NULL,
`amount` INT(11) NOT NULL,
PRIMARY KEY (`xid`)
);

配置两个数据源

使用JavaConfig方式。其它damain类,repository类,service类请看源码github地址:https://github.com/birdstudiocn/spring-sample/tree/master/Message-Driven-Sample

package cn.birdstudio.user.domain;

import javax.sql.DataSource;

import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager; @Configuration
@EnableJpaRepositories(basePackageClasses = User.class, entityManagerFactoryRef = "userEntityManagerFactory", transactionManagerRef = "userTransactionManager")
class UserDataSourceConfiguration {
@Bean @ConfigurationProperties("app.datasource.user")
DataSourceProperties userDataSourceProperties() {
return new DataSourceProperties();
} @Bean @ConfigurationProperties("app.datasource.user")
DataSource userDataSource() {
return userDataSourceProperties().initializeDataSourceBuilder().build();
} @Bean
LocalContainerEntityManagerFactoryBean userEntityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(false);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan(User.class.getPackage().getName());
factory.setDataSource(userDataSource());
factory.setPersistenceUnitName("user");
return factory;
} @Bean
PlatformTransactionManager userTransactionManager() {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(userEntityManagerFactory().getObject());
return txManager;
}
}

TransactionDataSourceConfiguration

package cn.birdstudio.transaction.domain;

import javax.sql.DataSource;

import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager; @Configuration
@EnableJpaRepositories(basePackageClasses = Transaction.class, entityManagerFactoryRef = "transactionEntityManagerFactory", transactionManagerRef = "transactionManager")
class TransactionDataSourceConfiguration {
@Bean
@ConfigurationProperties("app.datasource.transaction")
DataSourceProperties transactionDataSourceProperties() {
return new DataSourceProperties();
} @Bean
@ConfigurationProperties("app.datasource.transaction")
DataSource transactionDataSource() {
return transactionDataSourceProperties().initializeDataSourceBuilder().build();
} @Bean
LocalContainerEntityManagerFactoryBean transactionEntityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(false);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan(Transaction.class.getPackage().getName());
factory.setDataSource(transactionDataSource());
factory.setPersistenceUnitName("transaction");
return factory;
} @Bean
PlatformTransactionManager transactionManager() {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(transactionEntityManagerFactory().getObject());
return txManager;
}
}

配置Kafka消息服务

生产者配置类KafkaProducerConfig.java,配置KafkaTransactionManager必须设置producerFactory.setTransactionIdPrefix("trans");

Configuration
public class KafkaProducerConfig {
@Bean
public ProducerFactory<String, Map<String, Object>> producerFactory() {
DefaultKafkaProducerFactory<String, Map<String, Object>> producerFactory = new DefaultKafkaProducerFactory<>(
producerConfigs());
producerFactory.setTransactionIdPrefix("trans");
return producerFactory;
} @Bean
public Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "172.16.1.168:9092");
props.put(ProducerConfig.RETRIES_CONFIG, 2);
props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
props.put(ProducerConfig.LINGER_MS_CONFIG, 1);
props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class); return props;
} @Bean
public KafkaTemplate<String, Map<String, Object>> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory());
}
}

消费者配置类KafkaConsumerConfig.java,配置KafkaTransactionManager

@Configuration
@EnableKafka
public class KafkaConsumerConfig {
@Bean
public KafkaListenerContainerFactory<?> kafkaListenerContainerFactory(
ProducerFactory<String, Map<String, Object>> producerFactory) {
ConcurrentKafkaListenerContainerFactory<String, TransactionMessage> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
//factory.setMessageConverter(new StringJsonMessageConverter());
//factory.setConcurrency(3);
factory.getContainerProperties().setPollTimeout(3000);
factory.getContainerProperties().setTransactionManager(new KafkaTransactionManager<>(producerFactory));
return factory;
} @Bean
public ConsumerFactory<String, TransactionMessage> consumerFactory() {
JsonDeserializer<TransactionMessage> jd = new JsonDeserializer<>(TransactionMessage.class);
return new DefaultKafkaConsumerFactory<>(consumerConfigs(), new StringDeserializer(), jd);
} @Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> propsMap = new HashMap<>();
propsMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "172.16.1.168:9092");
propsMap.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
propsMap.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "100");
propsMap.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "15000");
propsMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
propsMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
propsMap.put(ConsumerConfig.GROUP_ID_CONFIG, "group1");
propsMap.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
return propsMap;
}
}

Kafka消息监听接口实现UserServiceImpl。@KafkaListener(groupId = "group1", topics = "transaction")注释监听事件接口,@Transactional("userTransactionManager")注释数据库事务。事件接口被调用KafkaTransactionManager事务开始,然后JpaTransactionManager事务开始,如果事务提交则调用producer.sendOffsetsToTransaction(),最后KafkaTransactionManager事务提交。如果JpaTransactionManager事务有异常则不调用producer.sendOffsetsToTransaction()。如果JpaTransactionManager事务提交后KafkaTransactionManager事务有异常也不调用producer.sendOffsetsToTransaction()。int processed = updatesAppliedRepository.find(trans_id, id, type.toString())语句来判断是否已经更新了User。producer.sendOffsetsToTransaction()作用与删除队列消息相当。

@Component("userService")
public class UserServiceImpl implements UserService {
private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
private final UserRepository userRepository;
@Resource
private UpdatesAppliedRepository updatesAppliedRepository; public UserServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
} private void sold(TransactionMessage msg) {
Type type = msg.getType();
int id = msg.getId();
int amount = msg.getAmount();
int trans_id = msg.getXid();
int processed = updatesAppliedRepository.find(trans_id, id, type.toString());
if (processed == 0) {
switch (type) {
case SELLER:
userRepository.updateAmtSold(id, amount);
break;
case BUYER:
userRepository.updateAmtBought(id, amount);
break;
}
//throwException();
UpdatesApplied updatesApplied = new UpdatesApplied();
updatesApplied.setTrans_id(trans_id);
updatesApplied.setUser_id(id);
updatesApplied.setBalance(type.toString());
updatesAppliedRepository.save(updatesApplied);
}
} @Override
@Transactional("userTransactionManager")
@KafkaListener(groupId = "group1", topics = "transaction")
//@KafkaListener(groupId = "group1", topicPartitions = @TopicPartition(topic = "", partitionOffsets = @PartitionOffset(partition = "0", initialOffset = "5")))
public void receivekafka(TransactionMessage msg) {
logger.info("receive kafka message {}", msg);
sold(msg);
} private void throwException() {
throw new RuntimeException("throw exception in test");
}
}

参考资料

1,http://queue.acm.org/detail.cfm?id=1394128

2,Spring Data JPA - Multiple datasources exam

3,JMS

4,https://*.com/questions/42230797/spring-cloud-stream-kafka-eventual-consistency-does-kafka-auto-retry-unackno

5,http://www.kennybastani.com/2016/04/event-sourcing-microservices-spring-cloud.html

6,使用Spring Cloud和Reactor在微服务中实现Event Sourcing

7,Spring Kafka Tutorial – Getting Started with the Spring for Apache Kafka

8,碧桂园旺生活平台解决分布式事务方案之tcc开源框架 https://github.com/yu199195/happylifeplat-tcc