1.分布式服务接口的幂等性如何设计?
比如重复扣款
例子1:假如你有个服务提供一些接口供外部调用,这个服务部署在了 很多台机器上,接着有个接口就是付款接口。然用户在前端上操作的时候,一个订单不小心发起了两次支付请求,然后这俩请求分散在了这个服务部署的不同的机器上,所以导致,结果一个订单扣款扣两次
例子2:订单系统调用支付系统进行支付,结果不小心因为网络超时了,然后订单系统走了前面我们看到的那个重试机制,支付系统收到一个支付请求两次,而且因为负载均衡算法落在了不同的机器上,扣款2次
幂等性:就是一个接口多次发起同一个请求,这个接口得保证结果准确(比如不能多扣款、不能多插数据)
如何保证幂等性?(3点,主要结合自己业务来)
(1)每个请求必须有唯一标识。 比如订单支付请求肯定得包含订单id,一个订单id最多支付一次
(2)每次处理完请求后必须有一个记录标识这个请求处理过了。
(3)每次接受请求需要进行判断之前是否处理过
2.分布式服务接口请求的顺序性如何保证?
例子:分布式系统还有一个常见问题,顺序性。一般系统是不需要顺序保证的,但是系统有时候可能确实是需要严格的顺序保证,比如服务 A 调用服务 B,先插入再删除。结果俩请求过去了,落在不同机器上,可能插入请求因为某些原因执行慢了一些,导致删除请求先执行了
引入顺序保障的弊端:比如使用分布式锁,会导致系统复杂度上升,而且会带来效率低下,热点数据压力过大等问题
3.如何自己设计一个类似 Dubbo 的 RPC 框架?
(1)服务的去注册中心注册,所以可以用zookeeper 做注册中心
(2)消费者需要去注册中心拿对应的服务信息,每个服务可能会存在多台机器
(3)要基于动态代理发起一个请求,这个动态代理就是本地的代理,这个代理会找到服务对应的机器地址
(4)要确定哪个机器发动的请求,得有个负载均衡算法,比如可以简单的随机轮询
(5)最后找到一台机器可以跟它发送请求了。
(6)服务器这边要根据自己的服务生成一个动态代理,监听某个网络端口,然后代理本地的服务代码。接收到请求的时候就调用对应服务代码