我正在运行正在侦听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
我想过让请求对象成为一个类变量,但我不认为在事件机器的上下文中这是一个好主意。或者是吗?
答案 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