使用EventMachine使用相同的连接发出多个请求?

时间:2014-03-14 15:01:57

标签: ruby udp eventmachine em-http-request

我正在运行正在侦听UDP数据包的EventMachine。每次收到UDP数据包时,我都希望使用REST调用将数据转发到某个数据库。我创建了一个EM :: Connection子类,其中receive_data方法通过REST调用转发数据。

由于数据的频率非常高,我想重用请求之间的连接(使用" keep-alive"),如果可能的话也使用流水线技术。什么是分享不同电话之间联系的好方法?

目前我的UDPHandler类似于以下内容:

module Udp
  module Collector
    class UDPHandler < EM::Connection
      def receive_data(data)
        http = EventMachine::HttpRequest.new('http://databaseurl.com/').post body: data
      end
    end
  end
end

此类的调用如下:

EM.run do
  EM.open_datagram_socket('0.0.0.0', 9000, Udp::Collector::UDPHandler)
end

我想过让请求对象成为一个类变量,但我不认为在事件机器的上下文中这是一个好主意。或者是吗?

1 个答案:

答案 0 :(得分:2)

我相信这样的事情应该有用

module Udp
  module Collector
    class UDPHandler < EM::Connection
      def http_connection
        @http_connection ||= EventMachine::HttpRequest.new('http://databaseurl.com/')
      end

      def receive_data(data)
        http = http_connection.post body: data, keepalive: true
      end
    end
  end
end

但是你不能以这种方式执行并行请求,所以你需要使用某种连接池。

最简单的没有排队和其他东西的是:

module Udp
  module Collector
    class UDPHandler < EM::Connection
      def connection_pool
        @connection_pool ||= []
      end

      def get_connection
        conn = connection_pool.shift
        conn ||= EventMachine::HttpRequest.new('http://databaseurl.com/')
        conn
      end

      def receive_data(data)
        conn = get_connection
        request = conn.post body: data, keepalive: true
        request.callback do
          connection_pool << conn
        end
      end
    end
  end
end