Badooオフライン通知システム

ユーザーがオフラインでサイト上のイベントについて知るために、特別な通知システムを作成しました。 彼女のタスクには、ユーザーのイベントを蓄積し、利用可能な通信チャネル(スマートフォンでの電子メールやプッシュ通知など)を介して適切なタイミングでイベントを報告することが含まれます。

イベントストレージはどのように構成されていますか? どのイベントが通知されますか? 彼らはどの時点でどのような原則で出発しますか? 今日は、これらの質問やその他の質問にすべて答えようとします。



この記事では、システムのアーキテクチャの一般的な説明を技術的な詳細で説明し、サイトに不在のときに発生したすべての新しいこと(アプリケーション、サービスなど)をユーザーに通知するか、何らかの方法でユーザーに通知します。





イベントとは何ですか?



当サイト上のすべてのイベントは、他のユーザーとの関係で一部のユーザーのアクションによって生成されます。 いい人を見つけたら、彼のプロフィールをもっと詳しく見て、それによってイベント「Visiting a profile」を作成したいと思うでしょう。 彼のプロフィールがあなたにとって興味深いと思われる場合、あなたは彼に手紙を書きたいと思うでしょう。したがって、 「新しいメッセージ」イベントを作成します。 あなたは彼をあなたのお気に入りに加えて 、彼会いたいという願望を表現できます 。 彼もあなたと会いたい場合は、イベント「相互共感」が各ユーザーに対して発生します。



他のユーザーの写真を評価し、 コメント残すことにより、関連するイベントを作成します。



サイトにいる間、ユーザーには、連絡先を含む各セクションの横にある赤い円の数字の形で新しいイベントが表示されます。 彼が現在サイトにいない場合、セクションのすべての更新の通知を受け取ることができます。











イベントはどのように保存されますか?



ユーザーにあまり多くの通知を送信しないように、各イベントに通知を送信するのではなく、たとえばサイトにユーザーが不在になった最初の30分間など、一定期間グループ化します。 最初のディスパッチの後、再び待機し、新しいイベントがある場合はディスパッチします。 ただし、一部の重要な通知は順番を追って送信される場合があります。



イベントを集約するために、特別なDBMS-Cのデーモンを開発しました。





これらのデーモンのうち4つは、ピーク時に毎秒25,000リクエストに達する負荷に対処するために、2つのデータセンターのそれぞれで起動され、デーモンの再起動/更新、またはクラッシュの場合にダウンタイムを最小限に抑えます。 それらの間の負荷は、単純な原則に従って分散されます。



user_id%4 = <デーモン番号>


したがって、各ユーザーのイベントは常に同じデータベースに「ライブ」されます。 ユーザーデータはメモリだけでなくディスクにも保存されるため、通知は失われません。 シャーディングを変更して、さらにいくつかのデーモンを追加する必要がある場合、デーモンは「クエンチ」され、必要に応じてリポジトリ間でデータが移動され、起動時にロードされます。 これは非常にまれな状況です。これを行う必要があるのは1回だけです。



配信チャネルとは何ですか?



ユーザーに新しいイベントを通知するために、電子メールとiOSおよびAndroidプッシュ通知を使用します。



プッシュ通知とは何かについて少し述べる価値があります。 各iOSアプリケーションには、実行していないときでも通知を送信する機能があります(もちろん、禁止していない場合)。 この場合、通知の配信はAppleサーバーを介して実行され、直接ではありません。 iPhoneにアプリケーションをインストールすると、Appleは開発者に、システムにインストールされたアプリケーションの識別子を伝えます。これは、メッセージを送信するためのアドレスとして使用されます。 Androidスマートフォンにも同じシステムが存在しますが、配信は既にGoogleのサーバーを介して行われています。



アプリケーションがインストールされているデバイスが複数ある場合、それぞれに通知が送信されます。



通知はどのように生成されますか?



使用する各チャネルには、独自の通知生成メカニズムがあります。



