@twitterこの広告は、90日以上更新していないブログに表示しています。リリースしました!新たにコネクションプーリングの機能を追加しました。一度接続したコネクションを共有して使い回すことができます。コネクションを何度も張り直す負荷と遅延を削減でき、リソースの消費も抑えられます。不意に切断されたコネクションを自動的に再接続する機能を導入し、信頼性を向上させています。これを使って何か作ってみようと言うことで、twitterのリアルタイム検索エンジンを作ってみました。日本語を検索できないなど機能は貧弱ですが、プログラム全体がわずか140行に収まっています(クローラ27行、インデクサ48行、クラスタ管理ノード37行、検索クライアント28行)。新しいつぶやきを受信するたびに、リアルタイムで転置インデックスを作成していきます。インデックスを作成するノードを複数用意して負荷を分散させられるのがポイントです。転置インデックスを保存するストレージにはmemcachedプロトコルを使っています。Tyrant(最新版が必要^^)も使えます。Managerノードでクラスタ全体の構成情報を集約管理しているので、設定ファイルいらずで動的にクラスタを構築できます。使って、10万件のつぶやきについて転置インデックスを作成してみました。#{stat[:text]}"end特に変わったことはしておらず、新しいエントリを受信するごとに、ラウンドロビンで選択したIndexerノードに要求を投げているだけです。ライブラリが良きに計らってくれるのがポイントです。中でも「RPCセッション」が便利で、「コネクション」という概念が隠蔽されています。TCPを使って信頼性の高いネットワークプログラムを書こうとすると、プーリングしているコネクションが不意に切れたときにどうするか(どうやってコンテキストを維持したまま再接続するか)、connectのタイムアウトを待っている間に長時間スレッドが止まるのが許容できないなどの問題に悩まされます。そこで抽象度の高い「コネクション」という概念を隠蔽し、さらに高次の信頼性を確保するレイヤーを再構築する必要があります。リトライはいつ成功するかリトライと冪等性のデザインパターン月別アーカイブ検索はてなブログをはじめよう!viverさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。