浅谈高并发和分布式系统的幂等如何处理

SpringBoot 接口实现幂等性,我有四种方案! 1、目录什么是幂等性什么是接口幂等性为什么需要实现幂等性引入幂等性后对系统的影响Restful API 接口的幂等性如何实现幂等性方案一:数据库唯一主键方案二:数据库乐观锁方案三:防重 Token 令牌方案四、下游传递唯一序列号实现接口示例Maven 引入相关依赖配置连接 Redis 的参数创建与验证 Token 工具类创建测试的 Controller 类创建 SpringBoot 启动类写测试类进行测试最后总结Java JDK 版本:1.8。 阅读详情

什么是幂等性

幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。

在计算机中编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。

幂等函数或幂等方法是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。

什么是接口幂等性

在 HTTP/1.1 中,对幂等性进行了定义。它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外),即第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。

这里的副作用是不会对结果产生破坏或者产生不可预料的结果。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。

为什么需要实现幂等性

在接口调用时一般情况下都能正常返回信息不会重复提交,不过在遇见以下情况时可能就会出现问题。

如:

  • 前端重复提交表单: 在填写一些表格时候,用户填写完成提交,很多时候会因网络波动没有及时对用户做出提交成功响应,致使用户认为没有成功提交,然后一直点提交按钮,这时就会发生重复提交表单请求。
  • 用户恶意进行刷单: 例如在实现用户投票这种功能时,如果用户针对一个用户进行重复提交投票,这样会导致接口接收到用户重复提交的投票信息,这样会使投票结果与事实严重不符。
  • 接口超时重复提交: 很多时候 HTTP 客户端工具都默认开启超时重试的机制,尤其是第三方调用接口时候,为了防止网络波动超时等造成的请求失败,都会添加重试机制,导致一个请求提交多次。
  • 消息进行重复消费: 当使用 MQ 消息中间件时候,如果发生消息中间件出现错误未及时提交消费信息,导致发生重复消费。

使用幂等性最大的优势在于使接口保证任何幂等性操作,免去因重试等造成系统产生的未知的问题。

引入幂等性后对系统的影响

幂等性是为了简化客户端逻辑处理,能放置重复提交等操作,但却增加了服务端的逻辑复杂性和成本。

其主要是:

  • 把并行执行的功能改为串行执行,降低了执行效率
  • 增加了额外控制幂等的业务逻辑,复杂化了业务功能

所以在使用时候需要考虑是否引入幂等性的必要性,根据实际业务场景具体分析,除了业务上的特殊要求外,一般情况下不需要引入的接口幂等性。

Restful API 接口的幂等性

现在流行的 Restful 推荐的几种 HTTP 接口方法中,分别存在幂等行与不能保证幂等的方法。

 

如上图:

  • √ 满足幂等
  • x 不满足幂等
  • - 可能满足也可能不满足幂等,根据实际业务逻辑有关

如何实现幂等性

| 方案一:数据库唯一主键

方案描述: 数据库唯一主键的实现主要是利用数据库中主键唯一约束的特性,一般来说唯一主键比较适用于“插入”时的幂等性,其能保证一张表中只能存在一条带该唯一主键的记录。

使用数据库唯一主键完成幂等性时需要注意的是,该主键一般来说并不是使用数据库中自增主键,而是使用分布式 ID 充当主键,这样才能能保证在分布式环境下 ID 的全局唯一性。

适用操作:

  • 插入操作
  • 删除操作

使用限制: 需要生成全局唯一主键 ID。

 

主要流程 如上图:

  • 客户端执行创建请求,调用服务端接口。
  • 服务端执行业务逻辑,生成一个分布式 ID,将该 ID 充当待插入数据的主键,然后从数据插入操作,运行对应的 SQL 语句。
  • 服务端将该条数据插入数据库中,如果插入成功则表示没有重复调用接口。如果抛出主键重复异常,则表示数据库中已经存在该条记录,返回错误信息到客户端。

