绿城舟 發表於 2025-5-31 14:47:00

还在深夜加班改Bug?雷军都点赞的防重提方案来了!

<h2 id="前言">前言</h2>
<p>这是一个希望让每一位程序员按时下班的防止重复提交开源利器。</p>
<pre><code>“那天凌晨2点,我因为重复提交漏洞被搞得半夜加班解决问题。

现在,我只用一行代码 就解决了这个问题——

这就是 resubmit ,一个普通程序员送给所有同行的防崩盘保险。”
</code></pre>
<p>—— 一位不愿意透露姓名的 996 程序员</p>
<h2 id="防重复提交">防重复提交</h2>
<h3 id="实现方式对比">实现方式对比</h3>
<p>实现方式对比</p>
<pre><code class="language-java">// 方案1:手动if校验(新手最爱)
if(!cache.contains(requestId)) { // 漏判并发问题 → 资损事故
    doBusiness();
}

// 方案2:AOP切面(老鸟的选择)
@Around("execution(* com..*Controller.*(..))") // 几十行代码+调试验证 → 加班秃头
public Object checkRepeat(ProceedingJoinPoint joinPoint) {
    // 复杂参数解析...
}

// 方案3:resubmit(今天起换种活法)
@Resubmit(5000) // ◾ 1行注解 → 下班约会
public void business(String id) {
    // 安心写核心逻辑
}
</code></pre>
<h3 id="参数理性美精准到毫秒的防御方程">参数理性美:精准到毫秒的防御方程</h3>
<p>可以结合自己的实际业务,调整阈值。</p>
<table>
<thead>
<tr>
<th>防御场景</th>
<th>resubmit方案</th>
<th>传统方案</th>
</tr>
</thead>
<tbody>
<tr>
<td>支付防连点</td>
<td><code>@Resubmit(3000)</code></td>
<td>前端按钮禁用+后端校验</td>
</tr>
<tr>
<td>表单防重复提交</td>
<td><code>@Resubmit(10000)</code></td>
<td>Token机制+Session管理</td>
</tr>
<tr>
<td>秒杀防超卖</td>
<td><code>@Resubmit(0)</code></td>
<td>Redis分布式锁</td>
</tr>
</tbody>
</table>
<p>resubmit 适合 99% 中小项目,无缝整合 spring,纵享丝滑。</p>
<p>当然也支持分布式集群,支持灵活拓展。</p>
<h3 id="-三步接入永久告别重复提交噩梦">🚀 三步接入,永久告别重复提交噩梦</h3>
<h3 id="step-1加个注解比写注释还简单">STEP 1:加个注解(比写注释还简单)</h3>
<pre><code class="language-java">public class OrderService {
    @Resubmit(5000) // 5秒内相同订单ID拦截
    public void pay(String orderId) {
      // 你的核心业务逻辑
    }
}
</code></pre>
<h3 id="step-2springboot专属自动防御模式">STEP 2:SpringBoot专属(自动防御模式)</h3>
<pre><code class="language-xml">&lt;dependency&gt;
    &lt;groupId&gt;com.github.houbb&lt;/groupId&gt;
    &lt;artifactId&gt;resubmit-springboot-starter&lt;/artifactId&gt;
    &lt;version&gt;1.1.1&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<h3 id="step-3分布式扩展redis集群护航">STEP 3:分布式扩展(Redis集群护航)</h3>
<pre><code class="language-java">@EnableResubmit(cache = "redisCache")

@Bean
public ICommonCacheService redisCache() {
    return new RedisCacheService("127.0.0.1:6379");
}
</code></pre>
<h2 id="尾声">尾声</h2>
<p>resubmit 只做一件事:用最优雅的方式,杀死重复提交</p>
<p>这世界从不缺复杂的系统,缺的是让程序员 早点下班 的诚意</p>
<p>👉 马上体验 resubmit</p>
<p>“在重复提交的战场上,最好的防御是让用户感知不到防御的存在”<br>
“程序员写代码的时间应该省下来,多陪陪家人”</p>
<p>✋ P.S. 来自作者的坦白</p>
<p>“这个项目没有融资、没有PR团队。如果你也被重复提交折磨过,点个Star就是对我最大的认可”</p>
<p>houbb @ GitHub</p>
<h1 id="拓展阅读">拓展阅读</h1>
<p>01-面试官:你们项目中是怎么做防重复提交的?</p>
<p>02-java 表单避免重复提交 resubmit 开源项目介绍</p>
<p>03-idempotent 幂等性介绍+如何防止重复提交?</p>
<p>04-简单聊一聊防重复提交</p>
<p>05-还在深夜加班改Bug?雷军都点赞的防重提方案来了!</p>
<h2 id="开源矩阵">开源矩阵</h2>
<p>下面是一些从防止重复提交相关,整个系列的开源矩阵规划。</p>
<table>
<thead>
<tr>
<th style="text-align: left">名称</th>
<th style="text-align: left">介绍</th>
<th style="text-align: left">状态</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left">resubmit</td>
<td style="text-align: left">防止重复提交核心库</td>
<td style="text-align: left">已开源</td>
</tr>
<tr>
<td style="text-align: left">rate-limit</td>
<td style="text-align: left">限流核心库</td>
<td style="text-align: left">已开源</td>
</tr>
<tr>
<td style="text-align: left">cache</td>
<td style="text-align: left">手写渐进式 redis</td>
<td style="text-align: left">已开源</td>
</tr>
<tr>
<td style="text-align: left">lock</td>
<td style="text-align: left">开箱即用的分布式锁</td>
<td style="text-align: left">已开源</td>
</tr>
<tr>
<td style="text-align: left">common-cache</td>
<td style="text-align: left">通用缓存标准定义</td>
<td style="text-align: left">研发中</td>
</tr>
<tr>
<td style="text-align: left">redis-config</td>
<td style="text-align: left">兼容各种常见的 redis 配置模式</td>
<td style="text-align: left">研发中</td>
</tr>
<tr>
<td style="text-align: left">quota-server</td>
<td style="text-align: left">限额限次核心服务</td>
<td style="text-align: left">待开始</td>
</tr>
<tr>
<td style="text-align: left">quota-admin</td>
<td style="text-align: left">限额限次控台</td>
<td style="text-align: left">待开始</td>
</tr>
<tr>
<td style="text-align: left">flow-control-server</td>
<td style="text-align: left">流控核心服务</td>
<td style="text-align: left">待开始</td>
</tr>
<tr>
<td style="text-align: left">flow-control-admin</td>
<td style="text-align: left">流控控台</td>
<td style="text-align: left">待开始</td>
</tr>
</tbody>
</table><br><br>
来源:https://www.cnblogs.com/houbbBlogs/p/18905346
頁: [1]
查看完整版本: 还在深夜加班改Bug?雷军都点赞的防重提方案来了!