イベント駆動型アーキテクチャをよりシンプルに、よりスケーラブルに。
最新のアプリケーションを構築しているなら、イベント駆動型アーキテクチャ(EDA)に手を出したことがあるだろう。これは分散システムにおけるアーキテクチャ・パターンで、コンポーネントが意図的に疎結合になり、特定のイベントやトリガーに反応するように設計されています。サーバーレスアーキテクチャと組み合わせることで、スケーラビリティ、柔軟性、応答性の新たな高みを実現できます。
低レイテンシー、低コスト、低労力でアプリケーション同士を接続する重要な構造であるサーバーレス・イベント・バスとして、Momento Topicsを構築しました。Topicsを使えば、午後には何百万人もの購読者を持つインタラクティブなメッセージング・アプリを作成できます。モバイル・アプリケーションを直接Momentに接続することも可能で、WebSocketの頭痛の種やWebサーバー群全般を回避できます。Momentoは、メッセージをMomento Cacheに長期保存することもできます。
バックエンドでトピックを消費するには、顧客がサーバーをセットアップする必要があり、サーバーは選択したトピックをリッスンする以外は何もしません。
Webhookの登場です!Momento webhookを使えば、トピックにメッセージが公開されるたびに呼び出されるHTTPエンドポイントを登録するだけでいいのです。これで、メッセージに反応する Lambda 関数を簡単に起動できます。
Momentoトピックのウェブフックが強力な理由
Momentoトピックでチャット・アプリケーションを開発し、突然人気が出たとします。Momentoが数百万人の同時ユーザーを処理できることはすでに説明しましたが、ユーザーが増えるにつれて、あなたは2つの問題に気づきます。第二に、安全で包括的な環境を維持するためには、コンテンツのモデレーションが不可欠です。EDA パターンは、Momento Topics と Webhooks を使用して、アプリケーションにこれらの機能を追加するためにどのように役立つでしょうか?
友達という名のチャットルームで2人のユーザーがチャットしている場合、通常、ユーザーは同じトピックを公開したり購読したりします。しかし、いくつかの簡単な変更で、モデレーションと翻訳を注入することができます。まず、チャットルームのpublish
とsubscribe
の部分を切り離すことから始めます。各ユーザーはfriends-publish
にpublish
し、friends-subscribe-english
にsubscribe
します。 しかし、どうやってこの2つのトピックを一緒にするのでしょうか?
まず、受信したメッセージをfriends-subscribe-english
にエコーするシンプルなLambda関数を作成します。そして、friends-publish
トピックにWebhookをアタッチして、この関数を呼び出します。これで、friends-publish
でメッセージが公開されるたびに、自動的にfriends-subscribe-english
にエコーされるようになります。突然、スペイン語で会話を読みたいユーザーが現れたらどうしますか?
スペイン語翻訳を有効にするのは簡単な3ステップだ:
1.前述のLambdaを修正し、Amazon Translateを使って受け取ったメッセージをスペイン語に翻訳する。
2.翻訳されたスペイン語のメッセージをfriends-subscribe-spanish
に公開する。
3.スペイン語の会話を読みたいユーザーを friends-subscribe-spanish
トピックに登録する。
EDAの威力はこの時点から発揮され始めます。日本語のチャンネルを作りたかったら、friends-subscribe-japanese
トピックに書き込めばいいのです。また、ユーザーが日本語やスペイン語でメッセージを発信していることに気づくかもしれないので、friends-subscribe-english
トピックに発信する前に、Amazon Translateを使って英語以外のものを検知し、英語に翻訳すればいいのです。
ユーザー数が増えるにつれて、コンテンツモデレーションの必要性に気づくかもしれません。結局のところ、人々はインターネット上であらゆることを言うのです。EDAを覚えているでしょうか?このLambda関数を有効にすれば、コンテンツのモデレーションを前もって行うことができます。しかし、考慮すべきニュアンスがいくつかあります。
まず、モデレートされていないトピックの可視性を制限する場合は、friends-publish
トピックへの公開権限を保持したまま、そのトピックを購読する権限を持たないユーザ用の認証情報を生成する必要があります。これには、Momento のきめ細かいアクセス制御と使い捨てトークンを使用します。 ユーザには、好きなトピックの購読権限も与えることができます。Momentoのアクセスコントロールは柔軟なので、アプリの翻訳サポートを有料機能にして、ユーザーが有料で購読した言語のみに購読許可を与えることもできます。ここで意図しているのは、翻訳に課金するべきか、しないべきかということではなく、単にEDAとMomentoが提供するビジネスモデルに適応する柔軟性を説明することです。
EDAは本当に強力だって言いましたっけ?一般的な言語横断モデレーションシステムは本当に難しい問題です。しかし、このアーキテクチャを使えば、言語固有のモデレーションを行うことができ、翻訳された各トピックをカスタム/言語固有のモデレーション関数に割り当てることができます。そして何より、Lambda関数を互いに連結し続けることで、複雑なワークフローをシンプルなビルディングブロックで構成することができるのです。
Momento Topicsとウェブフックの動作を見る
MomentoのMattとRishtiは、すでにこのパターンを示すホストされたVercelアプリケーションを構築しており、彼らはそのソフトウェアをオープンソース化しています(Lambda関数用のCDKも含めて)。私たちが最も驚いたのは、プロセスで複数のホップ(トピックへのパブリッシュ、Lambda関数の呼び出し、Amazon Translateの呼び出し、冒涜フィルタの実行)があるにもかかわらず、チャット体験がとんでもなく速いことです。サブスクライブしてパブリッシュしている言語に関係なく、即座に翻訳を得ることができるのです。デモはVercelがホストするブラウザアプリのものだが、ブラウザに限定する必要はありません。Momento Topicsは現在、ネイティブのiOS、Elixir、Unityなどをサポートしており、同じトピックセットでクライアント同士を接続することで、スケーラブルでモデレートされ、翻訳されたチャットをすべてのプラットフォームで利用できます。EDAは素晴らしいと思いませんか?
Momento ConsoleでMomento Topicsを使い始め、数分でWebhookを作成できます。