| 方案二:数据库乐观锁

方案描述: 数据库乐观锁方案一般只能适用于执行“更新操作”的过程,我们可以提前在对应的数据表中多添加一个 字段,充当当前数据的版本标识。

这样每次对该数据库该表的这条数据执行更新时,都会将该版本标识作为一个条件,值为上次待更新数据中的版本标识的值。

适用操作: 更新操作; 使用限制: 需要数据库对应业务表中添加额外字段。

描述示例:

 

例如,存在如下的数据表中:

 

为了每次执行更新时防止重复更新,确定更新的一定是要更新的内容,我们通常都会添加一个 version 字段记录当前的记录版本。

这样在更新时候将该值带上,那么只要执行更新操作就能确定一定更新的是某个对应版本下的信息。

 

这样每次执行更新时候,都要指定要更新的版本号,如下操作就能准确更新 version=5 的信息:

UPDATE my_table SET price=price+50,version=version+1 WHERE id=1 AND version=5

上面 WHERE 后面跟着条件 id=1 AND version=5 被执行后,id=1 的 version 被更新为 6。

所以如果重复执行该条 SQL 语句将不生效,因为 id=1 AND version=5 的数据已经不存在,这样就能保住更新的幂等,多次更新对结果不会产生影响。

| 方案三:防重 Token 令牌

方案描述: 针对客户端连续点击或者调用方的超时重试等情况,例如提交订单,此种操作就可以用 Token 的机制实现防止重复提交。

简单地说就是调用方在调用接口的时候先向后端请求一个全局 ID(Token),请求的时候携带这个全局 ID 一起请求(Token 最好将其放到 Headers 中)。

后端需要对这个 Token 作为 Key,用户信息作为 Value 到 Redis 中进行键值内容校验,如果 Key 存在且 Value 匹配就执行删除命令,然后正常执行后面的业务逻辑。

如果不存在对应的 Key 或 Value 不匹配就返回重复执行的错误信息,这样来保证幂等操作。

适用操作:

  • 插入操作
  • 更新操作
  • 删除操作

使用限制:

  • 需要生成全局唯一 Token 串
  • 需要使用第三方组件 Redis 进行数据效验

 

主要流程如上图:

  • 服务端提供获取 Token 的接口,该 Token 可以是一个序列号,也可以是一个分布式 ID 或者 UUID 串。
  • 客户端调用接口获取 Token,这时候服务端会生成一个 Token 串。
  • 然后将该串存入 Redis 数据库中,以该 Token 作为 Redis 的键(注意设置过期时间)。
  • 将 Token 返回到客户端,客户端拿到后应存到表单隐藏域中。
  • 客户端在执行提交表单时,把 Token 存入到 Headers 中,执行业务请求带上该 Headers。
  • 服务端接收到请求后从 Headers 中拿到 Token,然后根据 Token 到 Redis 中查找该 key 是否存在。
  • 服务端根据 Redis 中是否存该 key 进行判断,如果存在就将该 key 删除,然后正常执行业务逻辑。如果不存在就抛异常,返回重复提交的错误信息。

注意,在并发情况下,执行 Redis 查找数据与删除需要保证原子性,否则很可能在并发下无法保证幂等性。其实现方法可以使用分布式锁或者使用 Lua 表达式来注销查询与删除操作。

| 方案四:下游传递唯一序列号

方案描述: 所谓请求序列号,其实就是每次向服务端请求时候附带一个短时间内唯一不重复的序列号,该序列号可以是一个有序 ID,也可以是一个订单号,一般由下游生成,在调用上游服务端接口时附加该序列号和用于认证的 ID。

当上游服务器收到请求信息后拿取该 序列号 和下游 认证ID 进行组合,形成用于操作 Redis 的 Key,然后到 Redis 中查询是否存在对应的 Key 的键值对。

