Google App Engine (GAE) では、フロントエンド インスタンスが最大 10 個のスレッドを作成して、スループットを最大化することができます。このページによると、このようなマルチスレッドは次のように実現できます。
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 にマップされた多くのサーブレットを公開しFizzServlet
ますhttp://myapp.com/fizz
。
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.
}
}
この 2 つのアイデアをどのように結び付けるかについて、私は窒息していると思います。私が見る限り、ここには 3 つの異なるメカニズム/アイテムがあります。
ServletContextListener
App Engine インスタンス自体。GAE がインスタンスを起動したときにカスタム コードを実装して実行することで、そのライフサイクルを「フック」できます。と- これ
ThreadFactory
/ThreadManager
もの(上記) - サーブレット/リスナー
新しいリクエストが来るたびに、たとえば、FizzServlet#doGet
リクエストが利用可能なスレッドに確実に送信されるようにコードを実装する方法を考えていると思います(利用可能なスレッドがある場合)。そうすれば、FizzServlet
私が公開していた唯一のサーブレットである場合、前の要求の処理中に新しい (11 番目の) 着信要求がハングする前に、最大 10 回呼び出される可能性があります。
サーブレットとこのスレッド作成コードの間のグルー コードを探しています。前もって感謝します。