0

私は通常、JBossサーバーアプリを2つまたは3つの「層」のコンポーネントでデプロイするのが好きです。

  • 「Web層」を構成し、JBossのWebコンテナにデプロイされたmy-ws.war、すべてのサーバーのWebサービスで構成されるファイル。と
  • サーバーのmy-esb.war「ESB」(サービスバス)で構成されるファイル。基本的には、Apache Camelで構築され、非同期リクエストの処理に使用されるESBです。
  • 1+EJBは、すべてのサーバーのビジネスロジックで構成され、「ビジネス層」を構成し、JBossのアプリコンテナにデプロイされます。すべてのEJBは、同期要求の処理を担当します

したがって、Webサービス(my-ws.war)はバックエンドへの「ゲートウェイ」であり、要求の性質に基づいて、Webサービスはそれらを適切なEJBにルーティングすることを認識しています(同期要求の場合、応答する必要があります)。タイムリーに)、またはキューにルーティングされ、CamelベースのESBによって取得および処理されます(非同期要求の場合)。これはいつも私のために働いており、私はアーキテクチャが本当に好きです。

私は現在、最初のGAEバックエンドを設計しており、この同じアーキテクチャをGAEプラットフォームにマッピングする方法を理解しようと奮闘しています。

明らかに、すべてを単一のWARファイルとしてデプロイする必要があります(EARやEJBはもう必要ありません)。しかし、私がここで「取得」していないのは次のとおりです。

  1. Webサービスが要求が非同期であり、ESBに進む必要があると判断した場合、要求をタスクキューにエンキューできますが、Camelルートの最初のエンドポイントにタスクを取得して処理を開始するように指示する方法がわかりません(I CamelとActiveMQの間での作業に慣れています)
  2. ESBをバックエンドインスタンスにデプロイして、時間やスレッドの制約に制限されないようにする必要があると思います
  3. Webサービスが要求が同期的であり、迅速に応答する必要があると判断した場合は、GAEバージョンのEJBが必要です。ハンドラーをPOJOSにして、リクエストをそれらにルーティングするだけですか?私のWebサービスは可能な限りマルチスレッド化されるので(フロントエンドインスタンスの最大スレッド数は10スレッドだと思います)、そのようなハンドラーPOJOはスレッドセーフである必要があると思います。または、GAEでEJB /モジュラー化されたビジネスロジックをシミュレートするためのより良い方法はありますか?

また、私の通常のアーキテクチャをGAEにマッピングしようとして本質的に問題があると思われる場合は、声を上げて、何/理由を教えてください。前もって感謝します!

4

2 に答える 2

0

説明するアーキテクチャは単純です。アプリケーションに対して暗黙の複雑さが保証されるかどうかは、決定できるものです。

私はCamelの詳細に精通していないので、その上に概念をマッピングしてみる必要があります。しかし、これは本当に大したことではないはずです。このレベルでは、ESBはESBです。ESBはESBです。

#1には、2つのオプションがあります。GAEにはキューがpushあります。キューはユーザーが設定し、GAEが管理し、GAE環境内でのみ使用できます。キューはユーザーが設定および管理しますが、GAEと外部アプリケーションの両方を駆動できます。pullPushPull

アプリケーションにとってのpushキューは、通常のWebリクエストにすぎません。詳細は、GAEが実際のリクエストを行うクライアントであるということです。キューに送信先のURLとそのペイロードを投稿すると、GAEはURLへのリクエストをキャプチャ、ルーティング、スロットルします。Camelにリクエストを挿入するために、サーブレットまたは任意のJavaクラスからCamelパイプラインをポンプできる場合は、ここでそれを行うことができます。Camelにはたくさんのコネクタやリスナーなどがあることは知っていますが、この場合は、単純なコードベースのインジェクションポイントが必要です。キャメルがこれを行うことができることは間違いありません、私はただ詳細を言うことができません。

pullキューはまったく異なります。ここでは、(GAEリースメカニズムを使用して)キューからタスクをプルして処理するフリーランニングスレッドが必要になります。一部のCamelインフラストラクチャを活用して、pullキューに準拠したスレッドエンドポイントを作成し、Camelにキット全体を管理させることができる場合があります。ただし、最終的には、スレッドをスプールし、実行する数を管理し、監視し、シャットダウンする必要があります。したがって、pushキューとは対照的に、ここで実際に行う作業は少し多くなります。PushGAE内にすべてを含めることが合理的な要件である場合、内部インフラストラクチャの観点からキューはより簡単です。pull外部統合が必要な場合は、HTTPリクエストを介して外部ソースからキューをプルできます。

したがって、CamelにはGAEpullキューを管理するためのすぐに使用できる機能がない場合がありますが、これを処理するために既存のコンポーネントを適応させるのは非常に簡単です。そうすれば、Camelにすべてを管理させることができます。このレベルのCamelにすでに慣れている場合は、これを使用する方が簡単な場合があります。

