总结⼀下:微服务下的⼏个难点问题及解决⽅案
总结⼀下:微服务下的⼏个难点问题及常见的解决⽅案
⽂章⽬录
环境
springboot1.5.9
记录⼀下项⽬开发和技术研究中遇到的微服务难点,能够解决项⽬问题的才是适合的,⽬前能⼒有限,只能持续迭代开发。
1.接⼝幂等
场景:同⼀个订单多次执⾏;
电商订单的创建;
页⾯的多次提交问题;
并发下的计数问题;
⼤型系统中的消息消费问题;
解决:
1)选择为业务单号加上唯⼀的索引或者组合索引,在并发的场景中,只有第⼀笔插⼊的交易请求能够成功,后续的请求哪怕是慢1ms或者更短时间,都会触发数据库的唯⼀索引异常⽽失败,那么你可以捕获这个异常;不能仅仅依赖先去查询⼀下订单,2)Redis是提供分布式节点下的原⼦事务操作的,
⼜或者你想把幂等放在服务的最前端,减少实际服务处理的资源浪费,在请求⼀到达时就提前去重,不让他有执⾏的机会,那么你可以考虑引⼊⼀个redis或类似的组件,将业务请求单号缓存在这个分布式锁的组件内。那么,每当订单发起交易请求,交易系统会去Redis缓存中查询是否存在该订单号的Key,如果不存在,则向Redis增加Key为订单号。查询订单是否已经执⾏,如果没有则转发到交易系统,执⾏完成后删除该订单号的Key。当然,Redis是提供分布式节点下的原⼦事务操作的。
幂等只是⼀个承诺,⼀个概念,保证调⽤多次返回结果的⼀致性,具体实现需要考虑多种环境下的⾼并发情况,并根据不同的场景选择合适的⽅案;
对于新增的幂等性问题,可以配合数据库的唯⼀索引进⾏控制;
对于数据的更新幂等性问题,可以通过悲观锁,乐观锁,缓存的分布式锁来控制并发;
对于页⾯的多次提交,可以通过token机制进⾏控制;
消息消费的场景,可以通过在消息上设置⼀个taskid来进⾏控制
分布式和微服务的关系
实际项⽬中的后台接⼝涉及到数据库的:db联合唯⼀索引,唯⼀性约束。
2.分布式事物
前⼈总结的⽅案很多,但是实现起来未必适⽤项⽬,综合考虑了下,基于rocketmq的开源版实现事物消息,基于事物消息实现分布式事物。rocketmq4.3.0才放出事物消息,不过思路类似。
3.接⼝超时
参考:
实际项⽬中:核⼼逻辑的调⽤会有重试机制+重试次数达到设置的次数,进⼊消息队列+扫描任务定时处理
4.接⼝限流
参考:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。