2014-03-14 7 views
1

У меня есть запуск EventMachine, который прослушивает UDP-пакеты. Каждый раз, когда принимается UDP-пакет, я хотел бы переслать данные в базу данных с помощью вызова REST. Я создал подкласс EM :: Connection, в котором метод receive_data пересылает данные через вызов REST.Использование EventMachine для выполнения нескольких запросов с использованием одного и того же соединения?

Поскольку частота данных довольно высока, я хотел бы повторно использовать связь между запросами (используя «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 

Я думал сделать запрос объекта переменной класса, но я не думаю, это хорошая идея в контексте eventmachines. Или это?

ответ

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 
+0

ли что-то подобное, спасибо! –

Смежные вопросы