同步来自多台计算机的外部Web请求

时间:2015-05-14 15:24:07

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

我运行的网络服务有一个棘手的问题。我已经用一种做得很好的黑客方式解决了这个问题,但是我想知道我能做些什么更好。

基本上我正在运行Java Web服务(在AWS Elastic Beanstalk中,因此跨多个服务器)。该服务从其缓存返回结果,但如果缓存(SQL Server数据库)中不存在请求的输入,则该服务必须调用外部供应商。这需要花钱,所以我想确保这个调用不会在多台机器上重复,如果它们碰巧在同一时间收到请求(即在第一台机器收到供应商响应并将其写入数据库之前) )。

目前,我通过写一个" IsPending = 1"来处理这个问题。在进行外部调用之前行到我的数据库,然后将行更新为" IsPending = 0"并在呼叫返回后填写接收的数据。在任何计算机发出外部调用之前,它会检查数据库是否有挂起的行。如果找到一个,它会在活动线程上重复调用.sleep(),在每次等待(当前为30ms)后再次检查DB。如果它过度等待,它只是为自己打电话(但到目前为止,这还没有真正发生)。

因此,虽然这个解决方案大部分都有效,但显然相当复杂,并且100%的情况都无法解决。正如我之前提到的,我在AWS工作,所以我可以使用他们的工具。我很想知道是否有更好的方法来解决这个问题。谢谢!

2 个答案:

答案 0 :(得分:1)

在查找供应商的值时,您可能会在事务中使用事务隔离级别Connection.TRANSACTION_SERIALIZABLE。使用它会锁定数据库行并阻止该行的所有选择,直到您提交事务为止。数据库将处理所有等待您,并且您可以将锁定等待超时SQLException处理您的异常情况。

答案 1 :(得分:0)

您可以在应用程序中设计一个业务流程层,用于处理与外部服务的所有交互。

  • 来自多台计算机的请求通过此层访问来自外部服务的信息。
  • 这些请求可以按顺序同步,以便在其他请求进入等待状态时只执行一个外部请求。

这种方法的另一个好处是,如果对外部服务格式进行任何更改,或者如果您决定将其完全替换为另一种,则可以单独更新。