いくつかのJava RESTサービス(WARファイル)を個々のコンテナ化された「MicroServices」に分解し、サービスをオンデマンドでスケーリングできるようにしたい、アプリケーションの分離、疎結合、クラウド展開の促進 etc 、 etc (ESBで現在使用されている約100のサービス/同じJVMで実行中)
afewDocker チュートリアルを見てきたが、各コンテナが約150MBになるのではないかと心配している( JRE)-それ自体は大きくありませんが、数百/数千(またはそれ以上)のサービスインスタンスにスケールアウトする必要がある場合、多くの冗長ディスク領域が使用されることになります...
Javaサービスをコンテナに分解するためのより良い方法はありますか?
現在JavaSE8(compact1)を調査中- これははるかに口当たりの良い40MBです (OSを含む)
Dockerは、同じコンテナーのインスタンス間で冗長ディスクスペースを共有し、異なるコンテナーのインスタンス間でイメージの冗長レイヤーを共有します。たとえば、2つの異なるマイクロサービスがあり、どちらもDockerfileの先頭にあるFROM openjdk:8-jre-Alpine
で始まる場合、Dockerは同じホスト上のすべてのインスタンス間でJREディスク領域を共有します。
Dockerがそのように動作しなかった場合でも、これはマイクロサービスで頻繁に行う基本的なトレードオフです。多くのマイクロサービスアーキテクチャテクノロジーがこのように機能します。たとえば、CassandraのようなNoSQLデータベースは、多くの場合、データの数十のコピーを作成します。スケーラビリティを得るために安価なディスク領域を交換することを恐れるべきではありません。
あなたの「仕事に適したツール」の質問に関しては、多くの人々があなたと同じような状況でDockerを使用して成功していますが、多くの人々はあなたがリストした他のテクノロジーも使用しています。結局のところ、あなたは自分でその決断をしなければなりません。
あなたはその時点で100を実行しているsomethings(つまり、Docker、Elastic Beanstalkなど)を管理することは、それが価値があるよりも多くの苦痛であるかもしれない場所を分解しています。
ここで2つの異なる点を見てみましょう。まず、サービスをより小さな「サブサービス」にグループ化することを検討します。単一のサービスが単一のマシン/ドッカーイメージである必要があるとは考えないでください。例として、すべてのセキュリティサービスを1つのサービスにグループ化し、それを展開する最良の方法を決定する傾向があるかもしれません。
次に、サービスの配布にAWS LambdaとElastic Beanstalkを使用しました。 Elastic Beanstalkは、長時間実行/高CPUサービスに最適です。スケールアップとスケールダウンには多くの方法があります(CPU使用率、ネットワークI/O、SQSキューの長さなど)。 Lambdaもほぼ同じですが、もう少し制限された環境で実行しています。 Lambdaは非常にうまく機能しますが、私の意見では、適度なトラフィックまたはcronタイプのアクティビティのいずれかを最適に処理します。
警告として-頻繁に実行されるLambdaは、実行に時間がかかるため、Elastic Beanstalkマシンよりもすぐに高価になる可能性があります。
概して、マイクロサービスの利点は、コードの小さなセクションを簡単に更新できることと、コードのセクションを簡単にスケーリングできることです。しかし、マイナス面はあなたが今いるところです-どのサービス部門が理にかなっていますか? 100コンテナのビルド/テスト/デプロイ/モニタリングは、一部の組織が管理できる範囲を超える場合があります。しかし、それらをたとえば10から20のコンテナーに分割すると、はるかに管理しやすい問題が発生します。