Использование EventMachine, чтобы сделать несколько запросов, используя одно и то же соединение?
У меня работает 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
Я думал о том, чтобы сделать объект запроса переменной класса, но я не думаю, что это хорошая идея в контексте событийных машин. Либо это?
1 ответ
Я считаю, что-то вроде этого должно работать
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