バイナリシリアライズ形式MessagePackのバージョン0.3.0をリリースしました。C API が大幅に充実、ストリームデシリアライザとメモリゾーンの効率化など。MessagePackのプロジェクトページができました:http://msgpack.sourceforge.jp/ シリアライズフォー…
アプリケーションA:keyXをgetする アプリケーションA:getが待たされる アプリケーションB:keyXにvalueXをセットする アプリケーションA:getが帰り、valueXを取得できる このように非同期に通知する機構をmemcachedプロトコルを使って汎用的に利用するこ…
マルチスレッドプログラミングでよく使うBlockingQueueをmemcachedプロトコルを使ってネットワーク越しに使うことができるサーバーを実装してみました。 タスクをガンガンpushしていく一方で、ワーカースレッドならぬワーカーサーバーが1つずつpopして処理し…
bash-4.0がリリースされたので早速試す。 $ sudo port sync $ sudo port deactivate readline $ sudo port install bash $ bash NEWS CHANGES autocd ディレクトリ名を入力だけでcdする。 $ shopt -s autocd $ / cd / cdspell cdするときディレクトリ名をよ…
ネットワークプログラミングで面倒なのが、通信相手にバイト列しか送れないためプロトコルをシリアライズ方法から考えないといけないかったり、複数のクライアントに対応しようとするとスレッドやらイベント駆動やらを考えないといけないところで、なかなか…
※分散Key-Valueストア「kumofs」を公開しました! 先日開催されたKey Value Store勉強会に行ってきました。私の発表資料は↓ここからダウンロードできます。 kvs-kumofs.pdf 合わせて読むと理解が深まるかもしれない: スマートな分散で快適キャッシュライフ …
festivoice.netはブラウザから1クリックで専用のクライアントソフトウェアが起動して、簡単に音声チャットが始められます。この1クリックでアプリケーションを起動する仕組み - Java Web StartはJavaに標準で搭載されているので、大抵の環境でインストールす…
気軽に多人数の音声チャットが始められるサービスfestivoice.net(フェスティボイス)をオープンしました! festivoice.net festivoice.netの始め方 festivoiceはfestival(祭)とvoice(声)を組み合わせた造語です。ユーザー登録が不要で、誰でも簡単に始…
シングルスレッドではもう遅い。以前にマルチコア時代の高速サーバーの実装で、「ネットワークIOはマルチスレッドで動かすが、その他の部分はシングルスレッドで動かす」というIOアーキテクチャの実装(mp::iothreads)を紹介しました。iothreadsはロジック…
先日の高速ログフォーマットの提案を実際に実装してみました。 ログを MessagePack でシリアライズしてバイナリ形式で出力することで、生のバイト列をBase64などでエンコードしなくてもログに書き出せるようにし、また高速に解析できるようにしようというア…
バイナリ形式のログフォーマットが必要になったので(テキストだと生バイト列を出力できなくて困る。Base64はイヤ)、どうせならオレオレフォーマットではなく一般的に使えるフォーマットだといいなーと思いメモ。 最初の発想 改良1:定義ファイル(静的型付…
バイナリシリアライズ形式「MessagePack」がC#に移植されました! MessagePack C# 実装を作ってみた SUtils/Serialization 1.1.0 にて MessagePack, JSON 両方に対応してみた saiya++++++。 これでC、C++、Ruby、そしてC#の間で、相互に高速なオブジェクトの…
バイナリシリアライズ形式「MessagePack」のバージョン0.2.2をリリースしました。Ruby版で文字列をデシリアライズするとき、必ずしもコピーしなくなりました。文字列のデシリアライズが大幅に高速化しています。 また mswin32 版と mingw 版の ruby で Messa…
バイナリシリアライズ形式「MessagePack」のバージョン0.2.1をリリースしました。 Ruby:x86_64アーキテクチャでINT_MAXより大きいFixnumをシリアライズできなかったバグを修正 C++:msgpack::type::tuple がリファレンスをメンバに持つことができるようにな…
現状のmemcachedのバイナリプロトコルのクライアント(=libmemcached)は、リクエストの順番通りにレスポンスが返ってくることを期待しており、これはmemcachedバイナリプロトコルを「汎用的なkey-valueベースの分散ストレージのためのプロトコル」として考…
Google の Protocol Buffers は、同技術と競合するバイナリシリアライズ形式である MessagePack と比べて、場合によっては 19倍 以上遅く、シリアライズ後のデータサイズは 7倍 以上になることがあります。平均的に見ると MessagePack の方が高速であり、高…
バイナリシリアライズ形式 MessagePack の2回目のリリースです。 フォーマットの仕様はそのままで、C++用のAPIを大幅に強化しました。詳しくは:サンプルコード msgpack-0.2.0.tar.gz MessagePackとは MessagePackは効率を重視したデータ交換用のフォーマッ…
同じホストの異なるプロセスの間で、高速な通信を行いたいときがあります:fork() したプロセスと通信したい場合や、「アプリケーションたくさん → localhostのクライアントデーモン1つ → サーバー」という形で接続したい*1 *2 場合などなど。 あるいは共有…
pthread_系の関数は mutex か cond しか待てないが、select/poll/epoll はファイルディスクリプタしか待てないので、両方待ちたいときに困る。解決方法はいろいろあると思いますが、私の思いつく範囲では以下の4つ。 selectで待ち、シグナルで割り込む ファ…
今のところチラシの裏的な話。 ネットワークプロトコルは、 リクエストした順番通りにレスポンスを返す(リクエストの順番とレスポンスの順番が同期している) リクエストした順番通りにレスポンスが返ってくるとは限らない(リクエストの順番とレスポンスの…
1000行はテキトーなハッタリだが良くあること ;-) memstored の本体は memstored.cc ファイル1つに収まっており、その行数は600行程度しかない。memstored のポイントは、少ない行数で高速なサーバーをカンタンに書けたことであった。memstored の実装につ…
memstored は memcached のバイナリプロトコルをサポートしたハッシュストレージサーバーです。IO戦略ライブラリmpio の信頼性と性能をテストするために開発しました。IOに mp::iothreads を使用し、バックエンドには Tokyo Cabinet の抽象データベースAPIを…
バイナリシリアライズ形式「MessagePack」を活発に開発中です。C++版のAPIについてサンプルコードを交えつつ紹介してみます。※2009-03-01:この内容はもう古いです。最新のドキュメントを参照してください:http://msgpack.sourceforge.jp/ インストール方法…
先日memcached Night in Tokyo #1に参加してきました。レプリケーションがアツイ。バイナリプロトコルがアツイ。というわけでバイナリプロトコルのマイクロベンチマークをしてみました。 テストしたのは本家memcachedではなく、私が勝手に作ったストリームパ…
マルチコア時代の高速サーバーの実装で紹介したアーキテクチャを実装しようとすると、アーキテクチャ自体はマルチスレッドなので、ロックだ、メモリ管理だと、いろいろと面倒です。一般化できるなら一般化して、ロジック部分だけを書けば高速なサーバーが実…
※2009-03-01追記:ここの内容はもう古いです。最新のドキュメントを参照してください:http://msgpack.sourceforge.jp/cpp:doc 先日MessagePack for C++を紹介したのですが、やはり動的型とC++は合わないことが分かったので、動的型を使う方針はやめました。…
特にサーバー用途では、CPUがシングルコアに戻ってくることは考えにくい。マルチコアCPUの性能を活かすにはマルチスレッドに対応したサーバーの実装が必要になるわけですが、マルチスレッドなプログラミングは往々にして「高負荷になると固まる」とか「たま…
この記事はもう古いです。「MessagePack for C++ template版」を見てください。 バイナリシリアライズ形式「MessagePack」のC++版APIを開発しています。 Thriftなどのコードジェネレータを利用して静的なクラスを生成するものとは差別化を図り、IDLを記述し…
memcachedクライアントはほとんどの言語で実装されており、key-valueベースの何かを作るときにはmemcacheプロトコルをサポートしておくと、クライアントを実装する手間が省けるのでイケてます。しかしmemcachedのテキストプロトコルのような「行」が主体とな…
Googleが公開したバイナリエンコード手法であるProtocol Buffersは、クライアントとサーバーの両方でシリアライズ形式を取り決めておき(IDL)、双方がそれに従ってデータをやりとりするようにします。 この方法では高速なデータのやりとりができる反面、IDL…