微服务项目:尚融宝(52)(核心业务流程:充值服务(3))

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次调用而产生了副作用。

一、接口幂等性原则



1、什么是接口幂等性


接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次调用而产生了副作用。


举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条...这就没有保证接口的幂等性


2、回调重试


汇付宝向尚融宝发起回调,如果没有收到正确的响应 "success",则尚融宝会发起重试

汇付宝中的相关代码如下:


@Slf4j
public class NotifyThread implements Runnable {
    private int count = 1;
    private String notifyUrl;
    private Map<String, Object> paramMap;
    public NotifyThread(){}
    public NotifyThread(String notifyUrl, Map<String, Object> paramMap) {
        this.notifyUrl = notifyUrl;
        this.paramMap = paramMap;
    }
    @Override
    public void run() {
        task();
    }
    private void task() {
        String result = SignUtil.sendRequest(paramMap,notifyUrl);
        log.info(notifyUrl + ":" + result + " count:" + count);
        if(!"success".equals(result)) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //ScheduledTask.queue.offer(new NotifyVo(notifyUrl, paramMap));
            count++;
            if(count <= 5) {
                task();
                log.info("失败重试:" + JSON.toJSONString(this));
            }
        }
    }
}



3、存在的问题


当回调重试时,金额和流水会重复增加


98a4a51b2f5047f2afa360a5eaed112d.png


二、解决方案



1、设置唯一索引


设置了唯一索引后,即使回调重复执行,遇到唯一索引,就会抛出异常,从而使事务回滚。

 

140563cd6bce49358c7de4cec7164f68.png


2、判断流水是否存在


判断流水如果存在,则从业务方法中直接退出


接口:TransFlowService


boolean isSaveTransFlow(String agentBillNo);


实现:TransFlowServiceImpl


@Override
public boolean isSaveTransFlow(String agentBillNo) {
    QueryWrapper<TransFlow> queryWrapper = new QueryWrapper();
    queryWrapper.eq("trans_no", agentBillNo);
    int count = baseMapper.selectCount(queryWrapper);
    if(count > 0) {
        return true;
    }
    return false;
}


调用 :UserAccountServiceImpl


@Transactional(rollbackFor = Exception.class)
@Override
public void notify(Map<String, Object> paramMap) {
    log.info("充值成功:" + JSONObject.toJSONString(paramMap));
    //判断交易流水是否存在
    String agentBillNo = (String)paramMap.get("agentBillNo"); //商户充值订单号
    boolean isSave = transFlowService.isSaveTransFlow(agentBillNo);
    if(isSave){
        log.warn("幂等性返回");
        return;
    }
   ......
    //增加交易流水
    //agentBillNo = (String)paramMap.get("agentBillNo"); //商户充值订单号
}



今日分享



1. 硬件的目的:为了运行软件给它的一些指令。我们可以优先从硬件中提取出这三个主要的东西,分别是: CPU,内存,硬盘


2. 在现实生活中,人脑是用来计算的,在计算机中,用来计算的是什么呢?当然是CPU了。多数CPU都有两种模式,即内核态与用户态。这里的即内核态与用户态将会在下面的内容中讲到。


3.如果我们把计算机理解为人的大脑,我们可以总结为几句话:


 CPU是人的大脑,负责运算

        内存是人的记忆,负责临时存储

        硬盘是人的笔记本,负责永久存储

        输入设备是人的耳朵或眼睛,负责接受外部的信息传给CPU

        以上所有的设备都通过总线连接,总线相当于人的神经


相关文章
|
9天前
|
监控 负载均衡 安全
微服务(五)-服务网关zuul(一)
微服务(五)-服务网关zuul(一)
|
9天前
|
消息中间件 监控 开发工具
微服务(三)-实现自动刷新配置(不重启项目情况下)
微服务(三)-实现自动刷新配置(不重启项目情况下)
|
7天前
|
消息中间件 Kafka 数据库
微服务架构中,如何确保服务之间的数据一致性
微服务架构中,如何确保服务之间的数据一致性
|
11天前
|
消息中间件 缓存 NoSQL
构建高效后端服务:微服务架构的深度实践
本文旨在探讨如何通过采用微服务架构来构建高效的后端服务。我们将深入分析微服务的基本概念、设计原则以及在实际项目中的应用案例,揭示其在提升系统可维护性、扩展性和灵活性方面的优势。同时,本文还将讨论在实施微服务过程中可能遇到的挑战,如服务治理、分布式事务和数据一致性等问题,并分享相应的解决策略和最佳实践。通过阅读本文,读者将能够理解微服务架构的核心价值,并具备将其应用于实际项目的能力。 ##
|
9天前
|
Java API 对象存储
微服务魔法启动!Spring Cloud与Netflix OSS联手,零基础也能创造服务奇迹!
这段内容介绍了如何使用Spring Cloud和Netflix OSS构建微服务架构。首先,基于Spring Boot创建项目并添加Spring Cloud依赖项。接着配置Eureka服务器实现服务发现,然后创建REST控制器作为API入口。为提高服务稳定性,利用Hystrix实现断路器模式。最后,在启动类中启用Eureka客户端功能。此外,还可集成其他Netflix OSS组件以增强系统功能。通过这些步骤,开发者可以更高效地构建稳定且可扩展的微服务系统。
24 1
|
21天前
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
22 5
|
26天前
|
XML Java 数据库
在微服务架构中,请求常跨越多个服务,涉及多组件交互,问题定位因此变得复杂
【9月更文挑战第8天】在微服务架构中,请求常跨越多个服务,涉及多组件交互,问题定位因此变得复杂。日志作为系统行为的第一手资料,传统记录方式因缺乏全局视角而难以满足跨服务追踪需求。本文通过一个电商系统的案例,介绍如何在Spring Boot应用中手动实现日志链路追踪,提升调试效率。我们生成并传递唯一追踪ID,确保日志记录包含该ID,即使日志分散也能串联。示例代码展示了使用过滤器设置追踪ID,并在日志记录及配置中自动包含该ID。这种方法不仅简化了问题定位,还具有良好的扩展性,适用于各种基于Spring Boot的微服务架构。
31 3
|
9天前
|
测试技术 微服务
微服务(八)-服务网关zuul(四)
微服务(八)-服务网关zuul(四)
|
9天前
|
监控 前端开发 Java
微服务(七)-服务网关zuul(三)
微服务(七)-服务网关zuul(三)
|
9天前
|
负载均衡 前端开发 安全
微服务(六)-服务网关zuul(二)
微服务(六)-服务网关zuul(二)
下一篇
无影云桌面