あ、さっきの嘘だ。
普通にラウンドロビン実装できた。
#!/usr/bin/env ruby
require 'rubygems'
require 'eventmachine'
class Backend < EM::Connection
def initialize(proxy)
@proxy = proxy
end
def receive_data(data)
@proxy.send_data(data)
end
end
class Proxy < EM::Connection
attr_accessor :backend
def receive_data(data)
@backend.send_data(data)
end
end
backends = [
['www.yahoo.co.jp', 80],
['www.hatena.ne.jp', 80],
]
EM.run do
EM.start_server('0.0.0.0', 80, Proxy) do |srv|
host, port = head = backends.shift
backends.push(head)
srv.backend = EM.connect(host, port, Backend, srv)
end
end
shell1> ruby lb.rb
shell2> for i in {1..5}; do wget -q -O- 127.0.0.1 | nkf | fgrep ''; done
はてな
Yahoo! JAPAN
はてな
Yahoo! JAPAN
はてな
shell2> for i in {1..5}; do wget -q -O- 127.0.0.1 | nkf | fgrep ''; done
Yahoo! JAPAN
はてな
Yahoo! JAPAN
はてな
Yahoo! JAPAN