タグ

ブックマーク / frsyuki.hatenablog.com (38)

  • MessagePack IDL 仕様案 - Blog by Sadayuki Furuhashi

    先日のMessagePackハッカソンで議論した、MessagePack IDL の仕様についてまとめます。 実際のユースケースを元に、大規模な分散アプリケーションまでカバーできる実践的な仕様を目指しました。 基的な文法 IDLは、大きく分けて 型の定義 と サービスの定義 に分かれます。 型の定義では、RPCでやりとりしたりログに保存したりするメッセージの構造を定義します。この構造の定義から、各言語のクラス定義や、シリアライズ・デシリアライズを行うコードを生成したりするのが、IDL処理系の役割の一つです。 サービスの定義では、RPCのインタフェースを定義します。この定義からクライアントやサーバのコードを生成します。 コメント # これはコメント // これもコメント /* これもコメント /* ネストしても */ 良いではないか */ 名前空間 名前空間は、Javaではパッケージ名、C

    MessagePack IDL 仕様案 - Blog by Sadayuki Furuhashi
  • Amazon EC2 で手元のホストとファイルを共有する - Blog by Sadayuki Furuhashi

    Amazon EC2 はVMを好きなタイミングで好きなだけ使うことができるので、複数のサーバを使う分散システムの検証環境として非常に使いやすい*1。費用を計算してみても、自宅でクラスタを動かすことを考えれば、十分安く上がりそうである。 しかし、VMを起動するたびに環境を設定したり、新しいテストを実行するたびにファイルを配ったりするのは面倒なので、ファイルを共有したくなる。 通信の遅延がかなり大きいので、EC2上でssh越しにファイルを編集するのも少々つらい。 そこで、手元のホストとホームディレクトリを共有する。さらに、一度転送したデータはキャッシュさせる。 共有ホームディレクトリ環境の管理方法と組み合わせれば、便利に使えるに違いない。 戦略 ファイル共有には NFSv4 over ssh を使う。NFSv4はポート番号を1つしか使わない(portmapperも要らない)ので、ssh越しで使

    Amazon EC2 で手元のホストとファイルを共有する - Blog by Sadayuki Furuhashi
  • mplexでソースコードレベルメタプログラミング - Blog by Sadayuki Furuhashi

    Webアプリケーションを作るとき、HTMLを生成するテンプレートエンジンをよく使いますが、これはパラメータに応じて様々なコードを生成する自動生成ツールであると言えます。 mplexは、プログラムを生成するためのテンプレートエンジンです。 実は MessagePack-RPC for C++ の実装に使っています。似たような関数をたくさんオーバーロードするために活用しています。(そろそろ可変長templateを使いたいですねぇ) 昔はeRubyを使っていたのですが、HTML用のテンプレートエンジンはソースコードがあまりに読みにくくなるので自作しました。 mplexを使うと、普通のプログラムの中にRubyのコードを埋め込むことができます: // クラスを4つ生成 %4.times do |i| class Test[%i%] { public: %if i % 2 == 0 int even;

    mplexでソースコードレベルメタプログラミング - Blog by Sadayuki Furuhashi
    kgbu
    kgbu 2010/12/24
    C++のコードの中でRubyの記法でコード生成ができる、という話らしい。eRubyの記法とかだとvimの表示で文法エラーとなるのを回避しているらしい。C++のテンプレートを拡張してあげたくなる(違
  • Kyoto Tycoon に MessagePack-RPC をプラグインして Java から使う - Blog by Sadayuki Furuhashi

    Tokyo Cabinet を始めとする Tokyo シリーズの作者として知られる平林幹雄さんですが、Tokyo シリーズに続く新製品として、Kyoto シリーズがリリースされています。 Kyoto Tycoon(以下KT)は、ネットワーク経由で使えるデータベースサーバで、Tokyo Tyrantの後継製品に当たります*1。 KT は HTTP ベースのプロトコルで操作することができますが、別のプロトコルを追加することもできます。 実際に memcached プロトコルのプラグインが標準でバンドルされています。(memcachedプロトコルをKTにプラグインする) と言うわけで、KT を MessagePack-RPC で使えるようにするプラグインを書いてみました。github からダウンロードできます。 kt-msgpack kt-msgpack downloads MessagePac

    Kyoto Tycoon に MessagePack-RPC をプラグインして Java から使う - Blog by Sadayuki Furuhashi
    kgbu
    kgbu 2010/12/15
    これ、JRubyから使えないかしら、とか思うのであった。
  • MessagePack for Java 0.4 開発版リリース! - Blog by Sadayuki Furuhashi

    バイナリシリアライズ形式 MessagePack のJava版の最新版をリリースしました! 新しいAPIを大量に追加し、使い勝手が大幅に向上しています。 今回は開発版のリリースで、安定版のリリースはもう少し先になります。 こういうAPIの方が良いのではないか、ここの実装にバグがある、このコードはもっと最適化できる、こんな用途に使ってみた などなど、フィードバックをお待ちしていますm(_ _)m ここでは極めて重要な新機能である、 動的コード生成 optionalフィールド 動的型付けオブジェクト テンプレート について紹介します。 動的コード生成 リフレクションを使うと、クラスからメンバ変数の一覧を取得することができ、ユーザー定義のクラスをシリアライズ・デシリアライズできるようになります。これは非常に便利で、わざわざシリアライズ用のメソッドを自前で実装することなく、オブジェクトを渡すだけで

    MessagePack for Java 0.4 開発版リリース! - Blog by Sadayuki Furuhashi
    kgbu
    kgbu 2010/10/26
    動的コード生成でROMAの人がcontributeしてるのかー。これってJRubyとかScalaとかと組み合わせた場合、どんな使い勝手になるかしら<やれよ(JRubyはRuby版があるよな...)
  • WebSocketサーバライブラリ rev-websocket リリース - Blog by Sadayuki Furuhashi

    いま WebSocket がにわかに注目を集めているようです。 ブラウザとサーバの間でリアルタイムな双方向通信を実現する機能で、HTML5に追加された(される予定の)新しい仕様です。 このWebSocketを使うには、ブラウザ側のJavaScriptの記述だけでなく、サーバ側の実装も必要になります。 そこで、Rubyで使えるWebSocketのサーバライブラリ rev-websocket をリリースしました。 gemでインストールできます:gem install rev-websocket 早速、デモアプリケーションを作ってみました:シャウッたー *1 WebSocket を使ったチャットシステムに、ちょっとした演出を加えたシンプルなアプリケーションです。速くタイプするほど大きく表示されるという趣向です^^; WebSocket に対応しているブラウザは今のところ Safari と Chr

    WebSocketサーバライブラリ rev-websocket リリース - Blog by Sadayuki Furuhashi
  • kumofsから学ぶNot only SQLの技術 - Blog by Sadayuki Furuhashi

    NoSQLを知る〜kumofsから学ぶNot only SQL技術 と題して、Developers Summit 2010で発表しました。 twitterの#devsumi2010 kumofsを見る限りでは大変ご好評をいただいたようで、ひとまずほっとしています。 プレゼンテーションの資料を公開しました。内容はどれも同じですが、クリックで進むムービー版がオススメです。 クリックで進むムービー(クリック/矢印キーで進む) PDF Keynoteファイル(Keynote '09が必要) NoSQLを知るView more presentations from frsyuki. Consistent Hashingとdouble-hash-spaceアルゴリズムの紹介は、68ページ以降にあります。 第101回 カーネル読書会 2月25日に楽天タワーで行われるカーネル読書会でも、kumofs関連

    kgbu
    kgbu 2010/02/21
    kumofsのサーバ群から情報を集めてきて集計するサンプルコードがある。使ってみたくなる。
  • kumofsはなぜ落ちないか - Blog by Sadayuki Furuhashi

    前回は、kumofsはなぜスケールするかということについて紹介しました。その中で最後に、耐障害性もスケーラビリティにとって重要だーと述べました。 そこで今回は、kumofsはなぜ落ちないのか、なぜ耐障害性が高いと言えるのかーということについて紹介したいと思います。 分散システムはテストが難しいことに定評がありますが(たぶん^^;)、その中でも耐障害性の検証は最上級に困難な部類です。 耐障害性は実際のところ、アルゴリズムの設計以前に実装上のバグが大きく影響するので、設計上は耐障害性が高いと言っていても、実際に使ってみると良く止まるという話はありがちな話です。(個人で開発している場合など、開発リソースが小さい場合はなおさら) そのため耐障害性の高いシステムを実現するためには、実装しやすくバグが入り込みにくい設計も重要かなーと思います(もちろん、アルゴリズムも重要ですが)。 分散システムには複雑

    kumofsはなぜ落ちないか - Blog by Sadayuki Furuhashi
    kgbu
    kgbu 2010/02/09
    これくらいシンプルに説明できるシステムじゃないと、メンテナンスできなかろうなぁ。データの再配置にconsistent hashingを使うってのは、へー。
  • kumofsはなぜスケールするか - Blog by Sadayuki Furuhashi

    先日、分散Key-valueストア kumofs を公開しました。 多く方から反響とフィードバックをいただいています。ありがとうございます。 今回は、kumofs はなぜスケールするのか、なぜスケールすると言えるのかーということについて紹介したいと思います。 ところでスケーラビリティとは何か? スケーラビリティとは、利用者や仕事の増大に適応できる能力・度合い とされています(端的!)*1 。Scalability を日語にすると、拡張性 と訳されるようです。 ただ一口でスケーラビリティと言っても、様々な側面があります。ITシステムでは主には処理性能と運用に関することを指す場合が多いと思いますが*2、その中にも様々な側面があります。 なぜスケーラビリティが必要か スケーラビリティは システムなどが持つべき望ましい特性 であって、高いに越したことはありません。しかし、高いスケーラビリティはタ

    kumofsはなぜスケールするか - Blog by Sadayuki Furuhashi
  • 分散Key-Valueストア「kumofs」を公開しました! - Blog by Sadayuki Furuhashi

    分散Key-Valueストア kumofs を、日オープンソースソフトウェアとしてリリースしました! kumofs@SourceForge kumofs関連資料まとめ kumofsとは? kumofs(クモエフエス)は、実用性を重視した分散データストアです。レプリケーション機能を備え、一部のサーバーに障害が発生しても動作し続けます。単体でも高い性能を持ちながら、サーバーを追加することで読み・書き両方の性能が向上する特徴を持ち、低コストで極めて高速なストレージシステムを構築・運用できます。 kumofsの大きな特徴は、システムの構成の簡単に変更できる点です。システムを止めることなく、簡単な手順でサーバーを追加したり復旧したりできます。アプリケーションには一切影響を与えません。 またkumofsは、広く利用されている分散キャッシュシステムの「memcached」と互換性のあるプロトコルを実装

    分散Key-Valueストア「kumofs」を公開しました! - Blog by Sadayuki Furuhashi
    kgbu
    kgbu 2010/01/18
    使いこなせる時がくるかしら。scalableという方向ではなく、robustという方向で分散処理を使いたいケースはあるけどな。
  • 140行で作る分散リアルタイム検索エンジン(Twitter Streaming API対応) - 古橋貞之の日記

    マトモに使えるRPCライブラリ MessagePack-RPC for Ruby のバージョン 0.2.0 をリリースしました! 新たにコネクションプーリングの機能を追加しました。一度接続したコネクションを共有して使い回すことができます。コネクションを何度も張り直す負荷と遅延を削減でき、リソースの消費も抑えられます。 また、不意に切断されたコネクションを自動的に再接続する機能を導入し、信頼性を向上させています。 これを使って何か作ってみようと言うことで、twitterのリアルタイム検索エンジンを作ってみました。日語を検索できないなど機能は貧弱ですが、プログラム全体がわずか140行に収まっています(クローラ27行、インデクサ48行、クラスタ管理ノード37行、検索クライアント28行)。 新しいつぶやきを受信するたびに、リアルタイムで転置インデックスを作成していきます。インデックスを作成するノ

    140行で作る分散リアルタイム検索エンジン(Twitter Streaming API対応) - 古橋貞之の日記
    kgbu
    kgbu 2009/12/07
    コネクションpoolingの機能のデモ
  • 『クラウドの技術』 - Blog by Sadayuki Furuhashi

    さんや首藤さんにお誘いいただいて、コラムの執筆を担当させていただきました。 内容はkumofsについて、特に全体のアーキテクチャと耐障害性についての技術解説です。 『クラウドの技術』は、クラウド関連の要素技術について丁寧にまとめられていることが人気を呼んだ末に、今では入手困難となってしまったという噂の UNIX Magazine 2009年 4月号 の特集を再編集し、さらに多くの新しい記事を加えたものになっています。 目次は以下の通りです: [最新・クラウドプレイヤーたちのサービス] ・Windows Azureの世界(丸山不二夫) ・Windows Azure Tableの概要(丸山不二夫) ・Google App Engine(中田秀基) ・Amazon Web Services(浦直彦) ・Amazon Web Servicesを取り巻く技術とサービス(浦直彦) ・富士通のト

    『クラウドの技術』 - Blog by Sadayuki Furuhashi
    kgbu
    kgbu 2009/11/08
    現在流行りのcloudの技術が現実に必要になるかどうか、と、RDBMSの首尾一貫性を自前で担保するコスト、サーバ単体でのパフォーマンス低下の可能性などを考慮した場合引き合うかよく考えてみようという話。仮想化もそう
  • PFIインターンに行ってきました。 - Blog by Sadayuki Furuhashi

    8月1日から8月31日までの1ヶ月間、PFI夏期インターンに行ってきました。 はてなインターンの 講義・課題・チーム 形式とは趣を異にして、個々人が何か1つのプロジェクトに取り組む方針で進みました。取り組むテーマは 新たに取り組みたい/今取り組んでいる 内容を前提に、既存の問題の中から近いテーマを見つけます(あるいはこじつける^^;)。 インターンの期間中の1ヶ月か2ヶ月の間に成果を出すのが目標! 取り組むテーマはスムーズに決まりました。何か自社で製品を作っていれば普通かと思いますが、探せば問題はいくらでもあるモノです^^ ちなみにPFIの製品は、全文検索エンジンやレコメンドエンジンなどです。 私は以下の4つのプログラムを実装しました: 既存の実装に代わるRPCフレームワーク MessagePack-RPC for PFI クラスタ管理ツール clx プロセス管理ユーティリティ daemo

    PFIインターンに行ってきました。 - Blog by Sadayuki Furuhashi
    kgbu
    kgbu 2009/09/09
    お手の物の素材なんだろうけど、夏休みの宿題としては豪華すぎ。MessagePack RPC, クラスタ管理ツール, daemontoolsの管理版, key-value storeのwrapper。自分には猫に小判だなw
  • Sun は Oracle に買収されますが - Blog by Sadayuki Furuhashi

    Oracle Buys Sun Overview and Frequently Asked Questions OpenSolaris.orgで進められている数々のプロジェクトは、ぜひ継続して欲しいものです。 "Sun" を偲びつつ。 Hadoop Live CD 仮想サーバー(Solaris Zone)を立ち上げて3ノードのHadoopクラスタを構築する Live CD。もちろんOSはOpenSolaris。 Hadoopを使ったアプリケーションの開発を始めるのにちょうど良さそうです。 Live CD と言えば、知る人ぞ知るBusyboxと同等のものをOpenSolarisでも実装しようというプロジェクトがあるようです: OpenSolaris Busybox OpenSolaris Squashfs Open High Availability Cluster Linuxで言うところの

    Sun は Oracle に買収されますが - Blog by Sadayuki Furuhashi
    kgbu
    kgbu 2009/04/21
    SunのOpen sourceプロジェクトの数々...
  • memcachedプロトコルを使った非同期通知サーバー - Blog by Sadayuki Furuhashi

    アプリケーションA:keyXをgetする アプリケーションA:getが待たされる アプリケーションB:keyXにvalueXをセットする アプリケーションA:getが帰り、valueXを取得できる このように非同期に通知する機構をmemcachedプロトコルを使って汎用的に利用することができます。 インストール ソースコードはCodeReposにあります:lang/ruby/lkserver $ svn co http://svn.coderepos.org/share/lang/ruby/lkserver $ cd lkserver # memcachedテキストプロトコルのパーサーをコンパイル $ ruby extconf.rb $ make # Rev(イベント駆動IOライブラリ)をインストール $ gem install rev # 11511/tcpで起動 $ ruby lkse

    memcachedプロトコルを使った非同期通知サーバー - Blog by Sadayuki Furuhashi
    kgbu
    kgbu 2009/02/26
    HTTPならばcometですが。memcachedプロトコルを使ってみました、ってことかな。
  • Key Value Store勉強会に行ってきました by kumofsのひと - Blog by Sadayuki Furuhashi

    ※分散Key-Valueストア「kumofs」を公開しました! 先日開催されたKey Value Store勉強会に行ってきました。私の発表資料は↓ここからダウンロードできます。 kvs-kumofs.pdf 合わせて読むと理解が深まるかもしれない: スマートな分散で快適キャッシュライフ - mixi Engineer's Blog:Consistent Hashについて バイナリシリアライズ形式「MessagePack」:kumofsのプロトコル。高速なストリームバッファとストリームデシリアライザの実装も含まれています。 Protocol Buffersは遅い:MessagePackのベンチマークとProtocol Buffersとの比較。タイトルは釣り。 memstored:IOアーキテクチャのプロトタイピング マルチコア時代の高並列性IOアーキテクチャ Wavy memcached

    Key Value Store勉強会に行ってきました by kumofsのひと - Blog by Sadayuki Furuhashi
    kgbu
    kgbu 2009/02/25
    現在のhardware構成+serialな処理でenough、もしくは別の場所がボトルネックというケースってのは確かにあると思う。そうでない領域も。
  • Ruby Rev + MessagePack による分散プログラム - Blog by Sadayuki Furuhashi

    ネットワークプログラミングで面倒なのが、通信相手にバイト列しか送れないためプロトコルをシリアライズ方法から考えないといけないかったり、複数のクライアントに対応しようとするとスレッドやらイベント駆動やらを考えないといけないところで、なかなか質的なロジックの実装に手を付けられずもどかしくなります。 そのあたりの面倒な部分をまとめて良きに計らってくれるRPCライブラリを作っておくと良さそうです。 とはいえ、RPCレイヤーはネットワークプログラミングの中でも速度と信頼性に大きく影響する部分でもあります。実装を丸々隠蔽されてしまうと、後になってカスタマイズできずに困ったことになるかもしれません。 最初のプロトタイピングとして簡単に使えるが、カスタマイズも効くような柔軟性が欲しいところです。 そこでRubyの高速なイベント駆動IOライブラリであるRevと、バイナリベースのシリアライズ形式であるMes

    Ruby Rev + MessagePack による分散プログラム - Blog by Sadayuki Furuhashi
  • マルチコア時代の高並列性IOアーキテクチャ Wavy - Blog by Sadayuki Furuhashi

    シングルスレッドではもう遅い。 以前にマルチコア時代の高速サーバーの実装で、「ネットワークIOはマルチスレッドで動かすが、その他の部分はシングルスレッドで動かす」というIOアーキテクチャの実装(mp::iothreads)を紹介しました。iothreadsはロジック部分をシングルスレッドで書けるため実装の手間を抑えることができ、ネットワークIOがボトルネックになるプログラムには特に適していると思われます。 しかし実際にiothreadsを使ってプログラムを書いてみると、非常に負荷が高い状況でシングルスレッドの部分の処理速度がボトルネックになってしまうことがありました。 そこでマルチコアCPUの性能を引き出すために、徹頭徹尾マルチスレッドで動かすIOアーキテクチャを実装してみました。 1つのスレッドが、ある時はepoll_wait()し、ある時はread(2)を行い、ある時はイベントを処理す

    マルチコア時代の高並列性IOアーキテクチャ Wavy - Blog by Sadayuki Furuhashi
    kgbu
    kgbu 2009/02/03
    async i/oを使ってみたからこその「ロジックがシングルスレッドだときびしいケースがある」という感想は貴重だ。で、今回は徹頭徹尾マルチスレッドでどうなるかという話。
  • マルチコア時代の高速サーバーの実装 - Blog by Sadayuki Furuhashi

    特にサーバー用途では、CPUがシングルコアに戻ってくることは考えにくい。 マルチコアCPUの性能を活かすにはマルチスレッドに対応したサーバーの実装が必要になるわけですが、マルチスレッドなプログラミングは往々にして「高負荷になると固まる」とか「たまに落ちる」といった悩ましいバグと戦わなければならず、イヤです。 かといってシングルスレッドでは、近い将来 32コアCPU! などが出てきたとき、たぶん性能を発揮できません。 そこで、そこそこデバッグしやすく、それでいて多コアCPUでもスケールするという落としどころを模索しているのですが、ボトルネックはネットワークIO周りにあるだろう*1という前提の元で、ネットワークIO部分だけをマルチスレッドで動かし、それ以外の部分をシングルスレッドで動かすというアーキテクチャを考えています。 ロジックの部分はマルチスレッドで書いても共有リソースにアクセスする度に

    マルチコア時代の高速サーバーの実装 - Blog by Sadayuki Furuhashi
    kgbu
    kgbu 2009/02/03
    ロジックはシングルスレッド。IOはマルチスレッドという落としどころらしい。ロックを使うならそうかも。
  • memcachedバイナリプロトコルは同期プロトコルを禁止するべき - Blog by Sadayuki Furuhashi

    現状のmemcachedのバイナリプロトコルのクライアント(=libmemcached)は、リクエストの順番通りにレスポンスが返ってくることを期待しており、これはmemcachedバイナリプロトコルを「汎用的なkey-valueベースの分散ストレージのためのプロトコル」として考えると、ひどい実装である。 そのような実装は最適化の余地を大幅に制限してしまい、性能とスケーラビリティが悪化する。memcachedの仕様書は、そのようなクライアントの実装はバグであると明示するべきである。 現状のmemcachedクライアントの実装の問題点と、その解決策について述べる。 同期プロトコルと非同期プロトコル ネットワークプロトコルは以下の2つの種類に分けられる: 同期プロトコル リクエストの順番通りにレスポンスを返す(リクエストの順番とレスポンスの順番が同期している) 非同期プロトコル リクエストした順

    memcachedバイナリプロトコルは同期プロトコルを禁止するべき - Blog by Sadayuki Furuhashi
    kgbu
    kgbu 2008/11/25
    シーケンスナンバーをつければいいというのは嘘じゃないが、番号がついてないなら同期を仮定するのは自然かもな。そのあたりに落ち着くかなぁ。一方、どんなときに本当に早くなるか?それも検証しないとな。