[CouchApp][CouchDB] update notification のひな形と。

http://wiki.apache.org/couchdb/Regenerating_views_on_update

Wiki にあるのですが、マルチスレッドにしていたり、本質が見えにくいので、ひな形をメモ。

#!/usr/bin/env ruby
#
# /usr/local/share/couchdb/server/updater.rb 
#
require 'logger'

run = true
logger = Logger.new("/tmp/update_notification.log")
logger.info "Start CouchDB process"
while run do
   input = gets
   if input == nil
      run = false
   else
      logger.info input
   end
end 
logger.info "End CouchDB process"

要するに、stdin で待ち受けしなさいってこってす。CouchDBがkillされるときは、(まだErlangのコードみてないけど)シグナルハンドラが動いて、EOFとばしてくれるようになっているように見えます(のでgetsの結果がnilになっている)。

肝心の受け取れるメッセージなんですが、

I, [2009-06-12T02:01:20.354806 #23898]  INFO -- : {"type":"updated","db":"relax-reader-development"}

はい、{"type":"updated", "db":"{dbname}"} だけです。ので何が更新されたのかはよくわかりません、ってことで。ちなみにドキュメントを作成しようが削除しようが更新しようが、"type":"updated"はかわりません。

http://www.joeandmotorboat.com/2009/06/05/sending-couchdb-update-notifications-to-rabbitmq/ にはRabbitMQ (RubyのAMQP実装?) に転送する例が書かれていますが、更新されたドキュメントを転送するのではなく、更新通知を転送する。CouchDBからupdate notificationプロセスへの通知はErlangのPortでSTDIOをpipeしている(Portの理解が正しければ)だけなので、それじゃ物足りないよ!という場合は、Message Queue にとばせばいいんだと思います。

CouchApp からこのnotificationを登録する手段を探そうと思ったのですが、とりあえず、無理そうです。例によって、/_config/update_notification にGETすれば登録されているnotificationプロセスの起動パスはわかりますし、逆にここにPUTするか、/_config/update_notification/{name} に PUTすれば、リモートからでも登録できます。

ruby -e '...'

で登録すれば、HTTPで共有できると思うので、あとでやってみる。

ruby -e "$(curl http://localhost:5984/foo/_design/app/_attachments/bar.rb)"

でもいいかも。もう何が何だか、という気分になるかもしれませんが。