3

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 つの異なるメカニズム/アイテムがあります。

  1. ServletContextListenerApp Engine インスタンス自体。GAE がインスタンスを起動したときにカスタム コードを実装して実行することで、そのライフサイクルを「フック」できます。と
  2. これThreadFactory/ThreadManagerもの(上記)
  3. サーブレット/リスナー

新しいリクエストが来るたびに、たとえば、FizzServlet#doGetリクエストが利用可能なスレッドに確実に送信されるようにコードを実装する方法を考えていると思います(利用可能なスレッドがある場合)。そうすれば、FizzServlet私が公開していた唯一のサーブレットである場合、前の要求の処理中に新しい (11 番目の) 着信要求がハングする前に、最大 10 回呼び出される可能性があります。

サーブレットとこのスレッド作成コードの間のグルー コードを探しています。前もって感謝します。

4

1 に答える 1

2

新しいリクエストが来るたびに、たとえば FizzServlet#doGet などのコードを実装する方法を考えていると思いますが、リクエストが利用可能なスレッドに送信されるようにする方法 (利用可能なスレッドがある場合)。そうすれば、FizzServlet が私が公開している唯一のサーブレットである場合、前の要求の処理中に新しい (11 番目の) 着信要求がハングする前に、最大 10 回呼び出される可能性があります。

それが、GAE サーブレット エンジンが行うことです。サーブレットを含むアプリをデプロイすると、リクエストが来ると、サーブレット エンジンがスレッドを使用してリクエストを処理し、サーブレットを呼び出します。あなたは何もする必要はありません。

GAE によって呼び出されるサーブレットdoGet()またはdoPost()メソッドが複数のタスクを並行して実行する必要がある場合 (たとえば、他の複数の Web サイトに接続するなど)、リンク先のページで説明されているように、自分でスレッドを開始します。

于 2013-02-03T19:58:45.380 に答える