根据其结果:

  • 如果存在,就说明已经对该下游的该序列号的请求进行了业务处理,这时可以直接响应重复请求的错误信息。
  • 如果不存在,就以该 Key 作为 Redis 的键,以下游关键信息作为存储的值(例如下游商传递的一些业务逻辑信息),将该键值对存储到 Redis 中 ,然后再正常执行对应的业务逻辑即可。

适用操作:

  • 插入操作
  • 更新操作
  • 删除操作

使用限制:

  • 要求第三方传递唯一序列号
  • 需要使用第三方组件 Redis 进行数据效验

 

主要流程如上图:

  • 下游服务生成分布式 ID 作为序列号,然后执行请求调用上游接口,并附带“唯一序列号”与请求的“认证凭据 ID”。
  • 上游服务进行安全效验,检测下游传递的参数中是否存在“序列号”和“凭据 ID”。
  • 上游服务到 Redis 中检测是否存在对应的“序列号”与“认证 ID”组成的 Key,如果存在就抛出重复执行的异常信息,然后响应下游对应的错误信息。如果不存在就以该“序列号”和“认证 ID”组合作为 Key,以下游关键信息作为 Value,进而存储到 Redis 中,然后正常执行接来来的业务逻辑。

上面步骤中插入数据到 Redis 一定要设置过期时间。这样能保证在这个时间范围内,如果重复调用接口,则能够进行判断识别。

如果不设置过期时间,很可能导致数据无限量的存入 Redis,致使 Redis 不能正常工作。

实现接口幂等示例

这里使用防重 Token 令牌方案,该方案能保证在不同请求动作下的幂等性,实现逻辑可以看上面写的“防重 Token 令牌”方案,接下来写下实现这个逻辑的代码。

| Maven 引入相关依赖

这里使用 Maven 工具管理依赖,这里在 pom.xml 中引入 SpringBoot、Redis、lombok 相关依赖。

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
    </parent>

    <groupId>mydlq.club</groupId>
    <artifactId>springboot-idempotent-token</artifactId>
    <version>0.0.1</version>
    <name>springboot-idempotent-token</name>
    <description>Idempotent Demo</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--springboot web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--springboot data redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

| 配置连接 Redis 的参数

在 application 配置文件中配置连接 Redis 的参数。SpringBoot 基础就不介绍了,最新教程推荐看下面的教程。

如下:

spring:
  redis:
    ssl: false
    host: 127.0.0.1
    port: 6379
    database: 0
    timeout: 1000
    password:
    lettuce:
      pool:
        max-active: 100
        max-wait: -1
        min-idle: 0
        max-idle: 20

| 创建与验证 Token 工具类

创建用于操作 Token 相关的 Service 类,里面存在 Token 创建与验证方法。

其中:

上面只是给与一些建议,再次强调一下,实现幂等性需要先理解自身业务需求,根据业务逻辑来实现这样才合理,处理好其中的每一个结点细节,完善整体的业务流程设计,才能更好的保证系统的正常运行。

