reliable-msg を IPv6 環境で動かすときの注意

ちょっと前にひっかかったので、備忘がてら載せておきます。
#あまりの暴風雨にしばし帰るのをためらってしまいました...


reliable-msg は ap4r でラップしているメッセージ永続化ライブラリです。ap4r を利用するときにもここでの注意点は同様に当てはまります。

  • reliable-msg を gem インストール

uuid も合わせてインストールされます。

kiwamu-imac% sudo gem install reliable-msg --include-dependencies
  • サーバをデフォルトの設定で起動

キューマネージャーと呼ばれる、メッセージの窓口を立てます。ここを経由してメッセージの出し入れを行います。dRuby の口は、localhost:6438 となります。
現状の reliable-msg は ローカルホストからのアクセスしか受け入れません。ちょっと書き換えれば、リモートホストからのアクセスも可能ですが、その話は別途。
ちなみに、reliable-msg はメッセージの永続化先にファイルとMySQLを選択できます。デフォルトでは disk (ファイル)です。

kiwamu-imac% pwd
/usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0
kiwamu-imac% ruby ./bin/queues manager start
Loaded queues configuration from:  /usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/queues.cfg
Using message store: disk
Accepting requests at: druby://localhost:6438

reliable-msg も uuid もファイルを生成するので、適当に緩くしておく必要があります。ちょっとここらへんが微妙...

  • クライアントからメッセージをキューに put

irb で以下のように簡単に試せます。ここでは "hoge" という文字列をメッセージとして "queue.test" という名のキューに put しています。

kiwamu-imac% irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'reliable-msg'
=> false
irb(main):004:0> queue = ReliableMsg::Queue.new "queue.test"
=> #<ReliableMsg::Queue:0x284be74 @queue="queue.test">
irb(main):005:0> queue.put "hoge"
  • ここでエラー発生...

いつもならここで問題なくメッセージがキューに put され、get で取り出すことも出来たのですが、エラーとなってしまいました。

