私たちは Java EE でのミッション クリティカルなアプリケーションの開発を検討しています。私が本当に感銘を受けたことの 1 つは、プラットフォームにセッション分離がないことです。シナリオを説明しましょう。
私たちはネイティブ Windows アプリケーション (完全な ERP ソリューション) を持っており、まばらな貢献者から毎月約 2,000 の LoC と 50 のバグ修正を受け取ります。スクリプトもサポートしているため、顧客は独自のロジックを追加できますが、そのようなロジックが何をするかについてはわかりません. スレッド プールを使用する代わりに、各サーバー ノードにはブローカーとプロセス プールがあります。ブローカはクライアントのリクエストを受信し、プールされたインスタンスが解放されるまでそれをキューに入れ、そのインスタンスにリクエストを送信し、クライアントにレスポンスを配信して、インスタンスをプロセス プールに解放します。
非常に多くのまばらなコントリビューションとカスタム スクリプトにより、展開されたバージョンに無限ループ、長時間待機する悲観的ロック、メモリ破損、メモリ リークなどの深刻なバグが発生することは珍しくありません。メモリ制限、リクエストのタイムアウト、シンプルなウォッチドッグを実装しました。一部のプロセスが時間通りに正しく応答しない場合は常に、ブローカーは単純にそのプロセスを強制終了するため、ウォッチドッグは別のインスタンスを検出して開始します。プロセスがリクエストへの応答を開始する前にクラッシュした場合、ブローカーは同じリクエストを別のプールされたインスタンスに送信し、ユーザーはサーバー側での障害について知りません (管理者ログを除く)。一部のインスタンスは、リクエストを処理するときに偽のコードによってゆっくりと破棄されるため、これは便利です。
現在、Java EE への移行を検討していますが、Glassfish や JBoss などの仕様や一般的なアプリケーション サーバーで同様のものを見つけることができませんでした。はい、ほとんどのクラスター実装がセッション レプリケーションを使用して透過的なフェールオーバーを行うことは知っていますが、単純な 2 ノード クラスターでシステムを使用する小さな会社があります (また、1 ノード サーバーでシステムを使用する冒険家もいます)。 . スレッドプールを使用すると、バグのあるスレッドがノード全体をダウンさせる可能性があることを理解しています。これは、サーバーがスレッドを検出して安全に強制終了できないためです。ノード全体をダウンさせることは、単一のプロセスを強制終了することよりもはるかに最悪です。各ノードに約 100 のプールされたプロセス インスタンスがある展開があります。
私は、IBM と SAP がこの問題を認識していることを知っています。
- http://www.trl.ibm.com/people/kawatiya/pub/Kawachiya07vee.pdf、および
- http://java.sys-con.com/node/47362
、 それぞれ。しかし、最近の JSR、フォーラム、およびオープンソース ツールに基づくと、コミュニティでの活動はあまりありません。
それでは質問です!
同様のシナリオで Java EE を使用している場合、どのように解決しましたか?
この問題に対処できる、今後のオープンソース製品または Java EE 仕様の変更について知っていますか?
.NET にも同じ問題がありますか? 参考文献を説明または引用できますか?
この問題に対処でき、ERP ビジネス ロジックを実行する価値のある最新のオープン プラットフォームについて知っていますか?
お願いしますが、これ以上のテストや QA への投資については言わないでください。なぜなら、私たちはお客様に独自のスクリプトでこれを行うように強制することはできないからです. また、緊急のバグ修正が QA をバイパスしなければならない場合もあり、顧客にこれを受け入れるように強制しますが、バグのあるソフトウェア部分がさまざまな無関係な機能に影響を与える可能性があることを顧客に受け入れさせることはできません. これは、開発プロセスではなく、堅牢なアーキテクチャに関する問題です。
ご清聴ありがとうございました!