Martin Fowler のBlue/Green Deploymentの記事を読んで、とても気に入りました。基本的には、「ブルー」ライブ環境と「グリーン」ライブ環境の 2 つのプロダクション クラス環境があるという概念です。「実際の」ライブ環境と見なされる環境は、常に 1 つだけです。したがって、これら 2 つの LIVE 環境の前に何らかのルーティング/スイッチ メカニズム (おそらく中間 Web アプリまたは変更されたソフトウェア ロード バランサー) を配置し、ユーザーがどの環境にルーティングされるかを決定します (ここでは Web アプリについて説明します)。
したがって、すべてのユーザーが、たとえば の Green LIVE 環境にルーティングされますhttp://green.example.com/myapp
。次に、いくつかの新しい本番環境の変更をプッシュする準備ができたら、それらを Green LIVE にデプロイする代わりに Blue LIVE にデプロイし、少数 (~10%) のユーザーを Blue LIVE にルーティングし始めます。一般的な戦略は、ルーターに IP アドレスまたは Cookie を使用させて、ユーザーを Blue と Green のどちらにルーティングするかを決定することです。
プロダクションの変更 (Blue LIVE に適用) にバグ バグ/問題がないことを確信したら、ルーターを再構成して、すべてのトラフィックを で Blue LIVE にリダイレクトしhttp://blue.example.com/myapp
ます。
さて、私の質問に:
私は GWT アプリを設計しており、この青/緑の切り替えパターンを実装したいと考えています。問題は、GWT アプリがクライアント側であり、Spring、Struts、JSP、サーブレット アプリが利用する通常のサーバー側 Web アプリ アーキテクチャに従っていないことです。
だから私は尋ねます:どうすれば2つのTomcatインスタンス(Blue TomcatとGreen Tomcat)を持ち、同じGWTアプリの2つの異なるバージョンを青/緑の「ルーター」の後ろからユーザーに提供できますか? 「ルーター」とは、おそらくhttp://router.example.com/myapp-router
.
視覚的には、ここに問題があります。
green.example.com:8080/opt/tomcat/webapps/myapp.war/ --> Green Tomcat
myModule/
mymodule.nocache.js
mymodule.cache.html } typical GWT app WAR structure...
hosts/ this is currently the "real" LIVE
index.html environment where 90% traffic is routed to
css/
main.css
WEB-INF/
web.xml
lib/
classes/
blue.example.com:8080/opt/tomcat/webapps/myapp.war/ --> Blue Tomcat
myModule/
mymodule.nocache.js
mymodule.cache.html } typical GWT app WAR structure...
hosts/ new production changes have been deployed here
index.html and 10% of users are routed here
css/
main.css
WEB-INF/
web.xml
lib/
classes/
router.example.com:8080/opt/tomcat/webapps/myapp-router.war/ --> Router
WEB-INF/
web.xml
lib/ } simple headless WAR that inspects HTTP Requests and
classes/ determines which environment to redirect user to
これが基本的なアーキテクチャです。問題は、クライアントが にリクエストを送信しrouter.example.com/myapp-router
、ルーターがそのリクエストをblue.example.com/myapp
またはに転送することgreen.example.com/myapp
です。GWT (ここではRequestFactoryを使用しています) が、GWT アプリがクライアントにダウンロードされた後、blue
またはいずれかと通信することを最終的に認識するとは確信していません。green
だから私は尋ねます:これは可能ですか?特別な構成/コード/ライブラリ/テクニックなどはありますか?これを機能させるために利用する必要がありますか? 私が考えていない警告や落とし穴はありますか?前もって感謝します!