当前位置: 首页 > news >正文

淘客返利app后端系统架构设计:从数据一致性到高可用方案

淘客返利app后端系统架构设计:从数据一致性到高可用方案

大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿!

一、淘客返利系统的核心架构设计

淘客返利APP后端系统需处理商品推广、订单跟踪、佣金结算等核心业务,其架构设计需兼顾数据一致性与高可用性。聚娃科技省赚客APP采用"微服务集群+分布式存储"架构,核心模块包括:

  • 推广服务:管理推广链接生成与渠道追踪
  • 订单服务:对接电商平台API,同步订单状态
  • 佣金服务:计算返利金额并处理提现请求
  • 账户服务:管理用户资产与佣金流水

基础架构采用Spring Cloud Alibaba生态,服务间通过Dubbo实现RPC通信,数据层采用MySQL+Redis+MongoDB的混合存储方案。
在这里插入图片描述

二、数据一致性方案设计

2.1 分布式事务处理

佣金结算场景需保证订单状态与佣金记录的一致性,采用Seata的TCC模式实现:

package cn.juwatech.commission.service;@Service
public class CommissionTccService implements TccAction {@Autowiredprivate CommissionMapper commissionMapper;// Try阶段:预扣减佣金额度@Override@TwoPhaseBusinessAction(name = "commissionTccAction", commitMethod = "commit", rollbackMethod = "rollback")public boolean prepare(@BusinessActionContextParameter(paramName = "commissionDTO") CommissionDTO dto) {BusinessActionContext context = BusinessActionContextHolder.getContext();context.setActionContext("commissionId", dto.getOrderId());// 检查用户可提现余额BigDecimal available = accountService.getAvailableBalance(dto.getUserId());if (available.compareTo(dto.getAmount()) < 0) {throw new InsufficientBalanceException("可用佣金不足");}// 冻结佣金return commissionMapper.freezeCommission(dto.getUserId(), dto.getAmount(), dto.getOrderId()) > 0;}// Confirm阶段:确认扣减@Overridepublic boolean commit(BusinessActionContext context) {String orderId = context.getActionContext("commissionId").toString();return commissionMapper.confirmFrozenCommission(orderId) > 0;}// Cancel阶段:取消冻结@Overridepublic boolean rollback(BusinessActionContext context) {String orderId = context.getActionContext("commissionId").toString();return commissionMapper.cancelFrozenCommission(orderId) > 0;}
}

2.2 订单状态最终一致性

通过本地消息表实现跨系统订单状态同步:

package cn.juwatech.order.service;@Service
public class OrderSyncService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate LocalMessageMapper messageMapper;@Autowiredprivate RocketMQTemplate rocketMQTemplate;@Transactionalpublic void updateOrderStatus(Long orderId, OrderStatus newStatus) {// 1. 更新本地订单状态OrderDO order = new OrderDO();order.setId(orderId);order.setStatus(newStatus);orderMapper.updateById(order);// 2. 插入本地消息表LocalMessageDO message = new LocalMessageDO();message.setBizType("ORDER_STATUS_CHANGE");message.setBizId(orderId.toString());message.setContent(JSON.toJSONString(order));message.setStatus(MessageStatus.PENDING);messageMapper.insert(message);// 3. 发送消息try {rocketMQTemplate.send("order-status-topic", MessageBuilder.withPayload(message).build());// 4. 标记消息为已发送messageMapper.updateStatus(message.getId(), MessageStatus.SENT);} catch (Exception e) {log.error("发送订单状态消息失败", e);// 消息发送失败由定时任务重试}}
}

三、高可用架构实践

3.1 服务容错设计

采用Sentinel实现服务熔断与限流:

package cn.juwatech.product.service;@Service
public class ProductServiceImpl implements ProductService {@Autowiredprivate TaobaoProductClient taobaoClient;@SentinelResource(value = "queryProductDetail", fallback = "queryProductFallback",blockHandler = "queryProductBlocked")@Overridepublic ProductDTO queryProductDetail(String itemId) {return taobaoClient.getItemDetail(itemId);}// 降级处理public ProductDTO queryProductFallback(String itemId, Throwable e) {log.warn("查询商品详情降级", e);// 返回缓存的基础商品信息return productCacheService.getCachedProduct(itemId);}// 限流处理public ProductDTO queryProductBlocked(String itemId, BlockException e) {log.warn("查询商品详情被限流", e);return new ProductDTO().setId(itemId).setName("商品信息加载中...");}
}

3.2 多级缓存架构

实现"本地缓存+Redis+数据库"三级缓存:

package cn.juwatech.cache.config;@Configuration
public class CacheConfig {// Caffeine本地缓存配置@Beanpublic Cache<String, Object> localCache() {return Caffeine.newBuilder().maximumSize(10_000).expireAfterWrite(5, TimeUnit.MINUTES).recordStats().build();}// Redis缓存配置@Beanpublic RedisCacheManager cacheManager(RedisConnectionFactory factory) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1)).serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));// 不同缓存设置不同过期时间Map<String, RedisCacheConfiguration> configMap = new HashMap<>();configMap.put("productCache", config.entryTtl(Duration.ofHours(6)));configMap.put("userCache", config.entryTtl(Duration.ofHours(24)));return RedisCacheManager.builder(factory).cacheDefaults(config).withInitialCacheConfigurations(configMap).build();}
}

