重复请求的幂等接口设计的思考(二)

后续场景思路分析

上篇文章
重复请求的幂等接口设计的思考(一)中,采用insert ignore方式完成了幂等接口的设计。文章末尾提出的一个问题,不知道大家是如何解决。

在具体应用场景中,对于幂等接口,可能会出现:

1.上游消息内容错误

2.接口内部代码出现异常等其他原因导致未完成原本的业务功能

这个时候需要再次执行幂等接口,该如何处理呢?

思路:首先想到的就是写一个手动的接口,根据传入参数去删除特定业务的幂等数据。也可以采用定时任务方式,根据具体状态值查找出需要重新执行的业务再次执行。(项目中两种都使用了)

具体代码实现

创建token_bus表

重点是业务唯一值字段和状态字段。
大家可以根据不同业务场景添加其他字段内容。
如果想做得更细,可以把状态细化(例如:未执行、执行中、执行异常、执行成功…),也可添加描述异常信息的字段用来具体定位此接口的失败原因,这样能够更细致完善的写手动和自动重新执行接口了。(这样复杂度就跟着提升了,最终根据具体业务场景灵活处理)

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
@Table(name = "token_bus")
@ToString
public class TokenBus {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(length = 32)
    public int id;

    /** 业务唯一值 (添加了唯一索引) */
    @Column(name = "unique_key", nullable = false, length = 64, unique = true)
    private String uniqueKey;

    /** 0-开始执行 1- 执行结束*/
    @Column(name = "state", nullable = false)
    private Byte state;

    /** 记录创建日期 */
    private Date createdAt;

    /** 记录更新日期 */
    private Date updatedAt;

}

插入sql语句

    @Modifying
    @Query(nativeQuery = true,value = "insert ignore into token_bus (unique_key, state, created_at, updated_at) values (?1, ?2 ,?3, ?4)")
    int insert(String key, Byte state, Date createdAt, Date updatedAt);

具体业务层代码就不详细写了,如有需要欢迎留言或者添加微信一起探讨。刚刚文中提到用定时任务去处理异常情况再执行问题,下篇讲讲springboot的定时任务的对接。

更多文章

三年程序员的第一篇公号文章
自动化远程登陆操作和传输文件(scp ssh expect)

长按二维码关注,阅读我的程序员故事


你可能感兴趣的:(微信公号原创)