целлулоид-io или eventmachine с москитными петлями

Я создаю небольшую программу на ruby ​​для запуска соединения с сервером MQTT и подписки на канал. Я использую гем mosquitto, который является просто мостом для libmosquitto библиотека C.

Я создал очень простую реализацию программы, которая может работать с ruby my_prog.rb:

# Dependencies

require File.expand_path(File.join('..', 'environment'), __FILE__)


# MQTT Application

module Pulsr
    class MQTT
        attr_reader :host, :port, :alive

        def initialize(host = 'iot.eclipse.org', port = 1883, alive = 60)
            @client ||=  Mosquitto::Client.new SecureRandom.hex(8)

            Signal.trap(Signal.list.has_key?('INT') ? 'SIGINT' : 'SIGTERM') do
            @client.log 'Shutdown'
            shutdown
            end

            @host = host
            @port = port
            @alive = alive

            start
        end


        private

        def on_connect
            Proc.new { |return_code|
                @client.log "Connected RC #{return_code}"

                @client.subscribe(nil, '/pulsr', Mosquitto::EXACTLY_ONCE)
            }
        end

        def on_disconnect
            Proc.new { |return_code| @client.log "Disconnected RC #{return_code}" }
        end

        def on_subscribe
            Proc.new { |message_id, granted_qos| @client.log "Subscribed MID #{message_id} QoS #{granted_qos}" }
        end

        def on_unsubscribe
            Proc.new { |message_id| @client.log "Unsubscribed MID #{message_id}" }
        end

        def on_message
            Proc.new { |message| Pulsr::Workers::TrackingEvent.perform_async message.to_s }
        end

        def configure
            @client.logger = Logger.new(STDOUT)

            @client.on_connect &on_connect
            @client.on_disconnect &on_disconnect
            @client.on_subscribe &on_subscribe
            @client.on_unsubscribe &on_unsubscribe
            @client.on_message &on_message
        end

        def connect
            @client.connect_async(@host, @port, @alive)
        end

        def start
            @client.loop_start

            configure
            connect

            sleep
        end

        def shutdown
            @client.loop_stop(true)
            Process.exit
        end
    end
end


# MQTT Start

Pulsr::MQTT.new :host => 'iot.eclipse.org', :port => 1883, :alive => 60

Мне было интересно, хочу ли я использовать Celluloid или EventMachine чтобы запустить циклы, которые предоставляет гем mosquitto, как мне это сделать?

Gem mosquitto предоставляет хорошую документацию и представляет несколько методов цикла, которые можно используется, но я понятия не имею, с чего начать и как это сделать, я никогда не использовал EM или Celluloid.

Может ли кто-нибудь помочь начать с этим, я думаю, что это может принести некоторую пользу сообществу, и это может закончиться как проект с открытым исходным кодом, небольшое дополнение к драгоценному камню mosquitto?


person Roland    schedule 20.05.2014    source источник
comment
Итак, не имея опыта работы с EventMachine или MQTT, вот некоторые мысли. Независимо от того, что вам нужно, чтобы какой-то процесс работал на переднем плане, эффективно ожидая сообщений с вашего сервера. Я думаю, что выбор чего-то вроде EventMachine зависит от того, сможете ли вы распараллелить потребление сообщений из нескольких потоков темы. Если вы не можете, EventMachine мало что для вас сделает. Если вы можете, вам, вероятно, потребуется найти/или внедрить клиент, аналогичный адаптеру AMQP Gem для EventMachine, иначе вы заблокируете ввод-вывод: github.com/ruby-amqp/amqp. Зато звучит весело!   -  person jaysqrd    schedule 01.07.2014


Ответы (2)


Я думаю, это не так сложно. У Mosquitto хорошая библиотека.

Вам нужно подключить эти функции:

mosquitto_loop_misc() <-> EventMachine::PeriodicTimer.new
mosquitto_read() <-> EventMachine.watch
mosquitto_write() <-> EventMachine.watch
person jsaak    schedule 19.11.2014
comment
В mosquitto_write() есть особенность, которую вы либо пытаетесь периодически писать, либо есть выделенный сокет, за которым вы можете следить, mosquitto отправит на него байт, когда ему будет что написать(). Однако этот сокет не подвергается внешним функциям. - person jsaak; 16.02.2016

em-mqtt gem предоставляет реализацию протокола MQTT для eventmachine.
Для обработки сообщений используется чистая реализация ruby ​​mqtt для обработки сообщений, а не libmosquitto.

Если вам действительно нужно использовать реализацию libmosquitto для парсинга через mosquitto gem, то приведенное выше описание будет выполнено. Компонент eventmachine будет почти таким, какой он есть. Все обращения к специфичному для протокола модулю MQTT будут заменены эквивалентом в libmosquitto. Основная проблема заключается в том, что libmosquitto общедоступный API и последующие Ruby API скрывает все это в собственной сетевой реализации libmosquitto, которая заменяется на eventmachine , так что вам придется много хакать, чтобы открыть необходимые методы для Ruby, прежде чем вы сможете начать.

person Matt    schedule 26.08.2014
comment
Хотя ваш ответ имеет смысл, он не дает никакого примера того, как я мог бы реализовать то, что я прошу в посте. - person Roland; 26.08.2014