#2の場合、GAEバックエンドの2つの主な利点は、安定性と寿命です。通常のインスタンスは、負荷分散に適した汎用Webアプリとして存在します。GAEは、トラフィックと応答パターンに基づいてこれらのインスタンスを動的に作成および破棄します。ただし、特定の時点でアプリのインスタンスが実際に実行されていない可能性は十分にあり、GAEは最初のリクエストを確認したときにそれらをスピンアップします。したがって、内部(つまり、DBに永続化されていない)管理状態では、実際の寿命が保証されません。

バックエンドは、ユーザーが制御できるインスタンスです。それらは他のクラウドプロバイダーのインスタンスによく似ています。あなたはそれを起動し、あなたはそれをサイズ設定し、あなたはそれらにトラフィックをルーティングし、あなたはそれらをシャットダウンします。そのため、稼働時間とシステム容量のより良いアサーションが得られます。

リクエストがCPU時間やリソースに関して特に要求が厳しくない場合は、特にpushキューの場合、バックエンドインスタンスは必要ないかもしれません。基本的に、Webブラウザーから要求を受け取り、GAEタスクシステムに情報を渡すことを想像してください。GAEが行うのは、他のリクエストと同じように、すぐにコールバックすることだけです。アプリにとっては、通常のWebトラフィックと同じように見えますが、GAEからのものであることを「認識」していません。

したがって、1000個のリクエストを一度にキューに入れると、GAEは、バケットレートとメッセージレートを満たすために必要な数のアプリのインスタンスを起動します。これらの1000の要求が完了すると、GAEはすべてのクワイエットインスタンスをシャットダウンします。あなたが突然あなたのアプリケーションに1000人の訪問者を迎えた場合と同じように、彼らは突然去ります。

キューの場合pull、トラフィックを待機しているキューにある長時間実行スレッドを処理できるのは実際には唯一の種類であるため、長時間実行インスタンスが必要になります。しかし、それはあなたが常に、トラフィックを実行しているかどうかを意味します。

#3の場合、これはほとんど簡単です。

最も基本的な形式では、EJB(ほとんどの場合ステートレスセッションBeanを意味すると思います)は、基本的に、トランザクションコンテキストにラップされた定義済みのライフサイクルを持つPOJOです。独自の「ミニ」コンテナを作成できるため、SSBをかなり簡単に複製できます。

YourTrnCtx ctx = startNewTransaction();
registerContextToThread(ctx);
YourBean b = new YourBean();
injectResources(b);
b.start();
b.service();
b.end();
commitTransaction(ctx);

10,000フィートで、それがその要点です。幸い、実際にこれを自分で書く必要はありません。SpringとGuiceはどちらも、特にリソースや他のBeanの注入など、この多くを処理できます。EJBライフサイクル、インターセプター、またはトランザクションメカニズムを多用しない場合(またはまったく使用しない場合)、これにより作業も簡素化されます。

結局、SSBに静的な値がないと仮定すると、リクエストごとに新しいインスタンスを作成するだけなので、スレッドの安全性についてそれほど心配する必要はありません。サーブレットとは対照的に、問題を大幅に単純化します。

また、Webリクエストの周りにこれらのライフサイクルパターンなどの多くを提供するStripesやStruts2のようなまともなアクションフレームワークを見ることができます。物事を簡素化することができます。

とはいえ、私は「戦闘で使い古された」GAEのベテランではなく、GAEアプリは非常に小さく、これらのテクノロジーを使用したことはありません。それはすべて「本の学習」です。

于 2012-09-26T04:36:23.363 に答える
0

さて、私は簡潔で、理解しやすく、あなたの質問と同じ順序で答えを出すように努めます。

  1. タスクキューはURL、タスクがキューから取り出されたときにGaeが呼び出すものです。したがって、必要URLに応じてバックエンドまたはフロントエンドのいずれかを呼び出すようにこれを構成する必要があります。しかし重要です!タスクキューを使用せずにバックエンドを直接呼び出すことができ ます。
    • プッシュキューでは、タスクをプッシュし、Gaeが可能な限り高速に実行します。
    • プルキューでは、タスクを実行する時間を設定する必要があります。
  2. 前に述べたように、バックエンドまたはフロントエンドを呼び出す場合は、実行するタスクによって異なりますが、フロントエンド呼び出しの実際の制限は60秒であり、多くのタスクにとっては非常に長い時間です。
  3. EJBはGaeでサポートされていないため、コンポーネントベースのフレームワーク(EJBなど)に精通している場合は、別のフレームワークを探す必要があります。ここにいくつかのオプションがありますが、さらに多くのオプションがあります。

同期リクエストに対して何をするにしても、リクエストコンテキスト内ですべてのタスクを実行する必要があります。そうしないと、クライアントとの接続が失われます。

于 2012-09-27T10:31:06.273 に答える