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

2018-10-25 09:48:45 +08:00
 yesterdaysun

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

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

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

谢谢!

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

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

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

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

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

@R18 缓存是个好办法, 虽然感觉只是又加了一层保险, 但是好像也算是一个简单可行的方案了, 多谢!
lhx2008
2018-10-25 13:53:19 +08:00
更坑的都见过,渣浪微博的商业接口,渣浪那边的 nginx 反代的超时时间 100ms,超时自动切断,然后返回一个一半的 json 给你,钱照扣,并且还写的很清楚,就是有这样的问题,请自己重试。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/500920

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX