私は、私たちのページ(ソーシャルゲームタイプ)用のFacebookスタイルの通知システムを構築し始めています。私は今、そのようなシステムを設計する最良の方法を研究しています。私は、通知をユーザーやそのようなものにプッシュする方法は興味がありません。私はサーバー上でシステムを構築する方法を研究しています(通知の保存方法、保存場所、取得方法など)。通知システムの構築
そう...私たちは持っているいくつかの要件:ピーク時に
- たちはおよそ1Kログインユーザ同時(と、より多くのゲストを持っているが、彼らは持っていないとして、彼らはここでは関係ありません。多くのイベントを生成する)
- さまざまな種類の通知があります(ユーザーAはあなたを友達として追加しました、ユーザーBはあなたのプロフィールにコメントしました、ユーザーCは画像を好みました、ユーザーDはゲームXであなたを倒しました、...)
- ほとんどのイベントは、1人のユーザー(ユーザーXはあなたのイメージが好きでした)に対して1つの通知を生成しますが、多くの通知が生成されます(ユーザーYの誕生日など)
- 通知はグループ化する必要があります。いくつかの画像のようなインスタンスのための4つの異なるユーザならば、その画像の所有者は、4人のユーザがOKので、私が考えていたもの(FBがするよう)
をイメージしていない4つの別々の通知を気に入っていることを示す1つの通知を取得する必要がありますイベントが発生したときにイベントを保存するキューを作成する必要があるということです。その後、そのキューを見て、それらのイベントに基づいて通知を生成するバックグラウンドジョブ(gearman?)を持っています。このジョブは、各ユーザーのデータベースに通知を格納します(イベントが10人のユーザーに影響を与える場合は、10の別個の通知があります)。その後、ユーザーが通知のリストを持つページを開くと、私は彼のためのすべての通知を読んで(これを100個の最新の通知に限定しようと思っている)、それらをグループ化して最後に表示します。私はこのアプローチには心配です
もの:
- :)地獄のような複雑でここに最適なストレージ・データベースです(私たちはMySQLを使用している)、または私は何か他のものを使用する必要があります(Redisのはのように思えます良いフィット感もあります)
- 通知として何を保存すればよいですか?ユーザーID、イベントを開始したユーザーID、イベントの種類(それらをグループ化して適切なテキストを表示できるようにします)が表示されますが、通知の実際のデータを格納する方法はわかりません(例:URL &好きだった画像)。私は通知を生成するときにその情報を単に焼くべきですか、または影響を受けるレコード(イメージ、プロファイル、...)のIDを格納し、通知を表示するときにDBから情報を取り出す必要があります。
- 通知ページを表示するときに100個の通知をオンザフライで処理する必要がある場合でも、パフォーマンスはここでOKです。
- 可能性のある問題はすべてのリクエストで発生する可能性があります。 (私は通知をまとめてグループ化するので、それ自体で問題になる可能性があります)。これは避けられるかもしれませんが、私が(グループ化されている)通知のビューをオンザフライではなくバックグラウンドで生成した場合は避けてください。
私の提案する解決策と懸念事項についてどう思いますか?私がここで関連する何かを言及すべきだと思うなら、コメントしてください。
私たちは私たちのページにPHPを使用していますが、これは大きな要因ではありません。
どのくらいの時間、それは一人の人間の努力として、この通知システムを構築することができました。私はちょうどそれに応じてタイムラインを作るための推定をしたい。 – Shaharyar
@Shaharyar私はそれが通知システムの複雑さに依存すると思います。 – tyan
私はMySQLと同じシステムを使って、優先度ベースの通知システムを構築しました。良いことは、それがそれ以上になると、数千人のユーザーに拡大するということです。特にAndroidとGCMで爆発します。私はredis、rabbitMQ、自然にメッセージキューを出すKafka、機能性のようなMySQLの代替案を知りたいです。 –