私はFacebookスタイルの通知システム(ソーシャルゲームタイプ)の構築を始めており、そのようなシステムを設計するための最良の方法を調査しています。通知をユーザーにプッシュする方法やそのようなものには(今のところは)興味はありません。サーバー上でシステムを構築する方法(通知の保存方法、保存場所、フェッチ方法など)を調査しています。
だから...私たちが持っているいくつかの要件:
- ピーク時には、約1,000人の同時ログインユーザー(およびさらに多くのゲストがいますが、通知はないためここでは重要ではありません)で、多くのイベントが生成されます
- 通知にはさまざまなタイプがあります(ユーザーAがあなたを友達として追加し、ユーザーBがあなたのプロフィールにコメントし、ユーザーCがあなたの画像を気に入った、ユーザーDがゲームXであなたを打ち負かした、など)
- ほとんどのイベントは1人のユーザーに対して1つの通知を生成します(ユーザーXは画像を気に入っています)。ただし、1つのイベントが多くの通知を生成する場合があります(たとえば、ユーザーYの誕生日です)。
- 通知はグループ化する必要があります。たとえば、4人の異なるユーザーが何らかの画像を好む場合、その画像の所有者は、4人のユーザーが4つの個別の通知ではなく(FBのように)画像を気に入っていることを示す1つの通知を受け取る必要があります
わかりましたので、私が考えていたのは、イベントが発生したときにイベントを格納するキューのようなものを作成することです。次に、そのキューを確認し、それらのイベントに基づいて通知を生成するバックグラウンドジョブ(gearman?)があります。このジョブは、ユーザーごとに通知をデータベースに保存します(したがって、イベントが10人のユーザーに影響する場合は、10個の個別の通知があります)。次に、ユーザーが通知のリストを含むページを開くと、私は彼のためにそれらすべての通知を読み取り(これを100件の最新の通知に制限することを考えています)、それらをグループ化して、最後に表示します。
私がこのアプローチで心配していること:
- 地獄のように複雑:)
- データベースはここで最高のストレージです(私たちはMySQLを使用しています)、または他のものを使用する必要があります(redisも適しているようです)
- 通知として何を保存すればよいですか?ユーザーID、イベントを開始したユーザーID、イベントのタイプ(グループ化して適切なテキストを表示できるようにするため)ですが、通知の実際のデータ(たとえば、URLと画像のタイトル)を保存する方法がわかりません好きだった)。通知を生成するときにその情報を「ベイク」するか、影響を受けるレコードのID(画像、プロファイルなど)を保存し、通知を表示するときにその情報をDBからプルする必要があります。
- 通知ページを表示するときに100の通知をオンザフライで処理する必要がある場合でも、ここではパフォーマンスは問題ありません。
- 未読の通知の数をユーザーに表示する必要があるため、すべての要求でパフォーマンスの問題が発生する可能性があります(通知をグループ化するため、それ自体が問題になる可能性があります)。オンザフライではなく、バックグラウンドで通知のグループ化された場所で通知のビューを生成した場合、これは回避できます。
では、私の提案するソリューションと私の懸念についてどう思いますか?ここで関連する他のことについて言及する必要があると思われる場合は、コメントしてください。
ああ、私たちはページにPHPを使用していますが、ここでそれが大きな要因になることはないと思います。