最后做一个简单总结:

 

  • Token 创建方法: 使用 UUID 工具创建 Token 串,设置以 “idempotent_token:“+“Token串” 作为 Key,以用户信息当成 Value,将信息存入 Redis 中。
  • Token 验证方法: 接收 Token 串参数,加上 Key 前缀形成 Key,再传入 value 值,执行 Lua 表达式(Lua 表达式能保证命令执行的原子性)进行查找对应 Key 与删除操作。执行完成后验证命令的返回结果,如果结果不为空且非 0,则验证成功,否则失败。
  • import java.util.Arrays;
    import java.util.UUID;
    import java.util.concurrent.TimeUnit;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.core.script.DefaultRedisScript;
    import org.springframework.data.redis.core.script.RedisScript;
    import org.springframework.stereotype.Service;
    
    @Slf4j
    @Service
    public class TokenUtilService {
    
        @Autowired
        private StringRedisTemplate redisTemplate;
    
        /**
         * 存入 Redis 的 Token 键的前缀
         */
        private static final String IDEMPOTENT_TOKEN_PREFIX = "idempotent_token:";
    
        /**
         * 创建 Token 存入 Redis,并返回该 Token
         *
         * @param value 用于辅助验证的 value 值
         * @return 生成的 Token 串
         */
        public String generateToken(String value) {
            // 实例化生成 ID 工具对象
            String token = UUID.randomUUID().toString();
            // 设置存入 Redis 的 Key
            String key = IDEMPOTENT_TOKEN_PREFIX + token;
            // 存储 Token 到 Redis,且设置过期时间为5分钟
            redisTemplate.opsForValue().set(key, value, 5, TimeUnit.MINUTES);
            // 返回 Token
            return token;
        }
    
        /**
         * 验证 Token 正确性
         *
         * @param token token 字符串
         * @param value value 存储在Redis中的辅助验证信息
         * @return 验证结果
         */
        public boolean validToken(String token, String value) {
            // 设置 Lua 脚本,其中 KEYS[1] 是 key,KEYS[2] 是 value
            String script = "if redis.call('get', KEYS[1]) == KEYS[2] then return redis.call('del', KEYS[1]) else return 0 end";
            RedisScript<Long> redisScript = new DefaultRedisScript<>(script, Long.class);
            // 根据 Key 前缀拼接 Key
            String key = IDEMPOTENT_TOKEN_PREFIX + token;
            // 执行 Lua 脚本
            Long result = redisTemplate.execute(redisScript, Arrays.asList(key, value));
            // 根据返回结果判断是否成功成功匹配并删除 Redis 键值对,若果结果不为空和0,则验证通过
            if (result != null && result != 0L) {
                log.info("验证 token={},key={},value={} 成功", token, key, value);
                return true;
            }
            log.info("验证 token={},key={},value={} 失败", token, key, value);
            return false;
        }
    
    }

    | 创建测试的 Controller 类

    创建用于测试的 Controller 类,里面有获取 Token 与测试接口幂等性的接口,内容如下:

  • import lombok.extern.slf4j.Slf4j;
    import mydlq.club.example.service.TokenUtilService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    @Slf4j
    @RestController
    public class TokenController {
    
        @Autowired
        private TokenUtilService tokenService;
    
        /**
         * 获取 Token 接口
         *
         * @return Token 串
         */
        @GetMapping("/token")
        public String getToken() {
            // 获取用户信息(这里使用模拟数据)
            // 注:这里存储该内容只是举例,其作用为辅助验证,使其验证逻辑更安全,如这里存储用户信息,其目的为:
            // - 1)、使用"token"验证 Redis 中是否存在对应的 Key
            // - 2)、使用"用户信息"验证 Redis 的 Value 是否匹配。
            String userInfo = "mydlq";
            // 获取 Token 字符串,并返回
            return tokenService.generateToken(userInfo);
        }
    
        /**
         * 接口幂等性测试接口
         *
         * @param token 幂等 Token 串
         * @return 执行结果
         */
        @PostMapping("/test")
        public String test(@RequestHeader(value = "token") String token) {
            // 获取用户信息(这里使用模拟数据)
            String userInfo = "mydlq";
            // 根据 Token 和与用户相关的信息到 Redis 验证是否存在对应的信息
            boolean result = tokenService.validToken(token, userInfo);
            // 根据验证结果响应不同信息
            return result ? "正常调用" : "重复调用";
        }
    
    }

    | 创建 SpringBoot 启动类

    创建启动类,用于启动 SpringBoot 应用。

  • import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }

    | 写测试类进行测试

    写个测试类进行测试,多次访问同一个接口,测试是否只有第一次能否执行成功。

  • import org.junit.Assert;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.http.MediaType;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
    import org.springframework.test.web.servlet.setup.MockMvcBuilders;
    import org.springframework.web.context.WebApplicationContext;
    
    @Slf4j
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class IdempotenceTest {
    
        @Autowired
        private WebApplicationContext webApplicationContext;
    
        @Test
        public void interfaceIdempotenceTest() throws Exception {
            // 初始化 MockMvc
            MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
            // 调用获取 Token 接口
            String token = mockMvc.perform(MockMvcRequestBuilders.get("/token")
                    .accept(MediaType.TEXT_HTML))
                    .andReturn()
                    .getResponse().getContentAsString();
            log.info("获取的 Token 串:{}", token);
            // 循环调用 5 次进行测试
            for (int i = 1; i <= 5; i++) {
                log.info("第{}次调用测试接口", i);
                // 调用验证接口并打印结果
                String result = mockMvc.perform(MockMvcRequestBuilders.post("/test")
                        .header("token", token)
                        .accept(MediaType.TEXT_HTML))
                        .andReturn().getResponse().getContentAsString();
                log.info(result);
                // 结果断言
                if (i == 0) {
                    Assert.assertEquals(result, "正常调用");
                } else {
                    Assert.assertEquals(result, "重复调用");
                }
            }
        }
    
    }

    显示如下:

  • [main] IdempotenceTest:  获取的 Token 串:980ea707-ce2e-456e-a059-0a03332110b4
    [main] IdempotenceTest:  第1次调用测试接口
    [main] IdempotenceTest:  正常调用
    [main] IdempotenceTest:  第2次调用测试接口
    [main] IdempotenceTest:  重复调用
    [main] IdempotenceTest:  第3次调用测试接口
    [main] IdempotenceTest:  重复调用
    [main] IdempotenceTest:  第4次调用测试接口
    [main] IdempotenceTest:  重复调用
    [main] IdempotenceTest:  第5次调用测试接口
    [main] IdempotenceTest:  重复调用

    总结

    幂等性是开发当中很常见也很重要的一个需求,尤其是支付、订单等与金钱挂钩的服务,保证接口幂等性尤其重要。

    在实际开发中,我们需要针对不同的业务场景我们需要灵活的选择幂等性的实现方式:

  • 对于下单等存在唯一主键的,可以使用“唯一主键方案”的方式实现。
  • 对于更新订单状态等相关的更新场景操作,使用“乐观锁方案”实现更为简单。
  • 对于上下游这种,下游请求上游,上游服务可以使用“下游传递唯一序列号方案”更为合理。
  • 类似于前端重复提交、重复下单、没有唯一ID号的场景,可以通过 Token 与 Redis 配合的“防重 Token 方案”实现更为快捷。
