2017-10-11 10 views
1

Google Cloud Platformの新機能です。私はAppEngine標準環境を使用しています。私はを作成する必要がありますスレッド Javaで、私はそれは不可能だと思いますか?ここでAppEngine標準環境でjavaでスレッドを作成する

は状況です:

私はは、ユーザーのためのフィード作成する必要があります。

名前がd1, d2, d3の3つのデータベースがあります。

ユーザがフィードのリクエストを送信するたびに、Javaは3つのスレッドを作成します(各データベースに1つずつ)。たとえば、d1の場合はt1、d2の場合はt2、d3の場合はt3です。これらのスレッドは、パフォーマンスを向上させるために非同期で実行する必要があり、その後、これらの3つのスレッドからのデータが結合され、応答としてユーザーに返されます。

私はこのためのコードを書く方法を知っていますが、あなたが知っているように、私はこの作業のためにスレッドが必要です。 AppEngine標準のEnv。私は何ができるのですか?他の方法はありますか? GCPのドキュメントで

は、彼らは言った:

は、スレッドを使用しないよう、私はタスクキューについて読んタスクキュー

を検討します。キューには、プッシュとプルの2種類があります。どちらも非同期に実行されますが、ユーザーに応答を返すことはありません。私は彼らがバックグラウンドでタスクを完了するように設計されていると思う。

どうすれば目標を達成できますか教えてください。私がこれを学ぶために必要なものは何ですか?

答えて

1

注:答えはドキュメントのみに基づいており、私はJavaユーザーではありません。

スレッドは標準環境でサポートされていますが、制限があります。 Threadsから:

注意:スレッドは驚きに満ちている強力な機能です。 Javaでスレッドを使用する方法について詳しくは、 Goetz、Java Concurrency in Practiceをお勧めします。

Javaアプリケーションは新しいスレッドを作成できますが、実行する方法にはいくつかの制限があります( )。これらのスレッドは、それらを作成する要求を「延期」できません。

アプリケーションが

  • java.lang.Runnableを実装することができます。
  • com.google.appengine.api.ThreadManager.currentRequestThreadFactory()を呼び出してスレッドファクトリを作成します。
  • Runnable渡し、ファクトリのnewRequestThreadメソッドを呼び出しnewRequestThread(runnable)、又はExecutorServicecom.google.appengine.api.ThreadManager.currentRequestThreadFactory()によって返さファクトリオブジェクト (例えば、 Executors.newCachedThreadPool(factory)を呼び出す)を使用します。

ただし、ThreadManagerの方法のいずれかを使用して、 スレッドを作成する必要があります。自分でnew Thread()を呼び出したり、 default thread factoryを使用することはできません。

アプリケーションは、 のように現在のスレッドに対して操作を実行できます。thread.interrupt()です。

各リクエストは、50個の同時リクエストスレッドに制限されています。 を1回のリクエストで50個以上のスレッドを作成しようとすると、Java 実行時にjava.lang.IllegalStateExceptionがスローされます。

スレッドを使用する場合、 ExecutorおよびRunnableなどのhigh level concurrency objectsを使用します。それらは微妙な多くのものを扱いますが、 並行性の重要な詳細はInterruptsscheduling and bookkeepingのようになります。アプリケーションで

/runFeed?db=d1 

をparametrableエンドポイントを作成することですそして、あなたの「メイン」アプリケーションコードから、あなたが戻りますURLFetchServiceからfetchAsync通話を行うことができます必要なものを実装するための

+0

Cloud SQLからデータを取得するときに、mutliThreadのパフォーマンスが向上することをもう1つ質問したいと思いますか?私はjavaでmutliThreadのパフォーマンスに関する多くの質問を読んだが、ここでは状況は変わっていると思う。私は他のマシンにあるクラウドSQLからデータを取得している。 –

+0

クラウドSQLは3つのデータベースへの3つの要求を並列に処理できるので、ユーザ要求*は、スレッド並列データベース操作でより速い応答時間を得るべきです。 –

0

エレガントな方法あなたはjava.util.concurrent.Future<HTTPResponse>

これにより、アプリケーションの動作をより正確に監視できます。 これにより、アプリケーションにネットワーク遅延が追加され、urlFetchServiceがフリーではないため、コストが増加します。

関連する問題