一般的なロジックは、1種類のイベント(2人の訪問者、5人のメッセージなど)に関する情報を含む通知があり、グループ通知(2人の訪問者と1つのメッセージ、2つのメッセージと1つの相互同情など)があることです。 ) メールには、新しいメッセージ、訪問者などのためのいくつかの個別のテンプレートがあります。 さらに、各イベントが個別の行で表されるグループメッセージテンプレートがあります。



プッシュ通知については、いくつかのバージョンでイベントの個々のタイプごとにテキストをコンパイルしました。 通知には多くの情報を含めることができないため、イベントのグループについて、いくつかの基本的な組み合わせ(たとえば、訪問者+メッセージ、メッセージ+相互の同情)を選択しました。





iOSの通知はAndroidと異なり、後者はタイトル、テキスト、画像、および前者のみのテキストを持つことができますが、長さが長くなります。



システムアーキテクチャはどうですか?



一方では、サイトの使用中に、ユーザーはデータベースにすぐに追加されるイベントを生成します。 グラフでは、2つのデータセンターのいずれかで24時間のイベントの相関関係を確認できます(グラフ上の正確な数値は公開しないように求められました)。











一方、phpスクリプトは複数のサーバーで継続的に実行されており、データベースを絶えずポーリングして、送信時刻がすでに来ている通知があるかどうかを確認します。 以下に、通知の準備ができているユーザーの数のグラフを示します。











スマートフォンに通知を送信する必要がある場合、データベースのエントリは特別なフラグでマークされ、10分間遅延します。 ユーザーのタイムゾーンの夜である場合、ユーザーの睡眠を妨げないように、「サイレント」パラメーターを使用して通知を送信します。



ユーザーが10分以内にサイトにアクセスしなかった場合、蓄積されたすべてのイベントに関する情報を含むダイジェストレターを生成して送信します。 その後、送信された通知はデータベースから削除され、新しいイベントが再び発生します。



登録されたユーザーからページがリクエストされるたびに、すべてのイベントをクリアするコマンドをデータベースに送信します。 ユーザーがプロモーションページにアクセスし、新しいものは何も表示されずにサイトを離れることがあります。 新しいイベントのすべてのカウンターが表示されないページでは、どの特定のイベントをクリーニングする必要があるかを示しています。



次の送信のタイミングになり、ユーザーのステータスが「オンライン」のままの場合、特別なフラグでフラグを立て、しばらくの間データベースへの書き込みを延期し、サイトでのアクティビティを継続するか、「オフライン」のステータスになることを期待します。



オンラインとはどういう意味ですか?



ユーザーが現在サイトにいる、最近になっていた、または既に「オフライン」になっていることを確認する方法 これらの概念は非常に主観的であり、実験的に選択されています。



ユーザーは、サイトおよびモバイルアプリケーションでアクティブにできます。 最後のアクティビティの時刻を保存するために、独自の設計の別のDBMS-Last Accessを使用します。 このデーモンは、「箱から出して」、ユーザーアクティビティのすべてのデータに基づいて「オフライン」のステータスを計算します。最後のアクションの30分後、ユーザーは最終的に「オンライン」でなくなります。



通知を送信するために、オンラインステータスを決定するより複雑なロジックが使用されます。 まず、最終アクセスを確認します。ユーザーのステータスが「オフライン」に変更されたことが報告された場合、安全に送信できます。 かなりの時間が経ちました。 それ以外の場合、次のアルゴリズムがサイトとアプリケーションに使用されます。人がサイトを使用する場合、送信に15分かかります。 モバイルアプリケーションが使用され、15分未満が経過した場合は、実行中のアプリケーションとの接続があるかどうかを確認し、ない場合は通知を送信します。



説明されたシステムは、便利で目立たないように、ユーザーにサイトの最新情報を知らせます。 多くのユーザーにとって本当に便利で必要なものになるように、私たちは絶えず改善と改善を行っています。



アレクサンダートレッグトレガー、開発者。



All Articles