SpringBoot第19讲:SpringBoot 如何保证接口幂等 幂等原先是数学中的一个概念,表示进行1次变换和进行N次变换产生的效果相同。以相同的请求调用这个接口一次和调用这个接口多次,对系统产生的影响是相同的。如果一个接口满足这个特性,那么我们就说这个接口是一个幂等接口。接口幂等和防止重复提交是一回事吗?严格来说,并不是。幂等: 更多的是在重复请求已经发生,或是无法避免的情况下,采取一定的技术手段让这些重复请求不给系统带来副作用。防止重复: 提交更多的是不让用户发起多次一样的请求。 阅读详情

相关推荐

V4L2教程(1):Ubuntu V4L2开发环境搭建与设备探索

欢迎来到V4L2学习指南的第一篇!本文将带你从零开始,在Ubuntu系统上搭建完整的V4L2视频采集开发环境。无论你是想开发视频监控、视频会议还是机器视觉应用,掌握V4L2都是Linux视频开发的必经之路。 **本节学习目标**: - 理解V4L2的基本概念和架构 - 搭建Ubuntu下的V4L2开发环境 - 掌握v4l2-ctl等调试工具的使用 - 学会检测和配置USB摄像头设备

琅嬛福地 417

SpringBoot - 如何实现接口幂等性?

幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。......

记录并分享 1168

【图像超分】论文复现:Pytorch实现ESPCN

