Использование 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
Другие вопросы по тегам