java - 同步来自多台机器的外部Web请求

标签 java sql-server web-services amazon-web-services

我正在运行的网络服务遇到了棘手的问题。我已经用一种非常有效的方式解决了这个问题,但我想知道是否有更好的方法。

基本上,我正在运行 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/

相关文章:

java - HQL Select 可以对另一个查询的结果集进行选择吗?

javascript - 在 SSRS 报告中包含外部 javascript 文件

mysql - 哪些 DBMS 允许对 select 子句中不存在的属性进行排序?

java - 如何正确生成JsonArray?

java - Azure - 尝试从 keyVault 获取 key 时,ApplicationTokenCredential 中出现 NoSuchMethodExist 错误

java - 比较器二 compare Methods with Reflection

java - 为什么 String.split 需要转义管道分隔符?

mysql - SQL:通过掩码从表中选择唯一的子字符串

java - 使用 AngularJS 调用 WS Rest Java

c# - WebService 不读取 web.config