1

我有一个正在运行的 EventMachine 正在侦听 UDP 数据包。每次收到 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

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

4

1 回答 1

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
于 2014-03-28T10:44:41.867 回答