我是在回答自己的问题,但我想,我之所以写这个,是因为我在这个问题上颇为纠结,我也很想听听其他的答案。
我们正在使用Stripe服务器端进行支付(一次性和订阅),并使用Stripe webhooks在我们的DB中记录支付和事件。我们在一个负载平衡器后面有多台服务器,我们使用的是金丝雀滚动部署,所以在部署过程中,并不是所有服务器都运行相同的代码版本。
当你想升级Stripe API版本时,经常会有一些突破性的模型变化(例如新的或重命名的字段),需要修改代码。而如果你不经常升级,可能会有很多变化! 咳 咳嗽 😬
在滚动部署期间有一个问题。
Stripe允许你设置多个webhook URL,每个都有自己的API版本。但所有匹配的事件都会被发送到所有的webhook URLS上。 这一点我一开始根本不清楚)。
在新的Stripe Java库中也有一个机制,当事件模型不匹配时,可以实现你自己的 "异常处理程序",但这需要编写代码,并跟踪上次升级后的每一个模型变化,在我们的情况下,这太多了 :)
另外,对于较新的Stripe库,你不能覆盖Stripe的版本:它现在是硬编码的(这很有意义)。
我对这个问题的解决方法如下。
version
参数到Stripe中的webhook URL(如 https://example.net/stripe/webhook?version=2019-xx-yy
与当前使用的API版本)。)version
URL参数与当前库代码版本:如果它们匹配,则处理该事件。否则,忽略它(先部署那个变化)。https://example.net/stripe/webhook?version=2020-zz-tt
). 此时,服务器将收到 一式两份但由于版本不匹配,他们会在新格式中 "放弃 "事件。这很复杂,我觉得自己想多了。在部署过程中,还有一小部分事件不被处理的可能性(因为两个事件版本都去了忽略的服务器)。
所以我很好奇有没有人有更简单的解决方案。
你也可以直接 通过API创建一个新的webhook端点。 并将其指向新升级的代码库--这可能是最好的方法。