JAVA全系列 教程
3762个小节阅读:7091k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
问题引入
一般来说,多个接口的调用是不用保证顺序的,但是有时候,有的业务场景可能需要严格的顺序来保证系统的准确性。
举个例子,分布式架构中的服务A调用服务B,发了两个请求,一个插入操作一个删除操作,本来是先插入再删除。但是很可能俩请求过去了,集群部署的情况下落在了不同机器上,可能插入请求因为某些原因执行慢了一些,导致删除请求先执行了,此时因为没数据所以没有啥效果没有啥影响;接着这个时候执行数据插入,就发生了逻辑错误。
就是分布式系统中一个很常见的问题,那我们该如何保证接口的调用顺序呢?
解决方案
业务逻辑上解决
从业务逻辑上设计系统不需要这种顺序的保证,因为一旦引入顺序性保障,会导致系统复杂度的上升,效率会降低,对于热点数据会压力过大等问题。
操作串行化
首先使用一致性hash负载均衡策略,将同一个id的请求都分发到同一个机器上面去处理,比如订单可以根据订单id。如果处理的机器是多线程处理的,可以引入内存队列去处理,将相同id的请求通过hash到同一个队列当中,一个队列只对应一个处理线程。
总结
优先通过业务的维度去解决问题,实在没法处理的情况下再通过技术折中。