现在与第三方 API 对接, 发送创建请求, 要求是不能发送重复内容, 重复是指在记录有效期限内(比如 1 天)不能有第二条重复的, 但是记录本身没有 ID, 对方也不在处理请求时检查, 但是会后后面对记录做重复性检查, 发现就会做删除处理, 但是创建记录的费用还是照收的.
因为网络原因还有其他应用的原因, 可能发送请求的过程中会超时或者挂掉, 这样程序根本不知道上次请求有没有成功, 甚至极端情况下程序丢失发送记录, 都不知道之前有没有发送过. 目前是会尝试重试的, 所以有时就重复了.
在这样的情况下, 应该怎么样设计或者改进这个发送请求的功能, 让它不重复呢? 有没有什么好的模式或者架构?
谢谢!
1
tt67wq 2018-10-25 09:54:44 +08:00
超时发送挂了的,就当没发送成功吧
有明确结果的,弄个过滤器,每天重置下。 还有 丢失发送记录是啥意思? |
2
p2pCoder 2018-10-25 09:59:17 +08:00
超时 挂掉等必须重试,无解
按你的描述,肯定不是如支付 交易等强事务的接口,超时,挂掉的不频繁的话,重试的费用可以接受,只是你要设置好重试的规则, 对方暴露接口中不设置流水号,也是很不合理的 |
3
yesterdaysun OP 如果当没成功, 但是实际成功了, 然后重新发送了, 就要重复了, 我知道这个情况有点不可控制, 但是后果还是挺严重, 不仅要扣钱还要扣一个信用分, 扣到一定程度就要限制发送额度了, 而且对方明确说了重复发送检查要自己做, 但是他们查到就要扣. 所以还是要想办法解决重复问题
有明确结果的现在没问题, 有标记检查, 不会重复的. 丢失记录就是有那么几次数据库事务超时了, 可能某个表被锁住了, 时间一长就自动挂了, 然后标记已发送就失败了, 然后又重复发送了 |
4
marcong95 2018-10-25 10:52:40 +08:00
如果是数据库的问题的话,是不是说明拿到请求成功的响应呢,那能不能说数据库建一个表,每次拿到成功的响应就往里面增加一行,保证每次成功的请求都有记录。
|
5
gaius 2018-10-25 11:03:10 +08:00
请求除了成功难道不是抛异常
你这边的请求失败了但是对方有记录,是网络太差还是对方在搞你? |
6
yesterdaysun OP |
7
chenyu8674 2018-10-25 11:27:25 +08:00
没有 ID
验重在服务端做 API 按调用次数收费 明摆着对方在坑你啊…… |
8
iConnect 2018-10-25 11:30:48 +08:00 via Android
没有 id 记录的 API 请求,这种服务收费有问题
|
9
R18 2018-10-25 11:34:01 +08:00
数据库之外在缓存里也存一份?一天自动过期。看缓存里存不存在就行了,但是要防止缓存挂掉后全部识别为未发送。
|
10
yesterdaysun OP |
11
lhx2008 2018-10-25 13:53:19 +08:00 via Android
更坑的都见过,渣浪微博的商业接口,渣浪那边的 nginx 反代的超时时间 100ms,超时自动切断,然后返回一个一半的 json 给你,钱照扣,并且还写的很清楚,就是有这样的问题,请自己重试。
|