论文精读:由于ESPCN没有公布源码,我们选择github上一个高star的项目来复现。准备数据集,以及数据预处理搭建网络模型设置参数并训练测试训练好的模型用训练好的模型测试自己的数据本文我们使用pycharm链接服务器训练。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1万+

SpringBoot如何保证接口的幂等性?六种方案一次讲清楚~

在计算机领域中,幂等(Idempotence)是指任意一个操作的多次执行总是能获得相同的结果,不会对系统状态产生额外影响。在Java后端开发中,幂等性的实现通常通过确保方法或服务调用的结果具有确定性,无论调用次数如何,结果都是可预期的。上面的定义是目前大多数文章和书籍对幂等的描述,然而,在实际的互联网服务开发中,幂等性的理论定义与业务逻辑间的冲突是常见的。

竹林幽深 1541

【异常】出现“‘git‘ 不是内部或外部命令,也不是可运行的程序”的错误

出现“‘git’ 不是内部或外部命令,也不是可运行的程序”的错误通常意味着 Git 没有被正确安装在你的系统上,或者其可执行文件的路径没有被添加到系统的环境变量中。

奶爸的编程之路,也就一周冷个三天 1392

企业级 Token 中转架构设计:高并发、多模型、费用监控一次搞定

摘要:本文针对企业级AI开发中的多模型接口混乱、高并发稳定性差及Token费用失控等痛点,提出一套2026年企业级Token中转架构解决方案。该方案采用五层分层设计(接入层、网关层、调度层、服务层、存储层),实现多模型统一接口、智能路由、高并发限流容错及精细化成本监控。核心功能包括:异构模型标准化接入、动态路由策略(场景/成本/负载/容灾)、多级限流熔断机制、全链路Token计费与安全防封体系(指纹清洗、IP池隔离)。通过分层解耦与模块化设计,企业可降低50%成本、提升99%稳定性,并避免封号风险。文章还提

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 149

Springboot中实现接口幂等性的 4 种方案

请注意,这些示例代码仅为演示目的,实际应用中需要根据系统需求进行适当的优化和安全性考虑。此外,这些示例中并没有涉及完整的异常处理和并发处理,你需要根据具体情况进行补充。当谈到在Spring Boot中实现接口幂等性时,有几种常见的方案可以考虑。

牛肉胡辣汤 1272

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

Systemcall名屋 1689

微服务 接口 高并发 幂等 防重 高并发扣减

本文是从技术论坛上大家一人一句没有条理的讲解,我整理一下发到优快云上,希望对大家有用。 什么是幂等性 抄用一段数学上的定义:f(f(x)) = f(x)。x被函数f作用一次和作用无限次的结果是一样的。幂等性应用在软件系统中,我把它简单定义为:某个函数或者某个接口使用相同参数调用一次或者无限次,其造成的后果是一样的,在实际应用中一般针对于接口进行幂等性设计。举个栗子,在系统中,调用方A调用系统B的...

zhaoyang10的专栏 1904

【时时三省】tessy 集成测试:小白入门指导手册

有图有文字详细介绍 tessy 集成测试 操作方法。

时时三省的博客 2518

Simulink仿真入门到精通(三) Simulink信号

本系列教程是根据孙忠潇编著的<<Simulink仿真及代码生成技术入门到精通>>学习笔记。 目录 Simulink仿真入门到精通(一) Simulink界面介绍 Simulink仿真入门到精通(二) Simulink模块 Simulink仿真入门到精通(三) Simulink信号 Simulink仿真入门到精通(四) Simulink子系统 Simulink仿真入门到精通(五) Simulink模型的仿真 Simulink仿真入门到精通(六) Simulink模型保存为图片 Sim

king110108的专栏 5397

浅谈高并发解决方案

