V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yesterdaysun
V2EX  ›  问与答

请问如何设计不发送重复请求?

  •  
  •   yesterdaysun · 2018-10-25 09:48:45 +08:00 · 1585 次点击
    这是一个创建于 2221 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在与第三方 API 对接, 发送创建请求, 要求是不能发送重复内容, 重复是指在记录有效期限内(比如 1 天)不能有第二条重复的, 但是记录本身没有 ID, 对方也不在处理请求时检查, 但是会后后面对记录做重复性检查, 发现就会做删除处理, 但是创建记录的费用还是照收的.

    因为网络原因还有其他应用的原因, 可能发送请求的过程中会超时或者挂掉, 这样程序根本不知道上次请求有没有成功, 甚至极端情况下程序丢失发送记录, 都不知道之前有没有发送过. 目前是会尝试重试的, 所以有时就重复了.

    在这样的情况下, 应该怎么样设计或者改进这个发送请求的功能, 让它不重复呢? 有没有什么好的模式或者架构?

    谢谢!

    11 条回复    2018-10-25 13:53:19 +08:00
    tt67wq
        1
    tt67wq  
       2018-10-25 09:54:44 +08:00
    超时发送挂了的,就当没发送成功吧
    有明确结果的,弄个过滤器,每天重置下。
    还有 丢失发送记录是啥意思?
    p2pCoder
        2
    p2pCoder  
       2018-10-25 09:59:17 +08:00
    超时 挂掉等必须重试,无解
    按你的描述,肯定不是如支付 交易等强事务的接口,超时,挂掉的不频繁的话,重试的费用可以接受,只是你要设置好重试的规则,
    对方暴露接口中不设置流水号,也是很不合理的
    yesterdaysun
        3
    yesterdaysun  
    OP
       2018-10-25 10:02:43 +08:00
    如果当没成功, 但是实际成功了, 然后重新发送了, 就要重复了, 我知道这个情况有点不可控制, 但是后果还是挺严重, 不仅要扣钱还要扣一个信用分, 扣到一定程度就要限制发送额度了, 而且对方明确说了重复发送检查要自己做, 但是他们查到就要扣. 所以还是要想办法解决重复问题

    有明确结果的现在没问题, 有标记检查, 不会重复的.

    丢失记录就是有那么几次数据库事务超时了, 可能某个表被锁住了, 时间一长就自动挂了, 然后标记已发送就失败了, 然后又重复发送了
    marcong95
        4
    marcong95  
       2018-10-25 10:52:40 +08:00
    如果是数据库的问题的话,是不是说明拿到请求成功的响应呢,那能不能说数据库建一个表,每次拿到成功的响应就往里面增加一行,保证每次成功的请求都有记录。
    gaius
        5
    gaius  
       2018-10-25 11:03:10 +08:00
    请求除了成功难道不是抛异常
    你这边的请求失败了但是对方有记录,是网络太差还是对方在搞你?
    yesterdaysun
        6
    yesterdaysun  
    OP
       2018-10-25 11:22:46 +08:00
    @marcong95 目前是有这个表的, 但是就像我说的可能会有锁超时的问题, 导致记录进不去, 我知道这里的代码可能有问题, 可能最终还是要改这里, 但是一个是这是老代码, 难搞, 另一个就是想问有没有更高级的方法或者框架直接解决这个事了

    @gaius 请求有可能超时的, 网络是很差, 国外的网站, 也想着把请求的服务器放国外去, 但是那不是动起来太复杂了, 先研究研究有没有其他简单的方法
    chenyu8674
        7
    chenyu8674  
       2018-10-25 11:27:25 +08:00
    没有 ID
    验重在服务端做
    API 按调用次数收费

    明摆着对方在坑你啊……
    iConnect
        8
    iConnect  
       2018-10-25 11:30:48 +08:00 via Android
    没有 id 记录的 API 请求,这种服务收费有问题
    R18
        9
    R18  
       2018-10-25 11:34:01 +08:00
    数据库之外在缓存里也存一份?一天自动过期。看缓存里存不存在就行了,但是要防止缓存挂掉后全部识别为未发送。
    yesterdaysun
        10
    yesterdaysun  
    OP
       2018-10-25 13:48:12 +08:00
    @chenyu8674 在不能换服务商之前就是要被坑啊!

    @R18 缓存是个好办法, 虽然感觉只是又加了一层保险, 但是好像也算是一个简单可行的方案了, 多谢!
    lhx2008
        11
    lhx2008  
       2018-10-25 13:53:19 +08:00 via Android
    更坑的都见过,渣浪微博的商业接口,渣浪那边的 nginx 反代的超时时间 100ms,超时自动切断,然后返回一个一半的 json 给你,钱照扣,并且还写的很清楚,就是有这样的问题,请自己重试。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   914 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:43 · PVG 05:43 · LAX 13:43 · JFK 16:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.