EventMachineで簡単なロードバランサーを書いてみた その2

あ、さっきの嘘だ。
普通にラウンドロビン実装できた。

#!/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 <title>はてな
Yahoo! JAPAN
はてな
Yahoo! JAPAN
はてな
shell2> for i in {1..5}; do wget -q -O- 127.0.0.1 | nkf | fgrep ''; done <title>Yahoo! JAPAN
はてな
Yahoo! JAPAN
はてな
Yahoo! JAPAN