微服务之补偿服务架构

补偿服务是使用一个额外的协调服务来协调各个需要保证一致性的微服务,协调服务按顺序调用各个微服务,协调服务实现为一个通用的补偿框架,保证最终一致性。

当客户的一个预订请求达到时,协调服务(补偿框架)为请求生成一个全局唯一的业务流水号,并在调用各个工作服务的同时记录完整的状态.

 

做过支付宝交易接口的同学都知道,我们一般会在支付宝的回调页面和接口里,解密参数,然后调用系统中更新交易状态相关的服务,将订单更新为付款成功。同时,只有当我们回调页面中输出了success字样或者标识业务处理成功相应状态码时,支付宝才会停止回调请求。否则,支付宝会每间隔一段时间后,再向客户方发起回调请求,直到输出成功标识为止

 

业务方提供幂等接口,服务层周期调用。

接口格式按统一标准,比如code 10000是成功,其他标识 失败,失败继续调用。

 

首先业务方向服务层注册服务,提供notify_url和成功返回参数,系统返回生成的业务号business_id。

服务层提供接口,业务方通过该接口注册,请求url和参数

比如 xxxxx.com?appkey=xxx&business_id=xxxx&xxx=xxxxx

除了appkey和business_id参数,转发其他所有请求参数到填写的notify_url,识别到返回成功,停止请求。

后台配置成功标识

减少业务方工作量

否则业务方需要自己去做定时任务处理,且无法观察服务请求质量

接入到该服务,业务方仅提供标准api即可,可数据后台观察处理情况。

注意:

由于HTTP请求超时情况,提供接口需保证幂等。

 

 

 

核心链路统一补偿服务

1.主逻辑通知到子逻辑,子逻辑需保证以主逻辑的唯一票据为幂等参数,子逻辑不用关心自我处理情况,由主逻辑定时任务轮训子逻辑处理情况,直到处理成功。

好处:可以对两种情况进行补偿,1是网络原因通知子逻辑失败,2是子逻辑自己系统原因处理失败。

2.主逻辑只要通知到子逻辑即可,若子逻辑处理失败,自我进行修复

劣势:只能修复自我处理失败的情况,对网络原因主逻辑未通知到子逻辑的无法处理。

 

### 使用微服务架构实现送餐服务 #### 设计思路 在构建基于微服务架构的送餐服务平台时,可以将整个系统划分为若干个独立的服务单元。这些服务各自负责特定领域内的业务逻辑,并通过API网关统一管理外部请求入口。 对于送餐服务而言,主要涉及订单管理、餐厅厨房管理和账务处理等功能模块。每个功能模块都可以被抽象成单独的服务实例: - **Order Service (订单服务)**:用于创建新订单(createorder())、查询现有订单(findOrderByID())以及取消订单(cancelOrder())等操作; - **Kitchen Service (厨房服务)**:接收来自订单系统的指令准备菜品(prepareMeal())并向客户发送备餐进度通知(updatePreparationStatus()); - **Accounting Service (财务服务)**:记录交易详情(recordTransaction())并对已完成订单发起结算流程(initiateSettlementProcess())。 以上三个核心组件构成了基本框架结构[^2]。 #### API Gateway 的角色 作为进入系统的唯一通道,API Gateway 承担着路由转发职责的同时还需要完成身份验证(authenticateRequest())等一系列安全保障措施。当用户提交获取订单详情(getOrderDetails())这样的请求时,API Gateway 将依次调用上述提到的相关联服务来组装最终响应结果给前端展示[^1]。 #### 安全机制的设计 考虑到安全性的重要性,在设计过程中应当确保各个层面的安全防护到位。例如,利用OAuth2.0协议实施细粒度权限控制(accessControlByRole()),加密敏感信息(encryptSensitiveData())以防止数据泄露风险,定期审查日志文件(logAuditTrail())以便及时发现问题所在并采取相应对策加以改进。 ```python from fastapi import FastAPI, Depends, HTTPException import jwt from pydantic import BaseModel class Token(BaseModel): access_token: str token_type: str def authenticate_request(token: str = Header(...)): try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) username: str = payload.get("sub") if username is None or not check_user_permission(username): raise ValueError() return True except JWTError as e: raise HTTPException(status_code=403, detail="Invalid authentication credentials") @app.post("/orders", dependencies=[Depends(authenticate_request)]) async def create_order(order_data: OrderCreateDTO): # 创建订单的具体实现... pass ``` #### 数据一致性保障方案 由于采用了分布式的体系结构模式,不可避免地会遇到跨多个数据库事务的一致性难题。为此,建议采用Saga模式(sagaPatternForDistributedTransactions),即把一系列关联动作分解为一个个小型补偿事务(compensatingTransaction),一旦某个环节失败则回滚之前所有的变更操作,从而维持全局状态同步一致[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值