【问题标题】:How to handle concurrency only for a particular request path in google app engine?如何仅针对谷歌应用引擎中的特定请求路径处理并发?
【发布时间】:2019-06-07 20:02:58
【问题描述】:

有没有办法通过动态路径参数仅针对特定请求路径串行处理请求? 考虑路径 - get/x 其中 x 可以是动态路径参数。谷歌应用引擎中是否有办法为特定路径参数的特定路径串行处理请求。如果get/alpha路径的两个请求一个接一个,这些请求可以串行处理吗?

【问题讨论】:

    标签: java google-app-engine concurrency


    【解决方案1】:

    不知道 GAE 如何处理调度/缩放和执行您的 Java 应用程序,您可以在多个级别强制互斥或可序列化。

    应用级分布式锁

    一种方法是在您的 HTTP 应用程序级别强制排除。这将允许您跨多个进程同步get/x

     @Override
      public void x(HttpServletRequest req, HttpServletResponse resp)
          throws ServletException, IOException {
    
        // acquire lock from a lock service, a couple different options
        // to implement this
        DistributedLock lock = DistributedLock.Acquire()
    
        // do work because lock guarantees mutual exclusion
    
    
        // finally release the lock
        lock.Release()
      }
    

    数据库级可序列化事务

    如果要同步的操作是数据库操作,您可以将其推送到数据层。如果您的数据库支持SERIALIZABLEtransactions,则可以确保没有两个并发操作同时修改相同的数据。

    进程级单实例

    您可能能够实现此目的的另一种方法是依靠 GAE 提供的保证。如果您将端点打包为一个单独的应用程序并将其部署为具有单个实例的自己的服务,谷歌可能(不确定他们可以为您提供什么保证:p)确保不超过一次服务的单个实例。这将是完全相同的代码库,但将是一个单独的配置/应用程序,仅暴露您的端点。这可能被视为“黑客”。

    这里的棘手部分是在自动缩放或部署期间,理想情况下有一种方法可以设置它,这样 2 个实例就不会同时启动。

    【讨论】:

    • 您好,我不能使用第三个选项,因为我的应用程序使用并行实例运行。我不能使用数据库级别的事务,因为它需要更改数据库结构。我可以得到一些关于 HTTP 级别分布式锁和提供它的库的信息/文档吗
    • 如果我在处理请求的方法上使用分布式锁,假设我收到两个请求 get/alpha 和 get/beta 。在这种情况下,我希望方法能够并行处理它们,因为它们具有不同的路径参数。这可能与分布式锁有关吗?
    猜你喜欢
    • 2011-05-06
    • 2023-03-30
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多