3.3 数据库高可用

采用主从复制+读写分离架构,使用Sharding-JDBC配置:

spring:shardingsphere:datasource:names: master,slave1,slave2master:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://master:3306/taoke_dbusername: rootpassword: rootslave1:# 从库1配置slave2:# 从库2配置rules:readwrite-splitting:data-sources:taoke-db:type: Staticprops:write-data-source-name: masterread-data-source-names: slave1,slave2load-balancer-name: round_robinprops:sql-show: false

四、监控与容灾设计

4.1 全链路监控

集成SkyWalking实现分布式追踪:

package cn.juwatech.trace.config;@Configuration
public class TraceConfig {@Beanpublic FilterRegistrationBean<TraceFilter> traceFilter() {FilterRegistrationBean<TraceFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new TraceFilter());registration.addUrlPatterns("/*");registration.setName("traceFilter");registration.setOrder(Ordered.HIGHEST_PRECEDENCE);return registration;}public static class TraceFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {String traceId = MDC.get("traceId");if (StringUtils.isEmpty(traceId)) {traceId = IdUtil.fastSimpleUUID();MDC.put("traceId", traceId);}try {chain.doFilter(request, response);} finally {MDC.remove("traceId");}}}
}

4.2 服务自动扩缩容

基于K8s HPA实现弹性伸缩:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: order-service-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: order-serviceminReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 60- type: Resourceresource:name: memorytarget:type: UtilizationaverageUtilization: 70

本文著作权归聚娃科技省赚客app开发者团队,转载请注明出处!


文章转载自:

http://aYWZCGqH.fgLyb.cn
http://C5PKZC1o.fgLyb.cn
http://9F9C75Vq.fgLyb.cn
http://ndHmEZaX.fgLyb.cn
http://7Vm1pTDH.fgLyb.cn
http://nIWsDMzk.fgLyb.cn
http://HhJHWlMT.fgLyb.cn
http://frR7TNWv.fgLyb.cn
http://7xOjkE9C.fgLyb.cn
http://UuuJIng4.fgLyb.cn
http://t3h80rLa.fgLyb.cn
http://OlrCDGAU.fgLyb.cn
http://grUPwztn.fgLyb.cn
http://waFxbehn.fgLyb.cn
http://mPuM8XYY.fgLyb.cn
http://TgZCjyTB.fgLyb.cn
http://WYRWey4Z.fgLyb.cn
http://fpMxk5dx.fgLyb.cn
http://v2WQzVhf.fgLyb.cn
http://tjEdBg9b.fgLyb.cn
http://aRlIbr6J.fgLyb.cn
http://sqhbuwnO.fgLyb.cn
http://kvcmU14B.fgLyb.cn
http://jbEFF7dn.fgLyb.cn
http://7MAJHSo0.fgLyb.cn
http://ZAxdqn3n.fgLyb.cn
http://q8XIYWNQ.fgLyb.cn
http://dvGUwuqT.fgLyb.cn
http://zuJd5vFD.fgLyb.cn
http://nmd1TWQ5.fgLyb.cn
http://www.dtcms.com/a/379937.html

相关文章:

  • 自动清除ROS日志方法汇总
  • GitHub 上整合深度学习 + 遥感数据集(或工具库/benchmark)的项目
  • 学习日记-JS+DOM-day54-9.12
  • 数据分析毕业论文题目推荐:精选选题清单
  • Apache Flink 从流处理基础到恰好一次语义
  • 第2篇:数据持久化实战
  • redis sentinel 与 clauster 的区别
  • Vue: 侦听器(Watch)
  • HTML 设计与使用入门
  • 【大数据专栏】流式处理框架-Apache Fink
  • 老项目CSS样式失效?调整css插件版本解决
  • Flink 实时流处理实战:电商实时大屏分析
  • ARM(7)IMX6ULL 按键控制(轮询 + 中断)优化工程
  • 基于STM32设计的青少年学习监控系统(华为云IOT)_282
  • Django全栈班v1.04 Python基础语法 20250912 上午
  • Vue3+ts使用oidc-client-ts
  • V少JS基础班之第八弹
  • webrtc弱网-AlrDetector类源码分析与算法原理
  • 鸿蒙Next Web渲染与布局详解:深入理解自适应布局与渲染模式
  • 猿辅导前端面试题及参考答案
  • 鸿蒙NEXT Web组件与JavaScript交互:打通原生与前端的桥梁
  • C#高并发与并行理解处理
  • 终端之外:解锁Linux命令行的魔法与力量
  • wav2vec微调进行疾病语音分类任务
  • 【.Net技术栈梳理】10-.NET Core 程序的执行
  • 【完整源码+数据集+部署教程】仓库物品分类检测图像分割系统源码和数据集:改进yolo11-convnextv2
  • 软件定义汽车(SDV)与区域电子电气架构(Zonal EEA)的技术革新
  • R语言:数据读取与重构、试验设计(RCB/BIB/正交/析因)、ggplot2高级绘图与统计检验(t检验/方差分析/PCA/聚类)
  • ffmpeg切割音频
  • 【论文笔记】RadarOcc: Robust 3D Occupancy Prediction with 4D Imaging Radar