TypechoJoeTheme

王子博客

用户名
密码
用户名
邮箱
2021-08-31

高并发下如何防重?

高并发下如何防重?
前言最近测试给我提了一个bug,说我之前提供的一个批量复制商品的接口,产生了重复的商品数据。追查原因之后发现,这个事情没想象中简单,可以说一波多折。1. 需求产品有个需求:用户选择一些品牌,点击确定按钮之后,系统需要基于一份默认品牌的商品数据,复制出一批新的商品。拿到这个需求时觉得太简单了,三下五除二就搞定。我提供了一个复制商品的基础接口,给商城系统调用。当时的流程图如下:如果每次复制的商品数量不多,使用同步接口调用的方案问题也不大。2. 性能优化但由于每次需要复制的商品数量比较多,可能有几千。如果每次都是用同步接口的方式复制商品,可能会有性能问题。因此,后来我把复制商品的逻辑改成使用mq异步处理。改造之后的流程图:复制商品的结果还需要通知商城系统:这个方案看起来,挺不错的。但后来出现问题了。3. 出问题了测试给我们提了一个bug,说我之前提供的一个批量复制商品的接口,产生了重复的商品数据。经过追查之后发现,商城系统为了性能考虑,也改成异步了。他们没有在接口中直接调用基础系统的复制商品接口,而是在job中调用的。站在他们的视角流程图是这样的:用户调用商城的接口,他们会往请求记录表...
王子
2021-08-31

Java,高并发

195 阅读
0 评论
2021年08月31日
195 阅读
0 评论
2021-08-30

高并发下如何保证接口的幂等性?

高并发下如何保证接口的幂等性?
前言接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法,绝大部分内容我在项目中实践过的,给有需要的小伙伴一个参考。不知道你有没有遇到过这些场景:有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。我们在项目中为了解决接口超时问题,通常会引入了重试机制。第一次请求接口超时了,请求方没能及时获取返回结果(此时有可能已经成功了),为了避免返回错误的结果(这种情况不可能直接返回失败吧?),于是会对该请求重试几次,这样也会产生重复的数据。mq消费者在读取消息时,有时候会读取到重复消息(至于什么原因这里先不说,有兴趣的小伙伴,可以找我私聊),如果处理不好,也会产生重复的数据。没错,这些都是幂等性问题。接口幂等性是指用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。这类问题多发于接口的:insert操作,这种情况下多次请求,可能会产生重复数据。update操作,如果只是单纯的更新数据,比如:update user set status=1 wher...
王子
2021-08-30

Java,高并发

254 阅读
0 评论
2021年08月30日
254 阅读
0 评论
2021-07-20

老板:把公司所有系统账号实现互通不难吧!

老板:把公司所有系统账号实现互通不难吧!
大家好,我是老王,最近开发新产品,然后老板说我们现在系统太多了,每次切换系统登录太麻烦了,能不能做个优化,同一账号互通掉。作为一个资深架构狮,老板的要求肯定要满足,安排!一个公司产品矩阵比较丰富的时候,用户在不同系统之间来回切换,固然对产品用户体验上较差,并且增加用户密码管理成本。也没有很好地利用内部流量进行用户打通,并且每个产品的独立体系会导致产品安全度下降。因此实现集团产品的单点登录对用户使用体验以及效率提升有很大的帮助。那么如何实现统一认证呢?我们先了解一下传统的身份验证方式。1 传统Session机制及身份认证方案1.1 Cookie与服务器的交互众所周知,http 是无状态的协议,因此客户每次通过浏览器访问 web。页面,请求到服务端时,服务器都会新建线程,打开新的会话,而且服务器也不会自动维护客户的上下文信息。比如我们现在要实现一个电商内的购物车功能,要怎么才能知道哪些购物车请求对应的是来自同一个客户的请求呢?因此出现了session这个概念,session 就是一种保存上下文信息的机制,他是面向用户的,每一个SessionID 对应着一个用户,并且保存在服务端中。s...
王子
2021-07-20

单点登录

275 阅读
1 评论
2021年07月20日
275 阅读
1 评论
2021-06-25

多线程事务回滚方法(二)

多线程事务回滚方法(二)
我们开发的时候常常会遇到多线程事务的问题。以为添加了@Transactional注解就行了,其实你加了注解之后会发现事务失效。原因:数据库连接spring是放在threadLocal里面,多线程场景下,拿到的数据库连接是不一样的,即是属于不同事务。本文是基于springboot的@Async注解开启多线程,,并通过自定义注解和AOP实现的多线程事务,避免繁琐的手动提交/回滚事务 (CV即用、参数齐全、无需配置)一、springboot多线程(声明式)的使用方法?1、springboot提供了注解@Async来使用线程池,具体使用方法如下:(1) 在启动类(配置类)添加@EnableAsync来开启线程池(2) 在需要开启子线程的方法上添加注解@Async注意: 框架默认 -----> 来一个请求开启一个线程,在高并发下容易内存溢出所以使用时需要配置自定义线程池,如下:@Configuration @EnableAsync public class ThreadPoolTaskConfig { @Bean("threadPoolTaskExecuto...
王子
2021-06-25

springboot,多线程

716 阅读
1 评论
2021年06月25日
716 阅读
1 评论