connection closed
/usr/local/lib/ruby/1.8/drb/drb.rb:570:in `load'/usr/local/lib/ruby/1.8/drb/drb.rb:632:in `recv_reply'/usr/local/lib/ruby/1.8/drb/drb.rb:921:in `recv_reply'/usr/local/lib/ruby/1.8/drb/drb.rb:1195:in `send_message'/usr/local/lib/ruby/1.8/drb/drb.rb:1086:in `method_missing'/usr/local/lib/ruby/1.8/drb/drb.rb:1170:in `open'/usr/local/lib/ruby/1.8/drb/drb.rb:1085:in `method_missing'/usr/local/lib/ruby/1.8/drb/drb.rb:1103:in `with_friend'/usr/local/lib/ruby/1.8/drb/drb.rb:1084:in `method_missing'/usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/queue.rb:147:in `put'/usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/client.rb:128:in `call'/usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/client.rb:128:in `repeated'/usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/queue.rb:147:in `put'(irb):5:in `irb_binding'/usr/local/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'/usr/local/lib/ruby/site_ruby/1.8/rubygems/specification.rb:405
(・・・省略・・・)
connection closed
/usr/local/lib/ruby/1.8/drb/drb.rb:570:in `load'/usr/local/lib/ruby/1.8/drb/drb.rb:632:in `recv_reply'/usr/local/lib/ruby/1.8/drb/drb.rb:921:in `recv_reply'/usr/local/lib/ruby/1.8/drb/drb.rb:1195:in `send_message'/usr/local/lib/ruby/1.8/drb/drb.rb:1086:in `method_missing'/usr/local/lib/ruby/1.8/drb/drb.rb:1170:in `open'/usr/local/lib/ruby/1.8/drb/drb.rb:1085:in `method_missing'/usr/local/lib/ruby/1.8/drb/drb.rb:1103:in `with_friend'/usr/local/lib/ruby/1.8/drb/drb.rb:1084:in `method_missing'/usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/queue.rb:147:in `put'/usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/client.rb:128:in `call'/usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/client.rb:128:in `repeated'/usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/queue.rb:147:in `put'(irb):5:in `irb_binding'/usr/local/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'/usr/local/lib/ruby/site_ruby/1.8/rubygems/specification.rb:405
DRb::DRbConnError: connection closed
        from /usr/local/lib/ruby/1.8/drb/drb.rb:570:in `load'
        from /usr/local/lib/ruby/1.8/drb/drb.rb:632:in `recv_reply'
        from /usr/local/lib/ruby/1.8/drb/drb.rb:921:in `recv_reply'
        from /usr/local/lib/ruby/1.8/drb/drb.rb:1195:in `send_message'
        from /usr/local/lib/ruby/1.8/drb/drb.rb:1086:in `method_missing'
        from /usr/local/lib/ruby/1.8/drb/drb.rb:1170:in `open'
        from /usr/local/lib/ruby/1.8/drb/drb.rb:1085:in `method_missing'
        from /usr/local/lib/ruby/1.8/drb/drb.rb:1103:in `with_friend'
        from /usr/local/lib/ruby/1.8/drb/drb.rb:1084:in `method_missing'
        from /usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/queue.rb:147:in `put'
        from /usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/client.rb:128:in `call'
        from /usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/client.rb:128:in `repeated'
        from /usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/queue.rb:147:in `put'
        from (irb):5
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems/specification.rb:405
  • reliable-msg の設定ファイルを確認
kiwamu-imac% pwd
/usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0
kiwamu-imac% less queues.cfg

--- 
store:
  type: disk
  path: queues
drb: 
  port: 6438
  acl: allow 127.0.0.1

aclは、access controll list だったと思いますが、allow、deny に続けてIPアドレス/ホスト名を記述します。acl: allow 127.0.0.1 allow 10.0.0.0/8 deny 192.168.0.0/16 みたいな感じ。
たぶんこのあたりで何とかできそうな予感に期待しつつ、N/W をみてみます。

kiwamu-imac% netstat -a | grep 6438
tcp6       0      0  localhost.6438         *.*                    LISTEN
kiwamu-imac% netstat -an | grep 6438
tcp6       0      0  ::1.6438               *.*                    LISTEN

どうも IPv6 のほうでサーバが待ち受けしてるみたいです。
netstat の -a オプションは、全てのESTABLISHEDのコネクションと、接続可能な(受信待ちのListen状態にある)ポートを一覧表示します。また -n オプションは、ドメイン名をDNSサーバーに問い合わせず、IPアドレスとポート番号を名前ではなく数字で表示します。表示もこっちのほうが早いです。

  • 設定ファイルの修正

要は、IPv6 環境でローカルホストからの接続を許可したいわけなので、こんな感じでいけました。

kiwamu-imac% less queues.cfg

--- 
store: 
  type: disk
  path: queues
drb: 
  port: 6438
  acl: allow ::1
  # or acl: allow localhost
  • 実行結果

クライアント側はこんな感じです。uuid が発行されて put 完了、ついでに get してみました。

irb(main):005:0> q.put "hoge"
=> "26acac00-ad39-0129-ce9d-0016cb9ad524"
irb(main):006:0> q.get
=> #<ReliableMsg::Message:0x28499e4 @id="69bd2b10-ad01-0129-ce9b-0016cb9ad524", @headers={:priority=>0, :created=>1173069562, :expires=>nil, :delivery=>:best_effort, :max_deliveries=>5, :id=>"69bd2b10-ad01-0129-ce9b-0016cb9ad524"}, @object="hoge">

サーバ側では、UUID generator の初期化ログが見られます。

kiwamu-imac% ruby ./bin/queues manager start
Loaded queues configuration from: /usr/local/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/queues.cfg
Using message store: disk
Accepting requests at: druby://localhost:6438
uuid: Initialized UUID generator with sequence number 0xce9d and MAC address 00:16:cb:9a:d5:24


あ...まだ降ってるな。 (^^;