3

以下を実装したいと思います。

  1. MongoDB データベースに移動する Grails の Web アプリケーション
  2. バックグラウンドでそのデータベースにデータを入力および更新する、長時間実行されるバッチ プロセス

どちらも同じ Grails サービスと同じ GORM ドメイン クラスを再利用したいと考えています (Grails の mongodb プラグインを使用)。

Web アプリケーションの場合、動的 GORM finder メソッドを含め、すべてが正常に機能するはずです。

しかし、バッチ処理を実装する方法がわかりません。

を。これらを Grails サービス メソッドとして実装すると、実行時間の長い性質が問題になります。それらをいくつかの非同期エグゼキューターにラップしても、すべてが不必要に複雑になります。なぜなら、それぞれを個別のJavaプロセスにして、簡単かつ個別に監視および停止できるようにしたいからです。

b. それらを src/groovy スクリプトとして実装し、コマンド ラインから起動しようとすると、Grails サービスを適切に挿入できず (ApplicationHolder メソッドが NPE をスローする)、または GORM ファインダー メソッドを機能させることができません。スタンドアローンの GORM ガイドはすべて Hibernate を念頭に置いており、全体として、追求する正しいルートではないようです。

c. 「バッチランチャー」Grails プラグインを検討しましたが、インストールに失敗し、少し放棄されたようです。

d. src/groovy からスクリプトを実行するための「run-script」Grails コマンドを検討しましたが、実際には開発では機能するようですが、本番環境では正しく動作しないようです。

このような問題を抱えているのは私だけではありません。一般的にはどのように解決されるのでしょうか?

Grails アプリケーションでコード ベースと DB を共有するスタンドアロン スクリプトを実行するにはどうすればよいでしょうか。

4

1 に答える 1

3

ジョブ処理をフロントエンド アプリケーションとは別の JVM で行う必要があるため、最も簡単な方法は、Grails の 2 つのインスタンスを実行することです。1 つは Web 要求を処理するフロントエンド用で、もう 1 つは処理用ですジョブ処理あり。

ありがたいことに、Grails のプラグインの豊富なエコシステムにより、この種の作業は非常に簡単になりますが、おそらく最も効率的ではありません。なぜなら、処理のためだけに Grails アプリケーション全体を実行するのは少しやり過ぎだからです。

私がよく行う方法は、アプリケーションを 1 つのアプリとして作成し、ジョブ処理を行うサービスを使用することです。これらのサービスは RabbitMQ プラグインに関連付けられているため、一般的な流れは、Web リクエスト (または Quartz スケジュール ジョブ) がジョブをワーク キューに入れ、次にワーカー サービスがそれらを処理するというものです。

これの利点は、1 つのアプリケーションであるため、すべてのドメイン オブジェクトなどに完全にアクセスでき、メッセージ キューの切断された性質を利用して、フロントエンドとバックエンドを別々にスケールアウトできることです。複数のアプリケーション。代わりに、同じアプリケーションを複数回インストールして、ジョブの処理専用のスレッド数や、ジョブ プロセッサが参照するキューの数を構成するだけです。

したがって、このセットアップでは、開発のために、通常、ジョブ処理スレッドの数を、私が行っている開発作業にとって意味のあるものに設定し、単純なgrails run-app.同様に使用する実行中のRabbitMQサーバー)。

次に、本番環境にデプロイするときに、アプリケーションの 2 つのインスタンスをデプロイします。1 つはフロントエンド作業用、もう 1 つはバックエンド作業用です。ジョブを処理するためのスレッドが 1 つまたは 0 になるようにフロントエンド インスタンスを構成し、バックエンド インスタンスにはさらに多くのスレッドを割り当てます。これにより、必要に応じていずれかの部分を更新したり、いずれかの部分をスケーリングする必要がある場合により多くのインスタンスを起動したりできます。

これを行う方法は他にもあると思いますが、開発が非常に簡単で (すべて 1 つのアプリケーションであるため)、展開、スケーリング、および保守も非常に簡単であることがわかりました。

于 2012-08-02T13:59:38.827 に答える