【问题标题】:Multi-Threading & Google App Engine Servlets多线程和 Google App Engine Servlet
【发布时间】:2013-02-03 19:28:51
【问题描述】:

在 Google App Engine (GAE) 上,前端实例可以创建多达 10 个线程以最大限度地提高吞吐量。根据this page,这样的多线程可以实现如下:

Runnable myTask = new Runnable({
    @Override
    public void run() {
        // Do whatever
    }
});

ThreadFactory threadFactory = ThreadManager.currentRequestThreadFactory();

// GAE caps frontend instances to 10 worker threads per instance.
threadFactory.newRequestThread(myTask);

为了访问我的 GAE 服务器端,我将公开许多映射到特定 URL 的 servlet,例如映射到 http://myapp.com/fizzFizzServlet

public class FizzServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request,
            HttpServletResponse response) throws IOException {
        // Handle the request here. Somehow send it to an available
        // worker thread.
    }
}

我想我对如何将这两个想法联系起来感到窒息。据我所知,这里有 3 种不同的机制/项目:

  1. App Engine 实例本身,我可以通过实现ServletContextListener 来“挂钩”其生命周期,并在 GAE 启动实例时运行自定义代码;和
  2. 这个ThreadFactory/ThreadManager东西(上)
  3. servlet/监听器

我想我想知道如何实现代码,以便每次收到新请求时,例如FizzServlet#doGet,如何确保将请求发送到可用线程(如果有可用线程)。这样,如果 FizzServlet 是我公开的唯一 servlet,它可能会被调用多达 10 次,然后才会导致新的(第 11 个)传入请求在前一个请求正在处理时挂起。

我正在寻找 servlet 和这个线程创建代码之间的粘合代码。提前致谢。

【问题讨论】:

  • 我不太明白有什么困惑。基本上,您从 ThreadManager 获得 ThreadFactory,然后使用 Runnable 启动一个新线程。你还需要知道什么?
  • @jtahlborn - 使用 Threads 以及 Factory 和 Manager 类,很难判断哪些 servlet 将为哪些线程提供服务。
  • 再一次,我并没有真正关注。 每个请求 可以生成的线程数量有限(并且这些线程必须在请求返回之前结束)。据我所知,servlet 与它无关(具体),而且 servlet 不提供线程...
  • 啊,是的,但是 servlet 线程有一个工厂,每个工厂都必须以某种方式(在后台)连接到 GAE 前端或后端实例。我认为这就是问题所在。
  • ...我的问题中的问题! (?!?!)

标签: java multithreading google-app-engine


【解决方案1】:

我想我想知道如何实现代码,以便每次有新请求进入时,例如 FizzServlet#doGet,如何确保将请求发送到可用线程(如果有可用线程)。这样,如果 FizzServlet 是我公开的唯一 servlet,它可能会被调用多达 10 次,然后才会导致新的(第 11 个)传入请求在前一个请求正在处理时挂起。

这就是 GAE servlet 引擎为您所做的。您部署一个包含 servlet 的应用程序,当请求进来时,servlet 引擎使用一个线程来处理请求并调用您的 servlet。你无事可做。

如果您的 servlet 的 doGet()doPost() 方法(由 GAE 调用)需要并行执行多个任务(例如联系其他几个网站),那么您将按照页面中的说明自行启动线程你链接到。

【讨论】:

  • 感谢@JB Nizet (+1) - 那么我是否可以一直指望拥有多达 10 个线程来让我的 servlet 生成,或者“GAE 线程”会占用这个数字吗?再次感谢。
  • 嗯,文档说每个请求只能有 50 个并发请求线程。所以理论上,如果你只有 50 个并发线程,并且所有线程在请求​​之前完成,你可以启动数百个线程。但API doc 也表示,如果线程创建时间过长,可能会引发运行时异常。我不知道比文档说的更多。
猜你喜欢
  • 1970-01-01
  • 2013-05-10
  • 2011-08-22
  • 1970-01-01
  • 2015-03-05
  • 2011-03-25
  • 2014-12-11
  • 1970-01-01
  • 2012-01-30
相关资源
最近更新 更多