1

質問不足をお許しください。チャットルームと同じ機能を持つウェブサイトを構築しようとしています。各部屋 (数千の部屋) に 5 ~ 50 人の視聴者がいるという考えは非常に現実的で、部屋の約 1% だけがチャットします。

私はいくつかのアイデアを持っていましたが、私が思いついたものはすべて、途方もない量の処理能力を必要とするように思えます.これを行う効率的な方法は何ですか?

4

2 に答える 2

2

この目的のために設計された特定のプログラムがあります ( ircdhttp: //www.atheme.org/project/charybdis などを参照してください)。適切な量​​の物理 RAM、および共有メモリの拡張機能 (例: APC)。

共有メモリ機能 (この場合は APC) は、ハード ドライブが過剰にスピンアップしたり、MySQL が制御不能になったりすることなく、全員の会話を同期させる最速の方法です。MySQL に負担をかけないため、サーバーが汗をかくことなく、この方法で何百もの同時リクエストに対応できるはずです。RAMチップからほぼ直接読み取ります。

会話用の個々のチャネル (例: "channel-#welcome") をキー保存し、AJAX 経由で直接ポーリングできます。詳細についてapc_storeは、apc_addおよびapc_fetchを参照してください。

なんらかの理由で会話を MySQL に保存することになったとしても、データベース サーバーから多大な負荷を取り除くため、何らかの種類のメモリ キャッシングを使用して読み取りを行うことをお勧めします。

このようにする場合は、書き込み中にデータベースがロックされないため、データベースを innodb にすることをお勧めします。APC を使用すると、制限試薬は、RAM の量と、共有バッファーに保持する予定の会話の長さになります。

于 2012-07-11T04:57:43.603 に答える
1

あなたは非常に幅広い質問をしましたが、

各メッセージをデータベースに行として保存し、AJAX を使用してチャット ウィンドウの内容を最後のいくつかのメッセージでリロードします。

SELECT * FROM `chat_messages` WHERE `room_id` = 'ID' ORDER BY `id` DESC LIMIT 100

チャット ルームの最新の 100 件のメッセージを選択します。結果をループして、必要に応じてすべてのメッセージを表示します。

データベース ユーザーがテーブルを作成する権限を持っている場合は、チャット ルームごとにテーブルを動的に作成することもできます (これにより、パフォーマンスが大幅に向上します)。

次に、送信時にデータベースに新しい行を挿入するフォームにinputortextareaを入れるだけです (次にチャット ウィンドウがリロードされたときに全員に表示されます)。

別のより最適化された方法は、各メッセージのタイムスタンプをデータベースに保存し、最後のリクエストのタイムスタンプを JavaScript でローカルに保存することにより、クエリごとに新しいメッセージのみをユーザーに返すことです。次に、次のようなクエリを使用します。

SELECT * FROM `chat_messages` WHERE `room_id` = 'ID' AND `timestamp` > 'LAST_REQUEST' ORDER BY `id` DESC LIMIT 100

次に、結果を置き換えるのではなく、チャット ウィンドウに追加します。

于 2012-07-11T04:42:34.777 に答える