見知らぬ人のチャットシステム

4616 ワード

先日突然、北郵人フォーラムに見知らぬ人のチャットシステムが現れたのを見て(ほとんど人がいませんが^^)、フォロー者フォーラムのレスは北郵人フォーラムでこのシステムをオンラインにした人からの投稿を見て、大体の設計構想はサーバー側でMemcachedデーモンを実行して、クライアントのためにphpあるいはjsを使ってインタフェースプログラムを編纂することです.后でbalabalaができるようになりました.....
まずMemcachedについての紹介です.
Memcachedって何?Memcachedは、データベース負荷を軽減するための動的Webアプリケーション用の高性能分散メモリオブジェクトキャッシュシステムです.メモリにデータとオブジェクトをキャッシュすることで、データベースの読み取り回数を減らし、動的でデータベースがWebサイトを駆動する速度を提供します.Memcachedは、1つのストレージキー/値ペアのhashmapに基づいている.そのデーモンプロセス(daemon)はCで書かれていますが、クライアントは任意の言語で記述し、memcachedプロトコルを介してデーモンプロセスと通信することができます.しかし、冗長性は提供されません(例えば、hashmapエントリをコピーします).あるサーバSが停止またはクラッシュすると、Sに格納されているすべてのキー/値ペアが失われる.MemcachedはDanga Interactiveによって開発され、LiveJournalを向上させる.comアクセス速度の.LJは毎秒数千回の動的ページアクセスを行い、ユーザーは700万人である.Memcachedはデータベースの負荷を大幅に低減し、リソースの割り当てをよりよくし、より迅速にアクセスします.
memcached-Serverエンドの使用方法サービス側で実行:#./memcached-d-m 2048-l 10.0.0.40-p 11211これは、2 Gメモリを占有するプロセスを開始し、要求を受信するために11211ポートを開く.32ビットシステムは4 Gメモリのアドレスしか処理できないため、4 Gメモリより大きいPAEを使用する32ビットサーバで2~3個のプロセスを実行し、異なるポートで傍受することができます.
memcached-Clientエンドの使用方法アプリケーション側にClientを記述するためのClassが含まれていれば、直接使用することができ、非常に簡単です.  PHP Example:  $options["servers"] = array("192.168.1.41:11211", "192.168.1.42:11212");  $options["debug"] = false;  $memc = new MemCachedClient($options);  $myarr = array("one","two", 3);  $memc->set("key_one", $myarr);  $val = $memc->get("key_one");  print $val[0]."/n";//prints 'one‘  print $val[1]."/n";//prints 'two‘  print $val[2]."/n";//prints 3はmemcachedのWebサイトのプレゼンテーションを採用しています.http://blog.lyxcf.com/5864.lyxcf
次は北郵兄たちの経験紹介です.
詳細:http://xw2423.byr.edu.cn/blog/archives/709
ついにこのシステムは一段落することができて、ここ数日の仕事を急いで、各種の仕事を棚上げして、毅然としてこのシステムをオンラインにして、リンクhttp://bbs.byr.cn/chat .このomegleのようなものを作るのは、memcachedの使用に慣れたいだけです.以下はシステムの考え方を少し説明します.
まずインタラクティブな方式の確定で、今のweb技術のレベルで、このようなwebオンラインチャットシステムはやはり定期的なポーリングを技術の出発点として選びます.html 5に基づくwebsocket長接続は最近いくつかの文章ですが、私が見たdemoはまだありません.また、フォーラムの訪問の大部分はieブラウザなので、このような新しい技術を使うことはできません.
次にデータのストレージです.もちろん私は最初にmemcachedを使うためにこのシステムを作りました.もちろんmemcachedもこのような短時間で高同時の読み書きに適しています.実際には、従来のリレーショナル・データベースとNoSqlのデータベースを書くことも考えられています.実際にはデータベースを使用することもできますが、期限切れの検出など、多くの操作を行う必要があります.Webベースのチャットシステムは受動的な断線に対して捉えられないため、心拍数のないユーザーをタイムリーに蹴る必要があります.キャッシュ・システムを使用すると、この問題をうまく解決できますが、データベースではデータの期限切れを自分で維持する必要があります.ここでは、2つの異なるデータベースには本質的な違いがあり、memcachedとnosqlはデータの格納に対して本質的に同じであるか、memcachedもnosqlの1つに分類することができる.このようなデータベースは、リレーショナル・データベースに比べて条件クエリーで困っているので、データを維持するだけでなく、データのインデックスを維持する必要があります.これも私が書く過程で徐々に発見しました(nosqlの開発をしたことがありません).実はmysqlのメモリテーブルでこのアプリケーションを作るのも、いい選択だと思います.
技術案が確定するとデータ構造であり、kvシステムであるため、自分でデータのインデックスを維持して検索のために使用しなければならない.各チャットのユーザーはUUIDとして対応するuidを持っており、各ユーザーのデータはmemcachedに記録されている.すなわち、対応するユーザーオブジェクトのシーケンス化値である.ユーザーのデータには
uid:       id

id: id

cuid: uid

lat:last access time

status:

action:

queue:

その後、システム全体はステータスマシンにほかならず、異なるリクエストに応じて異なるステータスにジャンプします.ここでメッセージの伝達について述べると、ユーザはメッセージを送信してまず自分のqueueに格納し、見知らぬ人はポーリングし、queueにメッセージがある場合は取り戻してqueue配列を空にすることで、ユーザメッセージも長時間蓄積されず、システムもユーザチャット記録を保存しない.
残りは何も言うことはありませんが、いくつかのjsのインタラクションで、自分のjsもとても寒くて、少し惨めで見るに忍びないほど書いています.このシステムはしばらくこのようにしましょう.メンテナンスする時間もあまりありません.これからもっとよくできる人がいることを望んでいます.以下memcachedのインストールについて記録します
memcachedは、公式サイトでソースパッケージ、すなわちサーバ側を直接ダウンロードすればよい.アドレスは次のとおりです.http://memcached.org/解凍後1 #./configure --prefix=/usr/local/memcached 2 #make 3 #sudo make install
注意すべきはmemcachedはlibeventのサポートが必要で、なければconfigureが間違っています.これは直接ソースで見つけることができます.libevent-develをインストールすればいいです.memcachedの使用方法は簡単にbinの下のmemcachedを直接実行すればいいです.-hオプションには詳細なパラメータの説明があります.私の実行パラメータは:
memcached -d -m 128 -u root -p XXXX -c 256  -v

一般的にはrootユーザーで実行されており、memcachedがネットワーク全体を傍受しているとACLのメカニズムがないため、マシンmemcachedのポートを知っていれば直接通信できることを意味し、安全に欠ける行為のようだ.ネット上にも多くの解決方法があります.例えば、イントラネットの方法でmemcachedサーバがイントラネットの中にあり、これにより、イントラネットのユーザーがアクセスできなくなります.もちろんunixで最も直接的な方法はiptablesでipアクセス指定ポートを指定することです.
memcachedのクライアントでは、言語によって実装が異なります.phpにはmemcacheとmemcachedを選択する2つのクライアントがあり、後者は前者よりも機能がやや多かった.私が使っているのは前者で、http://pecl.php.net/package/memcacheインストールパッケージをダウンロードし、解凍した後1 #phpize 2 #./configure --enable-memcache 3 #make
コンパイルしたsoファイルをphp.iniにロードすればよい