防止调用 API 中的潜在竞争条件?
Preventing Potential Race Condition in Calls to an API?
我的 node.js 服务器经常访问一个 API。它要求我每 3 个月更改一次密码。幸运的是,还有一个 API 更改密码的调用。 :) 我有一个定期 运行s 并在必要时更改密码的 cron 作业。
如果我的应用在更改密码的确切时间访问 API,则存在潜在的竞争条件并且 API 调用可能会失败。有哪些好的模式可以处理这个问题?
我可以将所有 API 调用放入一个队列,然后使用 cron 作业将最近的调用从队列中拉出并 运行 它。如果 API 调用失败,它将留在队列中并在下一次 cron 作业 运行 时获得 运行。但这似乎有点矫枉过正。
我可以将 try/catch 处理程序与 API 调用一起使用,在一个 while 循环内,然后 运行 while 循环直到 API 调用成功完成。但这会阻止我的应用程序的其余部分。
我可以在 setTimeOut 中使用带有 API 调用的 try/catch 处理程序,然后重新 运行 setTimeOut 直到 API 调用成功完成。这样,当主线程完成其他工作并开始处理时,API 调用只会 运行。但是如果服务器负载很重,这会是一个错误吗?
有没有更好的模式来处理这种事情?
try/catch 处理程序会在服务器崩溃时丢失数据,因此我采用了 cron job/queue 方法。我在我的数据库中使用一个维护为 table 的队列,这样如果有什么东西中断了服务器,什么都不会丢失。
我的 node.js 服务器经常访问一个 API。它要求我每 3 个月更改一次密码。幸运的是,还有一个 API 更改密码的调用。 :) 我有一个定期 运行s 并在必要时更改密码的 cron 作业。
如果我的应用在更改密码的确切时间访问 API,则存在潜在的竞争条件并且 API 调用可能会失败。有哪些好的模式可以处理这个问题?
我可以将所有 API 调用放入一个队列,然后使用 cron 作业将最近的调用从队列中拉出并 运行 它。如果 API 调用失败,它将留在队列中并在下一次 cron 作业 运行 时获得 运行。但这似乎有点矫枉过正。
我可以将 try/catch 处理程序与 API 调用一起使用,在一个 while 循环内,然后 运行 while 循环直到 API 调用成功完成。但这会阻止我的应用程序的其余部分。
我可以在 setTimeOut 中使用带有 API 调用的 try/catch 处理程序,然后重新 运行 setTimeOut 直到 API 调用成功完成。这样,当主线程完成其他工作并开始处理时,API 调用只会 运行。但是如果服务器负载很重,这会是一个错误吗?
有没有更好的模式来处理这种事情?
try/catch 处理程序会在服务器崩溃时丢失数据,因此我采用了 cron job/queue 方法。我在我的数据库中使用一个维护为 table 的队列,这样如果有什么东西中断了服务器,什么都不会丢失。