ソーシャルネットワーク通知システム


10

バックグラウンド

私はいくつかのソーシャルネットワーキング機能を含むクライアント向けのアプリに取り組んでいます。私はもともとモバイルフロントエンドを開発していましたが、バックエンドの開発も担当する状況でした。

一般的な背景として、私たちのシステムでは、ソーシャルネットワークから期待されるように、ユーザーが他のユーザーをフォローし、フォローしているユーザーに関する通知を受け取ることができます。注意すべき点は、ほんの数サブセット(せいぜい数百人)のユーザーのみがフォローできることであり、ほとんどのユーザーベースはこれらの個人の少なくとも1人をフォローしていると予想されます。

UI側には、番号が付いた通知ボタンがあり、ボタンをクリックすると通知画面に移動します。

問題

私は、通知を実装するための戦略と、データベースに1つ以上の通知テーブルを作成するために見つけたほとんどのリソースを調査してきました。(私が好む例はここで受け入れられた答えです:https : //stackoverflow.com/questions/9735578/building-a-notification-system)。

私を後押ししているのは、通知に関するほとんどのデータベース駆動型の戦略では、各フォロワーの通知ごとに行を挿入する必要があるということです。したがって、1,000人がSallyをフォローしている場合、対応するテーブルに1,000行を挿入します。それはスケーラブルですか?数万人または数十万人のユーザーがサリーをフォローしていて、彼女が1日に数十の投稿を作成している場合はどうなりますか?

私の元のアイデアはクエリですべてを処理することでした:通知ボタンの数は、最後に通知画面にアクセスしたときより最近投稿されたコンテンツの行数を要求することによって取得され、個々の通知はより詳細なクエリから生成されます通知画面にアクセスしたとき。このアプローチでは、書き込みや追加のストレージは必要ありませんが、柔軟性がなく、サーバーをかなり難しくします。

セットアップ

(前の開発者によって確立された)バックエンドは、CodeIgniterMySQLデータベースを使用します。現在、くだらないGoDaddy共有ホスティングアカウントで実行されていますが、本稼働に入る前にアップグレードされると思います(希望ですか?)。ホスティングパッケージは、ユーザーの増加に合わせてスケーリングされます。

現在、私たちのフロントエンドはモバイルアプリのみですが、後でウェブサイトも構築する予定です。現時点では、サーバーから通知に関するリアルタイムのプッシュ更新を取得することに関心はありません。

補遺

私はバックエンドに特化しておらず、私はその部門の頭の中にいます。クライアントはそれを知っており、私はこの種のプロジェクトの範囲を説明するために最善を尽くしましたが、現時点では他の誰もプロジェクトに取り組むことを信頼しないことを明確にしています。テスターの追加を開始する前に、あと1か月の作業が必要であり、あらゆる種類のパフォーマンスメトリックを取得できます。ユーザー数や今後5年間に使用するハードウェアを実際に見積もることはできませんが、クライアントは数十万人以上のユーザーを望んでいると思います。

これがここに投稿される問題の具体的な内容であることを願っています。必要に応じて調整できます。ご不明な点がある場合や、重要な詳細を省略している場合は、お問い合わせください。

tl; dr

  • すべてのユーザーが同じ数百人の何人かしかフォローしていない場合、データベース主導の通知システムは長期的なスケーラビリティにマイナスの影響を及ぼしますか?
  • フォロワーごとに通知ごとに個別の通知行を必要とせずに、通知をデータベース主導にする方法はありますか?
  • 完全にクエリ駆動型の通知システムはスケーラブルですか、それともDBにデータを書き込まない以外に利点がありますか?
  • 私はこれを早すぎると思いすぎていますか?クライアントが限られた予算であり、最終製品が人気があるかどうかまだわからないので、今のところ機能するものを構築するだけで問題が発生した場合に最適化を検討できますか?

通知を期限切れにできますか?たとえば、2週間以上前のものを削除します。これにより、サイトが成熟するにつれて、使用されるテーブルのサイズのバランスがある程度整います。
GrandmasterB

これは問題にはなりません。人気のあるユーザーが投稿を行うたびに、通知テーブルに50,000エントリを書き込むデータベースをロックすることのパフォーマンスへの影響にもっと関心を持っていました。
user45623

私は同様の(ただし、より小さな)通知システムを使用してプロジェクトに取り組みました。新しい投稿のキューを確認して通知を処理するバックグラウンドプロセスがありました(この場合、実際には、電子メールを2番目のキューに挿入して送信していました)。リアルタイムではありませんでしたが、通常は数分ですべてを処理しました。
GrandmasterB 2015年

回答:


10

したがって、1,000人がSallyをフォローしている場合、対応するテーブルに1,000行を挿入します。それはスケーラブルですか?

はい、データベーステーブルが適切にインデックス付けされている場合に限ります。

数万人または数十万人のユーザーがサリーをフォローしていて、彼女が1日に数十の投稿を作成している場合はどうなりますか?

すべての通知を永続的に追跡したい場合、Sallyに対して1日あたり数十万から数十万の通知レコードを生成します。そのようなトラフィックを持つサリーのようなユーザーの割合は常に非常に小さいです。

私の元のアイデアはクエリですべてを処理することでした:通知ボタンの数は、最後に通知画面にアクセスしたときより最近投稿されたコンテンツの行数を要求することによって取得され、個々の通知はより詳細なクエリから生成されます通知画面にアクセスしたとき。

これは不必要に複雑に思えます。通知に関する詳細な統計情報が必要な場合は、通知を保存してください。

すべてのユーザーが同じ数百人の何人かしかフォローしていない場合、データベース主導の通知システムは長期的なスケーラビリティにマイナスの影響を及ぼしますか?

これが機能する理由です...少数の人々が常に大多数のトラフィックを生成しています。

フォロワーごとに通知ごとに個別の通知行を必要とせずに、通知をデータベース主導にする方法はありますか?

はい...通知を保存しないでください。通知メールをファイアアンドフォーゲット形式で送信するだけです。または、通知を一定期間保存してから破棄します。または、各通知を読んだ後に破棄します。

完全にクエリ駆動型の通知システムはスケーラブルですか、それともDBにデータを書き込まない以外に利点がありますか?

どういう意味かわかりません。通知を照会する場合は、通知をデータベースに保存する必要があります。 それ以外の場合、クエリするものはありません。

私はこれを早すぎると思いすぎていますか?

正しいテーブルを含む、適切に正規化されたインデックス付きデータベースの設計を手伝ってくれる人に相談してください。そのようなデータベースが、あなたが説明したシナリオを効果的に処理できなかった理由はわかりません。

実際の例

私の知る限り、Stack Exchangeはすべての通知を含め、すべてを永続的に保存します。MySqlに似たデータベーステクノロジーといくつかのキャッシングテクノロジーを使用しています。彼らのハードウェアとストレージのスペースはかなりのものですが、彼らが得るトラフィックの量は良い問題です。


うわー、あなたはすべてに対処しました!ありがとう、ロバート!データベースは正規化されていますが、インデックス作成はまだ確認していません。残念ながら、私には「私を助けることができる人と話す」ことができません。条件が厳しく、プロジェクトの具体的な詳細を誰とも話し合うことができず、クライアントは誰も信用しないという点に達していますしかし、私はプロジェクトに参加しています...ええと、索引付けに関するいくつかの調査を行うことができるはずです。ありがとう!
user45623

1
インデックス作成の一般的な経験則:すべての外部キーは可能な限り重複してインデックスを作成する必要があります。すべての主キーにはすでにインデックスが付けられているはずです。検索またはWHERE句の適用が必要なフィールドには、インデックスを作成する必要があります。それらは少ないはずです。
ロバートハーベイ

1
これは誤りです。これはスケーラブルではありません。「サリー」ごとにN行を生成します。Nはユーザー数です。妥当な数のユーザーがいる場合、これはすぐに問題になります。10,000人のユーザーに10回投稿する100個の "Sallys"は、1日に1,000万行です-良すぎるように聞こえませんか?あなたが実際にしたいことは、これを逆にして、「Sally」投稿ごとに1つの行を作成し、Sallyをフォローしているすべてのユーザーに、自分の個人的なコピーではなくこれらを取得させることです。もちろん、これはユーザー固有のロジック(たとえば、集計)が必要な場合に問題を引き起こします...
Ben

1
...ここでの「投稿ごとの行の回避」の説明は、ほとんどのシステムでこれらの投稿を固定する必要があるため、明らかにストローマンです。また、「複雑なため」クエリは避けないでください。システムのスケーリングに伴って持続不可能なオーバーヘッドが発生するため、避けてください。
Ben
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.