From 6ca65b089aaf99956ddcd719916ea3617e907252 Mon Sep 17 00:00:00 2001 From: wangkang Date: Tue, 17 Oct 2017 20:12:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8D=9A=E5=AE=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/架构设计.vsd | Bin 389632 -> 439296 bytes md/19.md | 333 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 333 insertions(+) create mode 100644 md/19.md diff --git a/doc/架构设计.vsd b/doc/架构设计.vsd index 5965d561fe440a6bee0063d8e7539f471d129672..eb451a22238299e73ea161cae07cfcc246afc3e4 100644 GIT binary patch delta 65097 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 L$I8|SxLYMix-y;5;(Y^ot* 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,并且3>1,两条线程依然都会执行,同样的 : + +如果2的这条线程先结束,3的这条线程后结束,那么则数据正常,最终数据被更新成3 + +如果3的这条线程先结束了,2的这条线程是后结束的,那么,最新的数据就会被老数据覆盖掉 + +同样达到想要的效果 + +## 如何保证入库的数据是最新的? + +其实要实现很简单,首先,要知道,对于同一行数据,sql的执行也是有先后顺序的,其实到底更新为2的sql语句先执行,还是更新为3的sql语句先执行,并不重要 + +重要的是,将判断版本号的语句放入更新条件中进行判断. + +例子 : 同样是上面的场景,数据库中的版本为1,这时2和3同时更新,谁先结束,谁也不知道,也无法控制(其实有办法,但是损失性能,当前场景需要的是高效) + +但是我们可以在条件中加入"version < 2"这样的条件 + +SQL语句样例 : + +``` java +UPDATE TEST_MSG +SET + VERSION = #{version}, + DATA = #{data}, + LAST_UPDATE_DATE = #{lastUpdatedDate} +WHERE BUSINESS_KEY = #{businessKey} AND VERSION < #{version} +``` + +这样的话,无论那条线程先结束,都不会影响最终的结果 + +如果,2先结束,3线程的条件为2 < 3,条件成立,数据将会被更新为3 + +如果,3先结束,2线程的条件为3 < 2,条件不成立,数据则不会更新(由于是在sql执行过程中判断,所以这里不存在脏读的情况) + +这样就能满足**记录当前最新的数据**的需求了 + +## 实现 (springboot使用rabbitmq的例子) + +``` java +spring.rabbitmq.host=itkk.org +spring.rabbitmq.port=5672 +spring.rabbitmq.username=dev_udf-sample +spring.rabbitmq.password=1qazxsw2 +spring.rabbitmq.virtual-host=/dev_udf-sample +spring.rabbitmq.template.retry.enabled=true +spring.rabbitmq.listener.simple.retry.enabled=true +spring.rabbitmq.listener.simple.concurrency=5 +spring.rabbitmq.listener.simple.max-concurrency=10 +``` + +以上配置文件配置了rabbitmq的连接,也指定了消费者监听器的并发数量(5)和最大并发数量(10),并且开启了重试,重试失败的消息会被流转到死信队里里 + +``` java +@Configuration +public class UdfServiceADemoConfig { + + public static final String EXCHANGE_ADEMO_TEST1 = "exchange.ademo.test1"; + + public static final String QUEUE_ADEMO_TEST1_CONSUME1 = "queue.ademo.test1.consume1"; + + public static final String ROUTINGKEY_ADEMO_TEST1_TESTMSG = "routingkey.ademo.test1.testmsg"; + + @Bean + public DirectExchange exchangeAdemoTest1() { + return new DirectExchange(EXCHANGE_ADEMO_TEST1, true, true); + } + + @Bean + public Queue queueAdemoTest1Consume1() { + return new Queue(QUEUE_ADEMO_TEST1_CONSUME1, true, false, true); + } + + @Bean + public Binding queueAdemoTest1Consume1Binding() { + return new Binding(QUEUE_ADEMO_TEST1_CONSUME1, + Binding.DestinationType.QUEUE, EXCHANGE_ADEMO_TEST1, + ROUTINGKEY_ADEMO_TEST1_TESTMSG, null); + } +} +``` + +exchangeAdemoTest1方法定义了一个交换机,并且是自动删除的 + +queueAdemoTest1Consume1定义了一个消费者队列,也是自动删除的 + +queueAdemoTest1Consume1Binding将上面定义的交换机和消费者绑定起来,并设定了路由键(routingkey) + +``` java +public class TestMsg implements Serializable { + /** + * 描述 : id + */ + private static final long serialVersionUID = 1L; + + /** + * msgId + */ + private String msgId = UUID.randomUUID().toString(); + + /** + * businessKey + */ + private String businessKey; + + /** + * version + */ + private long version; + + /** + * data + */ + private String data; + + /** + * lastUpdatedDate + */ + private Date lastUpdatedDate; +} +``` + +以上定义了消息的格式,主要的字段就是businessKey和version,分别用来确定唯一的业务数据和版本的判断 + +``` java + + @Autowired + private AmqpTemplate amqpTemplate; + + @Scheduled(fixedRate = SCHEDULED_FIXEDRATE) + public void send1() { + this.send(); + } + + public void send2() { + ..... + } + + /** + * send + */ + private void send() { + final int numA = 1000; + int a = (int) (Math.random() * numA); + long b = (long) (Math.random() * numA); + TestMsg testMsg = new TestMsg(); + testMsg.setBusinessKey(Integer.toString(a)); + testMsg.setVersion(b); + testMsg.setData(UUID.randomUUID().toString()); + testMsg.setLastUpdatedDate(new Date()); + amqpTemplate.convertAndSend(UdfServiceADemoConfig.EXCHANGE_ADEMO_TEST1, + UdfServiceADemoConfig.ROUTINGKEY_ADEMO_TEST1_TESTMSG, testMsg); + } +``` + +以上定义了用于做测试的消息发送方,使用计划任务,定期的向交换机中写入数据,可以定义多个计划任务,增加同一时间消息产生的数量 + +``` java + + @RabbitListener(queues = UdfServiceADemoConfig.QUEUE_ADEMO_TEST1_CONSUME1) + public void consume1(TestMsg testMsg) { + if (testMsgRespository.count(testMsg.getBusinessKey()) > 0) { + int row = testMsgRespository.update(testMsg); + log.info("update row = {}", row); + } else { + try { + int row = testMsgRespository.insert(testMsg); + log.info("insert row = {}", row); + } catch (Exception e) { + //进行异常判断,确定是主键冲突错误 + int row = testMsgRespository.update(testMsg); + log.info("update row = {}", row); + } + } + try { + final long time = 5L; + Thread.sleep(time); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + +``` + +以上定义了消息消费的方法,此方法是多线程执行的,大概逻辑是,先count数据库,判断数据是否存在,如果存在,则update数据,如果不存在,则insert数据 + +但是count也有可能存在脏读的情况,所以insert操作有可能会因为主键重复而失败,这时,会捕获到异常,通过异常判断,确定是主键冲突错误后(样例代码中省略了),在进行update操作 + +这里的update操作,则是上文提到的采用"version < #{updateVersion}"的方法进行更新,保证了将最新的数据更新到数据库中 + +最后的线程休眠,是为了模拟处理时间,以便造成更多的并发情况 + +``` java + + int count(@Param("businessKey") String businessKey); + + + int insert(TestMsg testMsg); + + + int update(TestMsg testMsg); + + + + + INSERT INTO TEST_MSG + ( + BUSINESS_KEY, + VERSION, + DATA, + LAST_UPDATE_DATE + ) + VALUES + ( + #{businessKey}, + #{version}, + #{data}, + #{lastUpdatedDate} + ) + + + + UPDATE TEST_MSG + SET + VERSION = #{version}, + DATA = #{data}, + LAST_UPDATE_DATE = #{lastUpdatedDate} + WHERE BUSINESS_KEY = #{businessKey} AND VERSION #{version} + + +``` + +以上为相关的sqlmap定义以及mapper接口的定义 + +``` java + +CREATE TABLE TEST_MSG +( + BUSINESS_KEY VARCHAR(100) NOT NULL + PRIMARY KEY, + VERSION BIGINT NOT NULL, + DATA VARCHAR(100) NOT NULL, + LAST_UPDATE_DATE DATETIME NOT NULL +) + COMMENT 'TEST_MSG'; + +``` + +以上为表结构的定义 + +## **结束** + +这样,启动应用,观察数据库表更新情况,会发现,数据的版本只会有增长的,不会存在降低的 + +那么,我们这实现了本文中开头提到的需求了. + +并且也了解了在springboot中如何使用rabbitmq发送和消费消息了. + +关于本文内容 , 欢迎大家的意见跟建议 + +## **代码仓库** (博客配套代码) + +- [udf-starter : 基础项目,脚手架,框架](https://gitee.com/wangkang/udf) + +- [udf-sample : 集成样例](https://gitee.com/wangkang/udf-sample) + +--------- + +想获得最快更新,请关注公众号 + +![想获得最快更新,请关注公众号](https://static.oschina.net/uploads/img/201705/24155414_Pukg.jpg "想获得最快更新,请关注公众号") \ No newline at end of file