浅谈高并发解决方案 什么是高并发? 高并发(High Concurrency)通常是指通过设计保证系统能够同时并行处理很多请求。 通俗来讲,高并发是指在同一个时间点,有很多用户同时的访问同一 API 接口或者 Url 地址。它经常会发生在有大活跃用户量,用户高聚集的业务场景中。 高并发是互联网应用的一大特点,也是互联网应用不可避免的一个问题;比如 淘宝双11 购物狂欢节,京东 618 购物促销节,12306 春节火车票,促销,秒杀等。 解决高并发问题是一个系统工程,需要站在全局高度统筹谋划,

Eshare分享 2870

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

浅谈分布式系统

分布式系统

2401_83595513的博客 1751

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

浅谈幂等设计

《分布式系统中的幂等性设计与实现》 摘要:幂等性是指操作执行一次与多次结果相同的特性,在分布式系统中尤为重要。文章首先分析了幂等性的必要性,指出金融交易等场景必须保证操作幂等以避免重复扣款等问题。接着提出三种实现方案:1)利用数据库唯一索引防重;2)采用token令牌机制进行请求验证;3)使用分布式锁控制并发。文中特别对比了幂等性与并发安全的区别,并介绍了Snowflake算法生成分布式ID的方案。最后指出幂等性实现虽然简化客户端逻辑,但会增加服务端复杂度和降低执行效率。通过具体案例和SQL示例,系统性地阐

194

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

分布式架构设计:浅谈分布式系统及其nginx

导读 随着互联网的蓬勃发展,现在的各种各样的联网工具都出现,连聊天工具也数不胜数———QQ、微信、陌陌等等,这些聊天工具每天每日都有人在用着它,最高时可达几百万甚至几千万同时利用的可能性,微博爆炸性新闻的发表,也会导致千万级的人流量去同时对这种头条进行访问。那么我们可以知道这样的人流量,一台服务器根本招架不住,甚至会导致服务器彻底奔溃,这样又损财又损人是一个很不好的选择。 分布式系统 接上,...

qq_41903105的博客 1501

浅谈幂等设计 | 京东云技术团队

如今随着互联网技术快速发展,业务越来越复杂,系统的高并发和关键数据的场景越来越多。在分布式系统中,机器宕机和消息丢失也是需要重点关注的问题,其中的一个典型就是幂等性问题。

京东科技开发者 148

浅谈下对熔断、限流和降级的理解?在分布式系统中熔断、限流和降级的作用是什么?

熔断、限流和降级是现代分布式系统中常用的三种稳定性保障机制。它们分别通过不同的方式保护系统在高并发、高负载或部分服务故障的情况下,仍能提供基本的服务能力。以确保系统的整体稳定性和可用性。

Java开发者,专注后端技术分享,深耕框架实战与架构优化,持续输出优质技术干货。 1416

【redis初阶】浅谈分布式系统

redis学习🥳在正式引入架构演进之前,为避免读者对架构中的概念完全不了解导致低效沟通,优先对其中一些比为了完成一整套服务的一个程序或者一组相互配合的程序群。生活例子类比:为了完成一项任务,而搭建的由一个人或者一群相互配的人组成的团队。当应用较复杂时,为了分离职责,将其中具有清晰职责的、内聚性强的部分,抽象出概念,便于理解。生活例子类比:军队中为了进行某据点的攻克,将人员分为突击小组、爆破小组、掩护小组、通信小组等。系统中的多个模块被部署于不同服务器之上,即可以将该系统称为分布式系统。

qq_52842680的博客 1149

【长文干货】浅析分布式系统

转载自:浅谈分布式系统 WeTest导读 我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ、微信、淘宝。那么,一个互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂?本文就是想从最基本的地方开始,探寻服务器端系统技术的基础概念。 承载量是分布式系统存在的原因 当一个互联网业务获得大众欢迎的时候,最显著碰到的技术问题,就是

Roykuang的专栏 1447
上一篇: 面试被吊打!正确打开Redis分布式锁的七种方案,涨见识了
下一篇: 五分钟带你学会微服务熔断原理分析与源码解读
java_lujj
博客等级 码龄4年 18粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值