Cosmos DBで世界中から使用するチャットサービスを性能を考慮して作る

元記事:Connecting Global Azure Bootcampers with a cosmic chat app

2019年4月27日に世界同時に実施するGlobal Azure Bootcampが開催されました。
マイクロソフトは、そのイベント中に世界中のユーザーがコミュニケーションをとるための、世界規模のチャットサービスを新たに作成し提供しました。
そのチャットサービスを提供するのに使用されたのが、Azure Cosmos DBです。
この記事では、どのような構成で実現したのかを紹介します。

世界中の利用者が快適に利用できるようにするために、メッセージの取り込みと配信が素早く実施できるサービスを開発しました。

世界中にCosmos DBをレプリケーションさせ、ユーザーは、Azure Traffic Managerによって、一番近いエンドポイントにアクセスできるようにしました。

Azure Cosmos DB領域を表示する地図

メッセージの取り込み時間を最小にするために、Cosmos DBをマルチマスターモードで構成しました。
メッセージの配信の根幹部分には、Azure Cosmos DBのChnage Feedを使用しました。

チャットアプリがリアルタイムに新しいメッセージを表示できるようにするために、ポーリングではなくプッシュするようにしました。
Cosmos DBのChange Feedを受信して、Azure SignalRサービスが各クライアントにメッセージを配信するようにしました。

配信の地理的遅さを最小限にするために、各リージョンのローカルのChangeFeedを使用してメッセージを配信しました。

チャットボットの作成に使用されたAzureサービスとそれらがどのように対話するかを示す図

世界中に配信する部分は、Azure Cosmos DBが担ってくれるため、開発者は気にする必要がありません。
それでも次のことが実現できます。
・最も近いリージョンにメッセージを書き込みます。
・度のリージョンから書き込まれたメッセージであっても、ChangeFeedを通じてメッセージを受信できます。

これらを実現するのに必要だった開発日数は1日でした。

さらに、メッセージは誰でも書き込みができたので、Azure Globa Bootcampの雰囲気がネガティブなものにならないように、不適切なメッセージは取り除きました。
自動的に不適切なメッセージを取り除くために、Cognitive ServiceのContent Moderator APIによるコンテンツ検証を実施し、メッセージをチェックしました。
潜在的な冒涜や個人情報などをブロックし、前向きで安全な体験を提供しました。