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
あ...まだ降ってるな。 (^^;