【发布时间】:2019-06-07 20:02:58
【问题描述】:
有没有办法通过动态路径参数仅针对特定请求路径串行处理请求? 考虑路径 - get/x 其中 x 可以是动态路径参数。谷歌应用引擎中是否有办法为特定路径参数的特定路径串行处理请求。如果get/alpha路径的两个请求一个接一个,这些请求可以串行处理吗?
【问题讨论】:
标签: java google-app-engine concurrency
有没有办法通过动态路径参数仅针对特定请求路径串行处理请求? 考虑路径 - get/x 其中 x 可以是动态路径参数。谷歌应用引擎中是否有办法为特定路径参数的特定路径串行处理请求。如果get/alpha路径的两个请求一个接一个,这些请求可以串行处理吗?
【问题讨论】:
标签: java google-app-engine concurrency
不知道 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 个实例就不会同时启动。
【讨论】: