メッセージストリームで情報をスマートに取得!
私たちの日常生活において、様々なデジタルプラットフォームで情報がやり取りされており、いまやこのような情報のやりとりなしでは生活が成り立たないほどに情報化が進みました。しかし、大量の情報が飛び交う中で、本当に必要な情報だけを効率的に手に入れるのは難しいと感じたことはないでしょうか?
今回紹介する「メッセージストリーム最適化」の技術は、この問題に答える一つの解決策です。このシステムは、ユーザーが事前に設定したキーワードやクエリを元に、リアルタイムで流れてくるメッセージから必要な情報だけを取り出して提供します。例えば、特定のプロジェクトやキーワードに関連するメッセージだけを見たいとき、その条件を設定するだけで、関連するメッセージだけがユーザーの手元に届きます。具体的にどのような技術なのか、詳説していきます。
発明の背景
ソーシャルメディアメッセージングプラットフォームは、ユーザー間で数百万または数億のソーシャルメディアメッセージの交換を促進することができます。プラットフォームで交換されるメッセージは、しばしばプラットフォームのユーザーに最新の更新や現在の出来事に関する報告を提供できます。一部の例では、ユーザーがプラットフォーム上で検索を実行し、1つまたは複数のキーワードと一致するメッセージを時間経過で表示できるような結果のストリームを受け取ることができます。
しかし、非常に大きなメッセージストリームを一定の期間にわたってマッチングし、それらのメッセージをユーザーにリアルタイムでレンダリングすることは、処理速度、コンピュータリソースの割り当て、およびセキュリティの問題など、複雑で技術的な課題を伴うことが問題点でした。
どんな発明?
発明の目的
本発明は、上記課題に鑑み、メッセージングプラットフォームで交換される大量のメッセージストリームからのコンテンツと一致するクエリサブスクリプションに基づいて、クライアントアプリケーションにリアルタイムメッセージを時間経過でストリームすることを目的としています。
この方法は、メッセージの配信速度を向上させ、アクティブなクエリサブスクリプションの数の変動を処理するためのコンピュータリソースの管理を効果的に制御し、著者の視点から生成されたメッセージに対してクエリサブスクリプションを一致させるセキュリティを向上させるものです。そして、それらのメッセージを、クエリサブスクリプションを開始したユーザーの視点からリアルタイムで配信します。
※クエリサブスクリプションは、特にウェブアプリケーションやモバイルアプリケーションの開発で用いられる技術で、リアルタイムのデータの変更を読み込み、それをクライアントに即座に通知する仕組みを指します。具体的な例として、GraphQLのサブスクリプションを挙げることができます。GraphQLは、APIクエリ言語およびランタイムとして機能し、クライアントが必要とするデータを正確にリクエストできるように設計されています。GraphQLのサブスクリプションは、サーバー側のデータの変更をクライアントにリアルタイムでプッシュする機能を提供します)
ユーザーは、ユーザーインターフェースをリフレッシュしたり、ユーザーインターフェースで新しいメッセージを表示するための別のリクエストを送信したりする必要はありませんが、クエリサブスクリプションと一致するメッセージをメッセージングプラットフォームに投稿する他のユーザーへの応答として、メッセージがユーザーのユーザーインターフェースにプッシュされます。
例えば、ユーザーは「犬」という検索語を入力してアクティブなクエリを生成し、その後「犬」という検索語を含むメッセージのストリームを受け取り、新しいメッセージがメッセージングプラットフォームに作成および投稿されるたびに「犬」という検索語を含むメッセージを受け取り続けることができます(アクティブなクエリが期限切れになるまで)。静的なクエリでは、静的なクエリ(例えば、検索リクエストに対するウェブ結果のリストを受け取るなど)を提出した時点で一度結果が提供されますが、ユーザーはアクティブなクエリの提出後(およびアクティブなクエリが期限切れになるまで)一致するコンテンツを表示し続けることができます。
イベントプロデューサーシステムには、イベントプロデューサーマネージャと複数のイベントプロデューサーが含まれ、それらは同時にクエリサブスクリプションを実行して一致するコンテンツを識別するように設定されています。イベントプロデューサーマネージャはサブスクリプションエグゼキュータからクエリサブスクリプションを受け取り、クエリサブスクリプションが指定されたイベントプロデューサーで保存されるようにクエリサブスクリプションを1つ以上のイベントプロデューサーに割り当てます。
例えば、イベントプロデューサーマネージャは、イベントプロデューサーからの期限切れ(または不良)のクエリサブスクリプションを削除し、新しいクエリサブスクリプションがイベントプロデューサーマネージャで受け取られるときに新しいクエリサブスクリプションを割り当てることができます。指定されたイベントプロデューサーは、メッセージキューからのメッセージがクエリサブスクリプションと一致することを応答して応答イベントを生成します。応答イベントは、クエリサブスクリプションと一致するコンテンツを持つメッセージを識別することができます。
サブスクリプションエクゼキュータは、レスポンスイベントを受け取り、クエリサブスクリプションを開始したユーザーの視点からのデータを持つレスポンスイベントによって特定されたメッセージを生成し、メッセージをトランスポートエンジンに提供して、配信チャンネルを通じて配信します。例えば、メッセージキュー内のメッセージは、その著者の視点から生成されています。
しかし、クライアントアプリケーションに配信されるメッセージは、リクエストを開始したユーザーの視点からのデータを持つ必要があります。サブスクリプションエクゼキュータは、イベントプロデューサーシステムによって一致した後、トランスポートエンジンによる配信の前に、メッセージ(例:メッセージのハイドレートおよび可視性ルールの適用)を生成することができます。このようにして、一致したメッセージの著者が、クエリサブスクリプションを開始したユーザーを制限している場合(例:ブロックまたはミュート)、サブスクリプションエクゼキュータはそのメッセージを破棄することができ、メッセージングプラットフォームのセキュリティを高めることができます。
ここで、レスポンスイベントがサブスクリプションのためにユーザーがリクエストしたデータのみを含む場合、イベントバスに公開されるデータの量が減少し、クライアントに送信される余分なデータがなくなり、秒あたりのイベントをより多くストリームするための帯域を節約するのに役立つ可能性があります。
イベントプロデューサーは、複数のイベントプロデューサーグループにグループ分けされ、各イベントプロデューサーグループが完全なメッセージストリームを受け取ります。各プロデューサーグループは、複数のイベントプロデューサーを含み、各イベントプロデューサーは、完全なメッセージストリームの別々の部分を受け取ります。各イベントプロデューサーグループには、クエリサブスクリプションの別々の部分が割り当てられます。イベントプロデューサーマネージャーは、サブスクリプションクエリをイベントプロデューサーグループに割り当てることができ、グループ内の各イベントプロデューサーがクエリサブスクリプションを保存および実行します。
いくつかの例では、イベントプロデューサーマネージャーは、サブスクリプションを最初のイベントプロデューサーグループと2つ目のイベントプロデューサーグループに割り当てることができるため、イベントプロデューサーグループのいずれかでクエリサブスクリプションの処理にエラーが発生した場合でも、クエリサブスクリプションを維持することができます。
このようにして、システムは、クエリサブスクリプションとレスポンスイベントの変動量を考慮して、イベントプロデューサーグループの数を増減させたり、各グループのイベントプロデューサーの数を増減させたりすることで、イベントプロデューサーシステムでのレスポンスの量を簡単に制御することができます。
例えば、単一のイベントプロデューサーグループ内のイベントプロデューサーの数が増加した場合、各個別のイベントプロデューサーは、メッセージストリームから処理するためのメッセージを少なく受け取ることができ、結果として追加の検索を処理するための計算能力が増える可能性があります。イベントプロデューサーグループの数が増えることを受けて、イベントプロデューサーに割り当てられる検索用語の数を減少させてもよいでしょう。
いくつかの例では、イベントプロデューサーシステムは、イベントプロデューサーからのレスポンスイベントを受け取り、ストリーミングレートがストリーミングレートのしきい値以下となるように、レスポンスイベントによって特定されたメッセージがクライアントアプリケーションにストリームされるように、1つ以上のレスポンスイベントを破棄するコレクターサービスを含みます。
例えば、メッセージが高速でストリームされる場合、ユーザーはストリームされたメッセージを消費することができないかもしれません。そのため、コレクターサービスは、メッセージがストリームされるレートがしきい値以下となるように、ストリーミングレートをスロットリングすることができます。
例えば、ストリーミングレートのしきい値が1秒あたり10メッセージである場合、コレクターサービスは、1秒の時間間隔内で10以上のレスポンスイベントを破棄することができます。例えば、コレクターサービスは、レスポンスイベントが生成された時点以外の他の属性に基づいてメッセージを破棄することができます。さらに、コレクターサービスは、しきい値未満のストリーミングレートでメッセージを提供するために、低品質または攻撃的と予測されるメッセージを破棄することができます。
発明の詳細
では、図面を交えて、本発明の詳細について説明をしていきます。
図1は、メッセージングプラットフォームで交換されるメッセージを持つメッセージストリームのコンテンツに一致するクエリサブスクリプションに基づいて、クライアントアプリケーションにリアルタイムメッセージを時間経過でストリーミングするシステムの概要図です。
これは、1つ以上のサーバーコンピューター102で実行可能なメッセージングプラットフォーム104と、計算デバイス124によって実行可能なクライアントアプリケーション126を含むシステム100を示したものです。
メッセージングプラットフォーム104は、メッセージ配信の速度を向上させる、アクティブなクエリサブスクリプション141の数の変動を処理するためのコンピュータリソースの管理を効果的に制御する、および/または、クエリサブスクリプション141の一致およびこれらのメッセージ132をリアルタイムで配信するセキュリティを高める方法で、メッセージストリーム114のコンテンツと一致するクエリサブスクリプション141に従って、リアルタイムメッセージ132をクライアントアプリケーション126に時系列でストリームするように構成されています。
メッセージングプラットフォーム104は、リアルタイム通信を促進するためのプラットフォームであり、クライアントアプリケーション126はネットワーク150を介してメッセージングプラットフォーム104と通信するように構成されています。メッセージ132は、新しいメッセージの作成や投稿などのメッセージ作成イベントを指すことができます。
メッセージングプラットフォーム104には、サブスクリプションエグゼキュータ116、イベントプロデューサーシステム106、およびトランスポートエンジン122が含まれています。これらの各モジュールは、メッセージの一致、生成、配信のためのさまざまな機能を提供します。例えば、メッセージ132は、タイムライン130の1つ以上にストリームされることができます。クライアントアプリケーション126を使用して、検索用語「犬」を含むメッセージ132を取得するアクティブなクエリを提出することができます。そして、クライアントアプリケーション126は、検索用語「犬」を含むメッセージ132をタイムライン130にストリームします。
この方法で、クエリサブスクリプション141の管理は、2つの別々のモジュール、すなわち、サブスクリプションエグゼキュータ116とトランスポートエンジン122を使用して、メッセージ132の配信から分離されています。イベントプロデューサーシステム106は、メッセージキュー112のメッセージストリーム114に対するクエリの一致により、ストリーム検索クエリ結果をサポートするように構成されています。
図2は、クエリサブスクリプション生成の操作をさらに詳しく示すシステム100を示しています。図1および図2を参照すると、クライアントアプリケーション126は、クエリサブスクリプションリクエスト140を生成し、そのリクエストをネットワーク経由でサブスクリプションエクスキュータ116のデータクエリAPI118に送信します。
ユーザーはクライアントアプリケーション126のユーザーインターフェース128を使用してアクティブなクエリを送信し、アクティブなクエリの送信に応じて、クライアントアプリケーション126はクエリサブスクリプションリクエスト140を生成して送信します。クエリサブスクリプションリクエスト140は、新しいクエリサブスクリプション141の開始と、イベントプロデューサーシステム106でのクエリサブスクリプション141の実装の開始を設定するためのものです。クエリサブスクリプションリクエスト140は、HTTP上のGraphQLサブスクリプションクエリです。
クエリサブスクリプションリクエスト140には、サブスクリプションデータ142が含まれています。サブスクリプションデータ142には、1つまたは複数のクエリ用語144とユーザーのユーザー識別子146が含まれています。クエリ用語144には、ユーザーによって提供された検索用語が含まれています。サブスクリプションデータ142には、変数や1つ以上の操作名が含まれています。
サブスクリプションデータ142には、クライアントアプリケーション識別子と認証されたユーザー識別子が含まれています。クエリサブスクリプションリクエスト140には、クエリサブスクリプション141がアクティブである時間値を示す有効期限時間148が含まれています。時間が有効期限時間148を超えると、クエリサブスクリプション141はタイムアウトと見なされます(再度リクエストが受信されない限り)。クライアントアプリケーション126は、有効期限時間148の値を決定し、それはクライアントアプリケーション126によって送信された時間および/または再更新サブスクリプションの数に依存します。
クエリサブスクリプションリクエスト140の受け取りに応じて、サブスクリプションエクスキュータ116は、サブスクリプションデータ142のクエリ用語144に基づいてトランスポートトピック134を識別します。トランスポートトピック134は、トランスポートエンジン122で検出可能な記述的および/または数値的な識別子です。サブスクリプションエクスキュータ116は、トピックライブラリ135を使用してトランスポートトピック134を識別します。
これは、トランスポートトピックの複数を定義するものです。例として、サブスクリプションエクスキュータ116は、トピックライブラリ135の複数のトランスポートトピックのうち、クエリ用語144に対応するものを識別することができます。サブスクリプションエクスキュータ116がクエリ用語144を使用してトピックライブラリ135からトランスポートトピック134を識別できない場合、サブスクリプションエクスキュータ116は、クエリサブスクリプション141が失敗したことを示す応答を生成して送信することができます。
データクエリAPI118は、サブスクリプションデータ142を使用してトランスポートトピック134を識別します。データクエリエクスキュータ120は、サブスクリプションデータ142を使用してトランスポートトピック134を識別します。
クエリサブスクリプションリクエスト140の受け取りに応じて、サブスクリプションエクスキュータ116は、サブスクリプションデータ142に基づいてサブスクリプション識別子136を生成します。サブスクリプション識別子136は、クエリサブスクリプション141を識別する識別子です。データクエリAPI118がサブスクリプション識別子136を生成することがあります。データクエリエクスキュータ120がサブスクリプション識別子136を生成することがあります。
サブスクリプションエクスキュータ116は、ユーザー識別子146、クエリ用語144、および/またはサブスクリプションデータ142に含まれるその他の情報(変数、操作名、認証されたユーザー識別子、および/またはクライアントアプリケーション識別子など)に基づいてサブスクリプション識別子136を生成することがあります。サブスクリプションエクスキュータ116は、サブスクリプションデータ142をシリアライズしてハッシュ化し、サブスクリプション識別子136を生成するように設定されています。
データクエリAPI118は、ネットワーク150経由で、クライアントアプリケーション126にサブスクリプションステータス応答152を送信するように設定されています。サブスクリプションステータス応答152には、トランスポートトピック134が含まれています。サブスクリプションステータス応答152には、サブスクリプション識別子136が含まれています。サブスクリプションステータス応答152には、クエリサブスクリプションリクエスト140が成功したかどうかを示すステータスメッセージが含まれています。
サブスクリプションステータス応答152の受け取りに応じて、クライアントアプリケーション126は、ネットワーク150経由でトランスポートエンジン122にサブスクライブリクエスト154を生成して送信します。
サブスクライブリクエスト154には、トランスポートトピック134が含まれています。クライアントアプリケーション126は、サブスクリプションステータス応答152で識別されたトランスポートトピック134を使用してサブスクライブリクエスト154を行います。クライアントアプリケーション126は、サブスクリプションエクスキュータ116と同じ方法でサブスクリプションデータ142を使用してトランスポートトピック134を識別することがあります。
サブスクライブリクエスト154には、サブスクリプション識別子136が含まれています。サブスクライブリクエスト154には、ユーザー識別子146が含まれています。クライアントアプリケーション126は、サブスクリプションステータス応答152の受け取りに応じてサブスクライブリクエスト154を送信します。クライアントアプリケーション126は、クエリサブスクリプションリクエスト140の送信とほぼ同時にサブスクライブリクエスト154を送信します。
クライアントアプリケーション126は、クエリサブスクリプションリクエスト140を送信した後、クエリサブスクリプションリクエスト140の送信から500ms未満の期間でサブスクライブリクエスト154を送信します。クライアントアプリケーション126は、クエリサブスクリプションリクエスト140を送信した後、クエリサブスクリプションリクエスト140を送信した後の100-200msの期間でサブスクライブリクエスト154を送信します。
サブスクライブリクエスト154に応答して、トランスポートエンジン122は、メッセージ132をクライアントアプリケーション126にストリームするためのデリバリーチャンネル125を確立します。デリバリーチャンネル125は、トランスポートトピック134に関連付けられており、デリバリーチャンネル125を介して配信されるメッセージ132は、トランスポートトピック134に対応しています。
トランスポートエンジン122は、ユーザー識別子146およびクエリ用語144(および/またはコントリビュータ識別子)に対応するトランスポートトピック134にクライアントアプリケーション126をサブスクライブさせることがあります。
デリバリーチャンネル125は、クエリサブスクリプション141がアクティブである間、開いたままであり、アクティブです。トランスポートエンジン122は、デリバリーチャンネル125にチャンネル識別子を割り当てることがあります。トランスポートエンジン122は、ネットワーク150を介して、チャンネル識別子をクライアントアプリケーション126に送信することがあります。クライアントアプリケーション126は、定期的にデリバリーチャンネル125に再サブスクライブすることがあります(例:毎2分)。
クエリがアクティブである場合(例:ユーザーインターフェース128に可視の検索列が表示されている場合)、クライアントアプリケーション126は自動的に再サブスクライブリクエストを送信します。クエリが終了する場合(例:列がユーザーインターフェース128からスクロールオフされる場合)、クライアントアプリケーション126は、トランスポートトピック134のサブスクリプションを解除するメッセージをトランスポートエンジン122に送信することがあり、これによりデリバリーチャンネル125が閉じられます。
図3は、イベントプロデューサシステム106とサブスクリプションエグゼキュータ116の動作を示しており、イベントプロデューサシステム106でクエリサブスクリプション141を設定し、イベントプロデューサシステム106からのレスポンスイベント156を受け取る様子を示しています。図4は、サブスクリプションエグゼキュータ116とトランスポートエンジン122がデリバリーイベント160をトランスポートエンジン122に配信する動作を示しています。
クエリサブスクリプションリクエスト140を受け取った応答として、データクエリAPI118はクエリサブスクリプション141を生成し、イベントプロデューサマネージャ108に送信します。データクエリAPI118は、クエリサブスクリプション141をThriftリクエストとしてイベントプロデューサマネージャ108に送信することができます。Thriftリクエストは、メッセージングプラットフォーム104のさまざまなコンポーネント間で通信するために使用されるリモートプロシージャコールシステムです。クエリサブスクリプション141は、サブスクリプションデータ142(例:クエリ用語144を含むことができる)と、ユーザー識別子146を含んでいます。
クエリサブスクリプション141はサブスクリプション識別子136を含みます。また、クエリサブスクリプション141は有効期限148を含みます。さらに、クエリサブスクリプション141がイベントプロデューサマネージャ108に送信される際には、ユーザー識別子146と他のサブスクリプション関連データを含むことで、イベントプロデューサシステム106がレスポンスイベント156内でそれらを返すことができるようにします。イベントプロデューサマネージャ108は、有効期限148を使用してクエリサブスクリプション141がタイムアウトしたかどうかを判断します。例えば、時間が有効期限148を超えていた場合、イベントプロデューサマネージャ108はイベントプロデューサ110にクエリサブスクリプション141を削除するよう指示することができます。
イベントプロデューサマネージャ108は、クエリサブスクリプション141をイベントプロデューサ110(またはイベントプロデューサ110のグループ)に割り当てます。いくつかの例では、イベントプロデューサマネージャ108は、ユーザー識別子146に基づいてクエリサブスクリプション141を割り当てます。クエリサブスクリプション141は、イベントプロデューサ110(またはグループ内の各イベントプロデューサ110)に保存されます。イベントプロデューサ110は、メッセージストリーム114からのメッセージがクエリサブスクリプション141のクエリ用語144を含むと判断された応答としてレスポンスイベント156を生成します。イベントプロデューサ110は、レスポンスイベント156をレスポンスイベントバス123に公開することができます。
コレクターサービス170がレスポンスイベント156を受け取り、レスポンスイベント156をレスポンスイベントバス132に公開します。さらに、コレクターサービス170は、同じメッセージ132に関連するレスポンスイベント156を重複削除することや、ストリーミングレートが閾値を下回るように一つ以上のレスポンスイベント156を破棄すること、および/またはイベントプロデューサシステム106のクエリサブスクリプション141の健康状態に関する定期的なステータスメッセージを生成することができます。各レスポンスイベント156は、クエリサブスクリプション141に一致するメッセージ132を一意に識別するメッセージ識別子158を含んでいます。各レスポンスイベント156はサブスクリプションデータ142(例えば、クエリ用語144)とユーザー識別子146を含みます。
サブスクリプションエグゼキュータ116は、イベントプロデューサシステム106によって公開されたレスポンスイベント156を取得するためにレスポンスイベントバス123に登録します。一般に、サブスクリプションエグゼキュータ116は、メッセージ識別子158によって識別されたメッセージ132(例えば、ハイドレートする)を生成し、トランスポートエンジン122に完全なメッセージ132を提供する前に可視性のルールを適用します。
ハイドレーションとは、生成されたメッセージ132がクライアントアプリケーション126と互換性のあるフォーマットを持ち、ユーザー識別子146によって識別されるユーザーの視点に対応するデータを含むように、メッセージ識別子158とユーザー識別子146からメッセージ132を作成することを指します。サブスクリプションエグゼキュータ116は、メッセージ識別子158とユーザー識別子146に基づいてJavaScriptオブジェクト表記(JSON)メッセージ(例えば、完全なJSONメッセージ)を生成するように設定されています。
サブスクリプションエグゼキュータ116は、各レスポンスイベント156に対応するメッセージ132を生成する際、そのメッセージ132を含む配送イベント160を配送イベントバス121に公開します。
メッセージのハイドレーション中、サブスクリプションエグゼキュータ116は、メッセージ識別子158によって識別されるメッセージ132が可視性ルールに違反していると判断した場合、レスポンスイベント156を破棄することができます。例えば、レスポンスイベント156が、ユーザー識別子146によって識別されるユーザーを制限(例えば、ブロックまたはミュート)したユーザーによって作成されたメッセージ132を識別する場合、サブスクリプションエグゼキュータ116は、レスポンスイベント156を破棄することができます。
データクエリエグゼキュータ120は、レスポンスイベントバス123に登録します。データクエリエグゼキュータ120は、イベントプロデューサ110によってレスポンスイベントバス123に公開されるレスポンスイベント156を取得するためにレスポンスイベントバス123を監視することができます。データクエリエグゼキュータ120は、レスポンスイベントバス123から取得した各レスポンスイベント156に対応するメッセージ132を生成するためにデータクエリAPI118と通信することができます。
例として、レスポンスイベント156の場合、データクエリエグゼキュータ120は、メッセージ識別子158とサブスクリプションのメタデータ(例: サブスクリプションデータ142やサブスクリプション識別子136)をデータクエリAPI118に渡します。データクエリエグゼキュータ120は、メッセージ識別子158とサブスクリプションのメタデータを渡すために、データクエリAPI118にThriftリクエストを実行します。
データクエリAPI118は、メッセージ識別子158とサブスクリプションのメタデータからデータを取り出し、オリジナルのクエリサブスクリプション141をレスポンスイベント156に対して実行し、メッセージ132(例: 完全なJSONメッセージ)を生成します。
データクエリエグゼキュータ120は、データクエリAPI118から実行結果(例: メッセージ132)を受け取り、配送イベントバス121上に配送イベント160を公開します。図4に示されているように、配送イベント160にはメッセージ132が含まれています。配送イベント160には、トランスポートトピック134を識別するトランスポートトピックデータ162が含まれています。
トランスポートエンジン122は、データクエリエグゼキュータ120によって公開された配送イベント160を監視・取得するために、配送イベントバス121を読み込みます。
例として、配送イベント160が配送イベントバス121に公開された場合、トランスポートエンジン122は、配送イベント160を取得し、配送チャンネル125とトランスポートトピック134をマッピングするチャンネルトピックマッピング164に基づいて、配送イベント160内に含まれるメッセージ132をどの配送チャンネル125でストリームするかを決定します。
例えば、トランスポートトピックデータ162は、メッセージ132に関連するトランスポートトピック134を識別し、トランスポートエンジン122は、チャンネルトピックマッピング164に基づいてメッセージ132をストリームする適切な配送チャンネル125を識別します。トランスポートエンジン122は、配送チャンネル125を通じてクライアントアプリケーション126にメッセージ132をストリームするように設定されています。
図5は、複数の配送チャンネル125に関してトランスポートエンジン122の操作の例を示すシステム100を示しています。例えば、クライアントアプリケーション126が複数のクエリサブスクリプション141を確立している場合、トランスポートエンジン122は、アクティブなクエリサブスクリプション141ごとに別々の配送チャンネル125を作成し、それらのメッセージ132をそれぞれの配送チャンネル125を介して配信します。
例えば、検索語「dogs」に関連するクエリサブスクリプション141への応答として、トランスポートエンジン122は、ネットワーク150を介して、第1の配送チャンネル125-1(例:「dogs」配送チャンネル)を介して、サブスクリプションエグゼキュータ116から受け取ったメッセージ132をクライアントアプリケーション126に送信します。
検索語「cats」に関連するアクティブなクエリサブスクリプション141への応答として、トランスポートエンジン122は、ネットワーク150を介して、第2の配送チャンネル125-2(例:「cats」通信チャンネル)を介して、サブスクリプションエグゼキュータ116から受け取ったメッセージ132をクライアントアプリケーション126に送信します。
クライアントアプリケーション126は、メッセージングプラットフォーム104にメッセージ132を生成して受け取るための2つのリクエスト(例: クエリサブスクリプションリクエスト140およびサブスクライブリクエスト154)を送信しますが、一部の例では、クライアントアプリケーション126は、サブスクリプションエグゼキュータ116またはトランスポートエンジン122のいずれかと更新を行うことができます。
一部の例では、クライアントアプリケーション126はトランスポートエンジン122と更新を行います。例えば、トランスポートトピック134へのサブスクリプションは、一定の時間間隔の後に期限切れとなる可能性がありますが、クライアントアプリケーション126によってサブスクリプションが更新される限り、それは期限切れになりません(例: クライアントアプリケーション126は、一定の期間(例: 2分ごと)にトランスポートエンジン122と更新を行わないと、クエリサブスクリプション141が期限切れになります)。
図6は、更新操作の一面に関する操作の例を示すシステム100を示しています。一部の例では、サブスクリプションエグゼキュータ116(例: データクエリエグゼキュータ120)がサブスクリプションの更新を管理するように設定されています。例えば、クライアントアプリケーション126は、トランスポートトピック134へのサブスクリプションを更新するために、ネットワーク150を介して、サブスクライブ更新リクエスト161をトランスポートエンジン122に送信することができます。
サブスクライブ更新リクエスト161への応答として、トランスポートエンジン122は、トランスポートトピックデータ162をデータクエリエグゼキュータ120に提供することができます。
トランスポートトピックデータ162には、トランスポートトピック134、サブスクリプション識別子136、およびユーザー識別子146のレスポンスイベント156を生成するためにどのイベントプロデューサ110が割り当てられているかに関する情報が含まれている可能性があります。トランスポートトピックデータ162への応答として、データクエリエグゼキュータ120は、イベントプロデューサシステム106に更新呼び出し171を送信することができます。
イベントプロデューサマネージャ108は、更新呼び出し171を受け取り、有効期限時間148を更新して、クエリサブスクリプション141がイベントプロデューサ110から削除されないようにします。
更新呼び出し171への応答として、イベントプロデューサマネージャ108は、ステータスメッセージ166をレスポンスイベントバス123に公開し、これはデータクエリエグゼキュータ120によって受け取られます。データクエリエグゼキュータ120は、トランスポートエンジン122がステータスメッセージ166をクライアントアプリケーション126に配信できるように、ステータスメッセージ166を配信イベントバス121に公開することができます。
図7は、図1のクライアントアプリケーション126のユーザーインターフェース728の一例を示しています。クライアントアプリケーション126は、別々のカラムとして複数のタイムラインを表示するように設定されています。例えば、ユーザーはカラムを追加または削除することで、タイムラインを追加または削除することができます。検索を指定するカラムの追加は、クエリサブスクリプション141を開始します。カラムの削除によりクエリサブスクリプション141が期限切れとなります。ユーザーは第1のカラムを追加して、第1のタイムライン730-1を提供することができます。第1のタイムライン730-1は、クエリサブスクリプション141がアクティブな間、特定のユーザー(例: ユーザーA)によって生成されたメッセージ732を表示することができます。
例えば、第1のカラムが表示されている間、ユーザーAによって生成されたメッセージ732は、第1のタイムライン730-1に表示されます。例えば、ユーザーAが特定の時点でメッセージングプラットフォーム104にメッセージ732を投稿すると、そのメッセージ732は、メッセージ732が投稿された時点の近くで、第1のタイムライン130-1にプッシュされ、ユーザーはユーザーAによって新しく作成されたメッセージ732をリアルタイムまたはほぼリアルタイムで表示することができます。一部の例では、第1のタイムライン730-1は、新しく作成されたメッセージ732が第1のタイムライン730-1のトップにプッシュされるように、時系列の順序でレンダリングされます。
ユーザーは第2のカラムを追加して、ハッシュタグ#GraphQLに一致するメッセージ732の第2のタイムライン730-2を提供することができます。例えば、検索語「#GraphQL」を示す第2のカラムの追加は、クエリサブスクリプション141を開始します。第2のタイムライン730-2は、検索語「#GraphQL」を含むコンテンツを含むメッセージ732を表示することができます。例えば、第2のカラムが表示されている間、メッセージングプラットフォーム104で交換される検索語「#GraphQL」を含むメッセージ732は、第2のタイムライン730-2にストリームされます。一部の例では、第2のタイムライン730-2は、検索語「#GraphQL」を含む新しく作成されたメッセージ732が、第2のタイムライン730-2のトップにプッシュされるように、時系列の順序でレンダリングされます。
ユーザーは第3のカラムを追加して、検索語「GraphQL Summit」を含むメッセージ732の第3のタイムライン730-3を提供することができます。例えば、検索語「GraphQL Summit」を示す第3のカラムの追加は、クエリサブスクリプション141を開始します。第3のタイムライン730-3は、検索語「GraphQL Summit」と一致するコンテンツを含むメッセージ732を表示することができます。
例えば、第3のカラムが表示されている間、検索語「GraphQL Summit」と一致するメッセージ732は、クエリサブスクリプション141がアクティブな間、第3のタイムライン730-3にストリームされます。第3のタイムライン730-3は、検索語「GraphQL Summit」を含む新しく作成されたメッセージ732が、第3のタイムライン730-3のトップにプッシュされるように、時系列の順序でレンダリングされます。
図8は、クエリサブスクリプション141に基づいてリアルタイムのメッセージ132をストリームするメッセージングプラットフォーム104の操作例を示すフローチャート800を示しています。フローチャート800は、図1から6のシステム100を参照して説明されています。
操作802では、クライアントアプリケーション126からのクエリサブスクリプションリクエスト140の受領を受けて、サブスクリプション実行者116がクエリサブスクリプション141をイベントプロデューサーシステム106に送信します。
例えば、データクエリAPI118は、ネットワーク150経由でクライアントアプリケーション126からクエリサブスクリプションリクエスト140を受け取り、クエリサブスクリプション141を生成します。データクエリAPI118は、イベントプロデューサーマネージャ108にクエリサブスクリプション141を送信します。クエリサブスクリプションリクエスト140はGraphQLのサブスクリプションクエリであり、データクエリAPI118はGraphQL APIであり、データクエリ実行者120はGraphQLの実行者です。
操作804では、トランスポートエンジン122が、クライアントアプリケーション126とトランスポートエンジン122との間に、ネットワーク150経由でクライアントアプリケーション126から受け取ったサブスクライブリクエスト154の受領を受けて、デリバリーチャンネル125を作成します。
操作806では、イベントプロデューサーシステム106が、メッセージストリーム114のメッセージで、クエリサブスクリプション141の条件を満たす内容を持つものに対して、レスポンスイベント156を生成します。
操作808では、サブスクリプション実行者116が、レスポンスイベント156によって識別されたメッセージの作者が、ユーザー識別子146に関連するユーザーを制限しているか(例:ブロックやミュート)どうかを判断し、操作810では、ユーザーが作者によって制限されていると判断された場合、サブスクリプション実行者116が、レスポンスイベント156によって識別されたメッセージを破棄します。
操作812では、トランスポートエンジン122が、作者によって制限されていないと判断されたユーザーへ、クエリサブスクリプション141がアクティブな期間中に、デリバリーチャンネル125を通じて、クライアントアプリケーション126のユーザーインターフェース128にメッセージ132をストリームします。
図9は、クライアントアプリケーション126がメッセージングプラットフォーム104上でアクティブなクエリを生成し、アクティブなクエリに一致するメッセージ132のストリームを受信する操作の例を示すフローチャート900を示しています。
操作902は、クライアントアプリケーション126が、ネットワーク150を介して、メッセージングプラットフォーム104のサブスクリプション実行者116にクエリサブスクリプションリクエスト140を送信するもので、このクエリサブスクリプションリクエスト140は、サブスクリプション実行者116がメッセージングプラットフォーム104上で交換されるメッセージのメッセージキュー112上で実行されるクエリサブスクリプション141を生成するように設定されています。
操作904は、クライアントアプリケーション126が、ネットワーク150を介して、メッセージングプラットフォーム104のトランスポートエンジン122にサブスクライブリクエスト154を送信するもので、このサブスクライブリクエスト154は、トランスポートエンジン122がトランスポートエンジン122とクライアントアプリケーション126との間にデリバリーチャンネル125を作成するように設定されています。
操作906は、クライアントアプリケーション126が、クエリサブスクリプション141の基準を満たすメッセージ132のストリームを、クエリサブスクリプション141がアクティブな間、クライアントアプリケーション126のユーザーインターフェース128上で時間経過とともにデリバリーチャンネル125を介して受信するものです。
操作908は、クライアントアプリケーション126が、ネットワーク150を介して、トランスポートエンジン122にサブスクライブ更新リクエスト161を定期的に送信するもので、このサブスクライブ更新リクエスト161は、トランスポートエンジン122がデリバリーチャンネル125を更新し、サブスクリプション実行者116がクエリサブスクリプション141を更新するように設定されています。
例として、サブスクライブ更新リクエスト161に応答して、トランスポートエンジン122は、データクエリ実行者120にトランスポートトピックデータ162を提供することができます。トランスポートトピックデータ162に応答して、データクエリ実行者120は、イベントプロデューサーシステム106に更新呼び出し171を送信することができます。したがって、クライアントアプリケーション126はトランスポートエンジン122のみで更新を行い、下記に述べるように、メッセージングプラットフォーム104の構造は、クエリサブスクリプション141がトランスポートエンジン122とサブスクリプション実行者116の両方で更新されるようにすることで、クライアントアプリケーション126とメッセージングプラットフォーム104との間で送信される通信の量を減少させることができます。
図10Aは、サーバーコンピュータ1002で実行可能なメッセージングプラットフォーム1004と、コンピューティングデバイス1024で実行可能なクライアントアプリケーション1026を含むシステム1000の概要図です。メッセージングプラットフォーム1004は、メッセージングプラットフォーム1004で交換される大量のメッセージストリーム1014のコンテンツに一致するクエリサブスクリプション1041に基づいて、リアルタイムのメッセージ1032をクライアントアプリケーション1026にストリームでネットワーク1050を介して送信するように構成されています。図10Bでは、イベントプロデューサーシステム1006の詳細を示しています。
イベントプロデューサーシステム1006には、イベントプロデューサーマネージャ1008、イベントプロデューサーマネージャ1008に通信的に接続されたイベントプロデューサ1010、およびイベントプロデューサ1010に通信的に接続されたコレクターサービス1070が含まれています。イベントプロデューサーマネージャ1008は、クエリサブスクリプション1041を取得し、クエリサブスクリプション1041の基準に従ってメッセージストリーム1014からのコンテンツに一致するようにイベントプロデューサ1010を構成します。
イベントプロデューサ1010は、イベントプロデューサーグループ1013に配置され、メッセージストリーム1014に対して多数のクエリサブスクリプション1041を実行します。例えば、イベントプロデューサーシステム1006には、第一のイベントプロデューサーグループ1013-1、第二のイベントプロデューサーグループ1013-2、第三のイベントプロデューサーグループ1013-3、および第四のイベントプロデューサーグループ1013-4など、複数のイベントプロデューサーグループ1013が含まれる可能性があります。各イベントプロデューサーグループ1013は、フルメッセージストリーム1014を受信するように構成されています。
各イベントプロデューサ1010は、メッセージストリーム1014の該当する部分からのメッセージに対してクエリサブスクリプション1041がマッチした際のレスポンスイベント156を生成するように構成されています。また、各イベントプロデューサ1010は、該当するイベントプロデューサ1010でのクエリサブスクリプション1041の健全性を示すステータスレスポンス1075を定期的に生成するように構成されています。
上述したように、クエリサブスクリプション1041は、有効期限と関連付けられている場合があります。例えば、イベントプロデューサーマネージャ1008は、クエリサブスクリプション1041が割り当てられたイベントプロデューサ1010でのアクティブな時間を監視し、その時間が有効期限の値を超えると、リソースを節約するために該当するクエリサブスクリプション1041を解除するように構成されています。
図11は、コレクターサービス1170の例を示しています。このコレクターサービス1170は、図10Bのコレクターサービス1070の例であり、前述の図に関して議論された特徴を持つことができます。コレクターサービス1170は、レスポンスイベント1056をレスポンスイベントバス1023に公開する前に、メモリキャッシュ1180と連携して、レスポンスイベント1056によって識別されたメッセージ1032の重複を削除し、および/またはクライアントアプリケーション1026へのストリーミング速度をストリーミング速度しきい値1173以下にするためにストリーミング速度を減少させることができます。
コレクターサービス1170は、クライアントアプリケーション1026に既に配信されたメッセージ1032を識別するレスポンスイベント1056の重複を削除するために設定されたデデュプリケーター1172を含むことができます。例として、クエリサブスクリプション1041が2つのイベントプロデューサーグループ1013に割り当てられている場合(それぞれがメッセージストリーム1014の全体を受信する)、これはイベントプロデューサー1010が重複したメッセージ1032を識別する原因となる可能性があります。しかし、デデュプリケーター1172は、同じメッセージがクライアントアプリケーション1026に複数回提供されないように重複を識別するように設定されています。
コレクターサービス1170がレスポンスイベント1056をレスポンスイベントバス1023に公開すると、コレクターサービス1170はそのレスポンスイベント1056をメモリキャッシュ1180に格納します。新しいレスポンスイベント1056の受信に対して、デデュプリケーター1172は、新しいレスポンスイベント1056のメッセージ識別子がメモリキャッシュ1180に格納されているかどうかを確認します。メッセージ識別子がメモリキャッシュ1180に格納されていない場合(例えば、それが重複でないことを示している場合)、コレクターサービス1170は新しいレスポンスイベント1056をレスポンスイベントバス1023に公開し、その新しいレスポンスイベント1056をメモリキャッシュ1180に格納します。新しいレスポンスイベント1056のメッセージ識別子がメモリキャッシュ1180に格納されている場合(例えば、それが重複であることを示す場合)、デデュプリケーター1172は新しいレスポンスイベント1056を破棄するように設定されています。
コレクターサービス1170は、メモリキャッシュ1180のステータスレスポンス1075を照会することにより、クエリサブスクリプション1041のヘルスステータスを判断するために設定されたステータスメッセージハンドラー1174を含むことができます。例えば、コレクターサービス1170は、定期的にイベントプロデューサー1010からステータスレスポンス1075を受信し、そのステータスレスポンス1075をメモリキャッシュ1180に格納することができます。
さらに、コレクターサービス1170には、イベントプロデューサー1010でクエリサブスクリプション1041を再起動するために設定されたサブスクリプション再起動者1176、およびレスポンスイベント1056によって識別されるメッセージ1032がクライアントアプリケーション1026にストリーミング速度しきい値1173以下で配信されるようにレスポンスイベント1056の1つ以上を破棄するために設定されたクオータチェッカー1178を含むことができます。
クオータチェッカー1178は、レスポンスイベント1056によって識別されるメッセージ1032のエンゲージメント確率メトリクス1177を受け取るように設定されており、これらのメトリクスはメッセージ1032とのエンゲージメントの予測レベルを示しています。
また、クオータチェッカー1178は、レスポンスイベント1056によって識別されるメッセージ1032のメッセージヘルスメトリクス1179を受け取るように設定されており、これらのメトリクスはメッセージングプラットフォーム1004の1つ以上の条件(例: 悪意のある行動、憎悪的な行動、脅迫など)を違反するリスクレベルを示しています。
図12は、コレクターサービス1270の例を示しています。コレクターサービス1270は、第一のコレクターサービスインスタンス1271-1、第二のコレクターサービスインスタンス1271-2、第三のコレクターサービスインスタンス1271-3など、複数のコレクターサービスインスタンス1271を含むことができます。
図12には三つのコレクターサービスインスタンス1271が示されていますが、コレクターサービス1270は任意の数のコレクターサービスインスタンス1271を含むことができます。各コレクターサービスインスタンス1271は、レスポンスイベント1056および/またはステータスレスポンス1075の異なる部分を受信することができます。
コレクターサービス1270は、2層のストリーミングレート調整プロセスを実行するように構成されています。第一の層では、各コレクターサービスインスタンス1271は、レスポンスイベント1056の異なる部分を受信し、個々のストリーミングレートしきい値1284以下のレスポンスイベント10056の数を持つサブセットを取得するために1つ以上のレスポンスイベント1056を破棄することで、レスポンスイベント1056のサブセットを取得します。
第二の層では、各コレクターサービスインスタンス1271は、そのサブセットをメモリキャッシュ1180に格納し、少なくとも1つのコレクターサービスインスタンス1271がサブセットを集約し、集約されたサブセットがストリーミングレートしきい値1173以下のレスポンスイベント1056の数を持つように、1つ以上のレスポンスイベント1056を破棄します。
加えて、コレクターサービス1270は、2層のデデュプリケーションプロセスを実行するように構成されています。第一の層では、各コレクターサービスインスタンス1271は、レスポンスイベント156の異なる部分を受信し、同じメッセージ1032を識別するレスポンスイベント1056を取り除きます。各コレクターサービスインスタンス1271は、レスポンスイベント1056のそれぞれのグループをメモリキャッシュ1180に格納します。
少なくとも1つのコレクターサービスインスタンス1271が、メモリキャッシュ1180を照会してグループを集約し、集約されたグループから同じメッセージ1032を識別するレスポンスイベント1056を破棄します。
図13は、システム1000の例示的な操作を示すフローチャート1300を描写しています。フローチャートは図10Aおよび10Bのシステム1000を参照して議論されますが、図13の操作はここで議論されているシステムのいずれにも適用可能です。
操作1302は、サーバーコンピュータ1002で実行可能なメッセージングプラットフォーム1004上で交換されるメッセージのメッセージストリーム114を含むメッセージキュー1012の内容と一致するためのクエリーサブスクリプション1041をイベントプロデューサーマネージャ1008で受け取るものです。このメッセージングプラットフォーム1004は、コンピュータデバイス1024で実行可能なクライアントアプリケーション1026のユーザーインターフェースにメッセージ1032を配信するように設定されています。
操作1304は、メッセージキュー1012からメッセージストリーム1014のメッセージを受け取るように設定された複数のイベントプロデューサーグループ1013の1つであるイベントプロデューサーグループ1013に、イベントプロデューサーマネージャ1008がクエリーサブスクリプション1041を割り当てるものです。
操作1306は、クエリーサブスクリプション1041のクエリータームを含むメッセージストリーム114のメッセージのそれぞれの部分からのメッセージに対して、個別のイベントプロデューサー1010が応答イベント1056を生成するものです。
操作1308は、応答イベント1056がクライアントアプリケーション1026に配信されるメッセージ1032のメッセージ識別子を含む場合、コレクターサービス1070が応答イベント1056を応答イベントバス1023に公開するものです。
図14は、図11のコレクターサービス1170および/または図12のコレクターサービス1270を持つ図10Aおよび10Bのシステム1000の例示的な操作を示すフローチャート1400を描写しています。図14の操作はここで議論されているシステムのいずれにも適用可能です。
操作1402には、サーバーコンピュータ1002で実行可能なメッセージングプラットフォーム1004で交換されるメッセージのメッセージストリーム1014を受信することが含まれます。ここで、メッセージングプラットフォーム1004は、計算デバイス1024で実行可能なクライアントアプリケーション1026のユーザーインターフェースにメッセージ1032を配信するように設定されています。
操作1404には、メッセージングプラットフォーム1004でのアクティブなクエリのためのクエリサブスクリプション1041を受信することが含まれます。
操作1406には、クエリサブスクリプション1041がアクティブな間、クエリサブスクリプション1041のクエリ用語を含むメッセージストリーム1014のメッセージに対応してレスポンスイベント1056を生成することが含まれます。
操作1408には、レスポンスイベント1056によって識別されたメッセージが、クライアントアプリケーション1026にストリーミングレートのしきい値1173以下で配信されるようにするために、1つ以上のレスポンスイベント1056を破棄することが含まれます。
操作1410には、ネットワーク1050を介して、ストリーミングレートのしきい値1173以下の方法で、メッセージ1032をクライアントアプリケーション1026に配信することが含まれます。
ここがポイント!
従来のメッセージングシステムでは、大量のメッセージがリアルタイムに交換されるため、特定のクエリや条件に一致するメッセージを効果的に識別し、それらをクライアントアプリケーションに配信することは技術的に難しいものでした。特に、メッセージのストリーミングレートを制御することなく、適切なメッセージを選択し、配信することは困難だったという課題がありました。
そこで、本発明では、メッセージングプラットフォームにおけるメッセージの流れを受け取り、クエリサブスクリプションに基づいて特定のメッセージを効果的に識別するシステムと手法が示されました。このシステムには、イベントプロデューサーマネージャがあり、クエリサブスクリプションを受け取り、それに基づいてイベントプロデューサーグループに分配します。それぞれのイベントプロデューサーは、メッセージの特定の部分を受け取り、クエリ条件に一致するメッセージに対してレスポンスイベントを生成します。そして、ストリーミングレートのしきい値に基づいて、選択されたメッセージをクライアントアプリケーションに適切なレートで配信します。
これにより、大量のメッセージの中から関連性のあるものをリアルタイムで効果的に選択し、適切なストリーミングレートで配信することが可能になるのです。
未来予想
本発明を用いることによる利益としては、上述のとおり、情報の取得やフィルタリングについての迅速性が向上すること、それによる帯域幅の節約(リソースの最適化)が挙げられます。また、クエリベースのサブスクリプションにより、ユーザーは自分の関心や必要に合わせた情報のみを受け取ることができるため、パーソナライズされたユーザーエクスペリエンスが得られます。
近未来の予測として、このような技術と、AI・機械学習技術とを統合すれば、ユーザーの過去の行動や傾向に基づいて、より適切なメッセージや情報を自動的にフィルタリングする技術が考えられます。また、エッジコンピューティングとの統合がなされれば、エッジデバイスでのリアルタイムのメッセージフィルタリングや処理を行い、中央のサーバーへの負荷を軽減する技術の開発が期待されます。
特許の概要
発明の名称
|
Event producer system of a messaging platform for delivering real-time messages |
出願番号
|
US16/669044 |
公開番号
|
US2021/0044549A1 |
特許番号
|
US11580165B2 |
出願日
|
2019.10.30 |
公開日
|
2021.2.11 |
登録日
|
2023.2.14 |
出願人
|
Twitter Inc. |
発明者
|
Rishi Renjith 他 |
国際特許分類 |
G06F 15/16
G06F 9/54
|
経過情報 |
本発明の特許権は、Morgan Stanley Senior Funding, Inc.に譲渡されている。
|