メリークリスマス!Azureアドベントカレンダーの儀を執り行う!

メリークリスマス!12月になりました。
今年もAdventCalendarの季節がやってきました。

アドベントカレンダー(Advent Calendar)とは、
クリスマスまでの期間(待降節アドベント)をより楽しく過ごすため、
12月1日から24日までの間カウントダウンしていくイベントカレンダーになります。
IT系では、1日1日カウントダウンとして、ブログの記事を書いたりなどで盛り上がる傾向が多いようです。

以下に詳しくまとまっているので、どうぞご覧ください。
クリスマスの新常識〜アドベントカレンダー
http://allabout.co.jp/gm/gc/220728/
師走を楽しもう。技術系アドベントカレンダーの魅力とは
http://www.atmarkit.co.jp/fjava/column/andoh/andoh59.html
今こそまとめ読み!技術系アドベントカレンダー総まとめ 2011【完結】
http://www.otchy.net/20120106/tacj2011-finished/

Japan Windows Azure User Group(JAZ)では今年で2年目の開催になります。

(去年の様子はこちら)
http://atnd.org/events/22821
今年も執筆してくれるメンバーを募集していますので、どしどしご参加ください!!(あと10人位、急げ師走!)
http://atnd.org/events/34353

さて、本日1日は@k1hashが担当させて頂きます。
2つのお知らせについて書かせて頂きたいと思います。

1つ、MixiXmasが今年もオープンします!
Mixiクリスマスは今年で4年目、日本最大級のWEBクリスマスイベントで、
去年は300万人のユーザーを集めたようです。
このモンスターサービス、Windows Azureで稼働して、大規模なアクセス負荷をさばきました。
300万人ユーザーの負荷に耐えるまで、去年の激闘はこちらにまとめられています。
http://blogs.itmedia.co.jp/isago/2011/12/mixi-xmaswindow-96c2.html

今年も既に正式オープンまでのβ期間が始まっています。
サービスはこちらから。
http://mixixmas.mplace.jp

いったいどういうサービスなのというのは、ヘルプの画像を掲載しますのでどうぞ。

今年もトレースルートなんかで見る限り、Azureで動いている(よう)ですね。
お持ちのPC、スマホガラケーからアクセスして頂くと、各種処理、通信の高速具合が良く確認できると思います。
スマホでも、友達のベルを鳴らした時、キャンドルタイムの効果は、これホントにスマホなの?というような美しい仕上がりになっています。

また、今年はMixiのアカウントでもFacebookのアカウントでも遊べるようです!
友達を誘うとレベルアップも早くなり、プレゼントも当たりやすくなると思います。
クリスマスまでのワクワクする雰囲気を楽しみたいですね。
ぜひこちらから、お試しくださいませ。
http://mixixmas.mplace.jp

さて2つ目のお知らせ、こちらが本題になるのですが、
各種事例、コミュニティメンバーの知識集積で培ったWindowsAzureの活用方法を
Azureクラウドデザインパターンとして皆さんとシェア
したいと思います。

現在、Azureクラウドデザインパターンは@k1hashと@kekekekentaで土台など考え中です。
作成したデザインパターンは今後 http://r.jazug.jp 上に専用ページを設けますのでこちらでシェアしていきますね。
目標はクリスマスまでに24のデザインパターンをアップです。

さて本稿ではデザインパターンのα版として、
MixiXmasでも使われていると思われる大規模WEBサービスに効果的なデザインパターンを上げていきます。

・サービスの複製(クラウドサービス)

大規模なサービスという事は、タイミングによってサーバーの複製による増強が可能であることが必要です。
クラウドサービスを使うと、サービスの複製が容易になり、ロール(役割)に応じたサーバーの種類別に
柔軟に台数をコントロールできるようになります。
フロントエンドのWEB系サーバー、非同期に行うバックエンド処理サーバー、メモリキャッシュ機能を持つサーバー
これらの台数を別々に柔軟に、かつ一括でコントロールできるのがクラウドサービスの大きな魅力です。
稼働後に露見するボトルネックに応じても、該当箇所を増強する事が容易にできます。


・WEBサーバーへのアクセス集中を防ぐ、静的コンテンツ退避

JS,CSS,IMAGE,その他ファイルなどをWEBサーバーから取得するようにすると、WEBサーバーに負荷が一極集中してしまいます。
これを防ぐために静的なファイルをBlobストレージに配置し、負荷を分散する事が出来ます。
地味ながらWEBサーバーのレスポンスを快適にする有効な一手です。
AzureのBlobストレージは5000RPSに耐える仕様になっているので一定量のアクセスが集中しても問題ないようになっています。


・静的コンテンツを大規模なコンテンツ配信網に配置

上述で静的コンテンツをストレージに退避しましたが、より高速に、より大規模なアクセスに対応したい場合は、
BlobストレージのコンテンツをCDNにキャッシュさせるのが有効な一手です。
CDNはエッジサーバーが全世界に配置されており、日本にもあります。
ユーザーはより大規模で身近な場所にある配信サーバーからコンテンツを取得する事が出来ます。


・大規模な書込みトランザクション対策

シンプルなモデルのデータを大規模なサービスで扱う場合は、RDBより高速なKVS(キーバリュー型のデータストア)の活用が有効です。
Azureの場合は、Tableストレージがこれにあたります。
ストレージアカウントあたり秒間5000リクエストが上限とされていますが、
複数のストレージアカウントを契約する事によってより高負荷なアクセスに耐える事が出来るようになります。


・利用頻度の高いデータをオンラインメモリキャッシュ化

外部APIから取得する友達のリスト、保持しているアイテムのリスト等、更新頻度が低く都度DBにアクセスすると
システム負荷が高まるようなデータは、サーバーのメモリ上にキャッシュするのが有効です。
Azureでは標準で複数台のWorkerRoleを一つの大きなキャッシュシステムとして利用する事が出来ます。
Memcachedのほうが使い慣れているという方は、Memcachedを組み込むこともできます。

・キューによる非同期処理

フロントのWEBサーバーで受け付けた処理が時間を要する場合は、非同期にしてしまってバックエンドで処理をするのが効果的です。
WEBサーバーへのリクエストがボトルネックになることもなく、ユーザーが処理の終了時間を待つ必要もありません。
MixiXmasの場合は、ベルを鳴らすことによって他人のデータ(場合によっては友達の数だけ)が書き換わる処理があるようですが、
こういったケースで同期処理を行うと待ち時間が発生し、WEBサーバーにリクエスト依頼がたまりシステムが破たんしかねません。
WEBサーバーはAzureキューに処理依頼を作るところまで、
バックエンドのWorkerが面倒なデータ更新やファイル生成を行うようにしておけば良いでしょう。

・動的なIP変更を使った本番リリース

複数のサーバーを使う場合、(MixiXmasの場合は数十台以上と思われますが)プログラムのリリースを手動で行うのは困難です。
Azureの場合は、本番環境を直接交信する事もできますが、本番環境と対になるステージングが標準で用意されており、
ステージングにUP後に、本番とDC内のVIPを交換する事によって、本番環境をリリースできます。
これはステージングで事前に評価をしてから本番環境とクリック一つで交換できるので事故の少ないリリース方法です。

上記、デザインパターンに、注意点を加える事が出来れば、
皆さんでAzureクラウドデザインパターンを有効に使えるのでは?と考えています。
間もなくリリースしますのでお楽しみに!また、パターンの作成やブラッシュアップに皆さんの参加をお待ちしております!

1日目、長くなってしまいましたが、こんなところで!