MemCache-clientラッパークラス案
とりあえず複数のサーバーと接続しているときにサーバーの切断を自動検出してくれないので(memcache-client 1.5.0の場合)、ラッパークラス案を考えてみた。
とりあえず最低限のメソッド(入れると出すだけ)を入れてテスト。
require "rubygems" require "memcache" class AdvMemCached class AdvMemCachedError < StandardError; end attr_accessor :server_num def initialize(*args) args[1] = {} if nil == args[1] @mem = MemCache.new(args[0],args[1]) @server_num = @mem.servers.size end def get(key) begin return @mem.get(key) rescue MemCache::MemCacheError self.re_connection self.get(key) end end alias get def set(key,value) begin @mem[key] = value rescue MemCache::MemCacheError self.re_connection self.set(key,value) end end def =(key,value) self.set(key,value) end def re_connection doc = @mem.servers.find_all{|sv| true == sv.alive?} #もう接続先が無い if 0 == doc.size raise AdvMemCachedError,"No MemCached Server is Alive" else @server_num = doc.size end @mem.servers = [] doc.each do |i| @mem.servers << i end end end
これで昨日のバグ対応も組み込んだ形でラッパークラスの元になるかな。
require "./admemcache.rb" cache = AdvMemCached.new(["192.168.0.1","192.168.0.2"]) while(true) do ran = rand(99999).to_s cache["data"+ran] = 22 p cache.server_num end
このサンプルを走らせてテストすると途中でmemcachedサーバーを停止させるとserver_numの数が変更になるもののそのままがんばって継続しているのが見える。
0個になるとraiseがあがってくるのでそこで止まる算段。
まあ、これで個数が変化したときにログでも出力できる機能をつけておけば十分か。もうちょい拡張して自分用に置いておこう。そのうち使うこともあるだろう。