我正在运行的网络服务遇到了棘手的问题。我已经用一种非常有效的方式解决了这个问题,但我想知道是否有更好的方法。
基本上,我正在运行 Java Web 服务(在 AWS Elastic Beanstalk 中,因此跨多个服务器)。该服务从其缓存返回结果,但如果缓存(SQL Server DB)中不存在请求的输入,则该服务必须调用外部供应商。这需要花钱,所以我想确保如果多台机器恰好在同一时间收到请求(即在第一台机器收到供应商响应并将其写入数据库之前),则不会在多台机器上重复此调用。
目前,我正在处理此问题,方法是在进行外部调用之前将“IsPending = 1”行写入数据库,然后将该行更新为“IsPending = 0”并在调用返回后填写接收到的数据。在任何机器发出外部调用之前,它都会检查数据库中是否有待处理的行。如果找到,它会在 Activity 线程上重复调用 .sleep(),在每次等待后再次检查数据库(当前为 30 毫秒)。如果等待时间过长,它只会自行调用(但到目前为止,这实际上还没有发生)。
因此,虽然这个解决方案大部分有效,但它显然相当复杂,并且不能解决 100% 的情况。正如我之前提到的,我在 AWS 工作,因此我可以使用他们的工具。我很想知道是否有更好的方法来处理这个问题。谢谢!
最佳答案
您可以在从供应商处查找值时所持有的事务上使用 Connection.TRANSACTION_SERIALIZABLE
的事务隔离级别。使用它会锁定数据库行并阻止该行的所有选择,直到您提交事务。数据库会处理所有等待你的事情,你可以将你的异常情况处理为锁等待超时SQLException。
关于java - 同步来自多台机器的外部Web请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30241113/