jquery と PHP を使用してサイトにチャット機能を追加しましたが、おおむねうまくいっているようですが、スケーラビリティが心配です。誰かアドバイスをいただけないでしょうか。私にとって重要な領域は、誰がオンラインであるかという意識を効率的に管理することだと思います.
詳細: 私は (まだ) ロング ポーリングを実装しておらず、PHP (Apache) で長時間実行されているプロセスの生の数が制御不能になるのではないかと心配しています。
私のコードは、定期的な jquery ajax ポーリング (4 秒) を実行します。これは、最初にデータベースを更新して、アクティブであることを示し、タイムスタンプを設定します。次に、すべてのアクティブなユーザーのタイムスタンプをチェックし、外部 (10 分) のユーザーを非アクティブに設定するルーチンがあります。これまでの私の調査では、これはごく普通のことです。ただし、すべてのアクティブなユーザーが他のすべてのアクティブなユーザーをチェックできるようにしてから、全員がデータベースを更新して非アクティブなユーザーをキックオフすると、労力が重複し、ロックが記録され、サーバーに不要な負荷がかかることに同意します。
そこで、「スイーパー」の役割のアイデアを実装しました。これは、クリーンアップを行う人の役割を継承するオンライン ユーザーの 1 人にすぎません。他のすべての人は、「スイーパー」が存在するかどうかを確認し (DB 読み取り)、続行します。チェック時にスイーパーがない場合は、自分自身をスイーパーにします (DB は自分のレコードに書き込みます)。複数ある場合は、自分自身を「非スイーパー」にして、ランダムな期間スリープさせてから、もう一度確認してください。
私の理論では、この方法では、関連するテーブルの複数のレコードに定期的に更新を書き込むユーザーは 1 人だけで、他のすべてのユーザーは自分のレコードを読み取るか、単に書き込むだけです。したがって、問題なく動作しますが、問題はおそらく、プロセスにいくつかの DB 読み取りが必要であり、実際には、他の調査のように全員にクリーンアップを行わせるよりも効率が悪い可能性があることです。
これまでのところ、100 人を超える同時ユーザーが正常に実行されていますが、クライアントは数百、さらには 1,000 を超えてスケールアップすることを望んでおり、この段階でこのアイデアが良いかどうかはわかりません。
これが良いアプローチかどうか、何百人ものアクティブ ユーザーに拡張できるかどうか、または別のアプローチを推奨できるかどうかを知っている人はいますか?
余談ですが、実際のチャット メッセージのロング ポーリング/コメットは単純に思えます。コードの適切なリソースを見つけましたが、特に PHP と Apache では危険であると示唆するブログ コメントがいくつかあります。アクティブなスレッドなど。usleep と session_write_close で影響を最小限に抑えます。
繰り返しになりますが、何百人ものアクティブ ユーザーに対して PHP ロング ポーリングを設定した実際の経験がある人はいますか? これをnode.js(経験なし)に移行することを本当に検討する必要がありますか?
前もって感謝します
トニー