0

メッセージと通知機能を備えたソーシャル ネットワークを運営しています。ユーザーがメッセージを送信するか、別のユーザーに通知を送信するたびに、メッセージまたは通知に関する詳細を含む行がテーブル news_updates に挿入され、すべての友人が news_seen テーブルに挿入されます。(メッセージが読み取られるか、通知に関連するアイテムが開かれると、見たものが 1 に設定され、ajax 要求のコールバック関数の最後でこれを実行します。現在開いているニュース項目で、すべての newsitem_ids を含む大きな挿入を行っています)。

news_seen:

newsitem_id bigint, 
user_id big int,
seen int DEFAULT '0'

現時点では、news_updates JOIN news_seen でニュースを確認するために、3 秒ごとに ajax リクエストを実行しています。

これは、ますます多くのユーザーを獲得しているため、サーバーの負荷が非常に大きいことがわかりました。xmpp などについてよく読んでいて、プッシュ通知サービスが私のサイトに最適だと思います。

唯一のことは、非常に多くのオプションがあるため、どの方法に進むかを実際に決めることができないということです.

また、独自のシステムを作成することも考えました。私はこのようにする予定です:

  • 初期登録時にユーザーごとに xml ファイルを作成します (そして、既に登録されているユーザーに対してバッチを実行します)。

  • ユーザーがニュースの更新を送信したら (データベースに書き込むための独自の php 関数があります)、それぞれの友人の xml ファイルを操作する小さなコマンドを含めます。

  • 3 秒の ajax リクエストを実行する代わりに、jquery ストリームを使用して xml ファイルへの長い接続を確立し、最後のリクエスト以降に変更が加えられた場合は、データベースからデータをポーリングする通常の ajax リクエストを実行します。

  • Ajax リクエスト内で check_seen を実行する代わりに、すべての新しいアイテムをグローバル配列に挿入し、リスト内のアイテムが現在表示されているかどうかをテストする間隔関数で使用します。

これは良い考えだと思いますか?

4

1 に答える 1

1

正直なところ、私はあなたの仕様を実装するとは思いません。

  • たとえば、XML よりも軽量なデータ モデルを使用します。代わりに JSON を使用します。
  • DISC(データベース)にできるだけ触れないようにします(遅い)。
  • 1 つではなく 2 つのリクエストを実行する (ロング ポーリング/ポーリング)。私はこれを避けようとします。
  • おそらく、インターバル関数を使用せず、必要なときにのみ関数を呼び出すことで、CPU 時間を無駄にしないようにするでしょう。おそらくREDIS の pubsub のようなものを使用します。
  • ポーリング/ロングポーリングは (ほとんどの場合) IO をブロックするため、PHP では悪い考えです。非ブロックIO(高価)を行うと思われるREACTという名前の興味深いプロジェクトを見つけました。私はこれ(パフォーマンス)を自分でテストしていませんが、これはオプションになる可能性があります。
  • XMPP の場合、追加のソフトウェアをインストールする必要があります。たとえば、インストールと使用が簡単なProsodyが気に入りました。次に、 BOSHを確認する必要があります。bosh クライアントの場合、strophe.jsまたはJSJaCを使用します。
  • 代わりに、おそらくsocket.ioFaye、またはおそらくvertx.ioのようなものを使用するでしょう。
于 2012-06-12T09:39:28.617 に答える