Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use a queue to wait for Puback packets rather than polling #120

Merged
merged 5 commits into from
Mar 9, 2020

Commits on Jan 27, 2020

  1. Use a queue to wait for Puback packets rather than polling

    This commit changes the `publish` method to use a queue to wait for
    Puback packets rather than polling a hash.  Every time the read loop
    gets data or a timeout from `IO.select`, it will send a message to
    everyone waiting for a `Puback` packet.  If the we're within the
    deadline, then the loop executes again, if we got a packet, we'll return
    the packet, and if we're outside the deadline, a `-1` is returned.
    
    This upside is that this patch speeds up the publish method by over
    100x.  Here is the benchmark:
    
    ```ruby
    require "securerandom"
    require "mqtt"
    require "benchmark/ips"
    require "stackprof"
    
    client = MQTT::Client.new(username: 'testuser', password: 'testpasswd', client_id: "client_#{SecureRandom.hex(10)}", host: '127.0.0.1')
    client.connect
    
    Benchmark.ips do |x|
      x.report("send message") {
        i = rand(1..10)
        topic = "to/timebox#{i}/cameras"
        msg = "message #{Time.now} for timebox#{i}"
        client.publish(topic, msg, true, 1)
      }
    end
    ```
    
    Before this patch:
    
    ```
    $ ruby -I lib thing.rb
    Warming up --------------------------------------
            send message     8.000  i/100ms
    Calculating -------------------------------------
            send message     85.042  (± 4.7%) i/s -    432.000  in   5.089261s
    ```
    
    After this patch:
    
    ```
    $ ruby -I lib thing.rb
    Warming up --------------------------------------
            send message   915.000  i/100ms
    Calculating -------------------------------------
            send message      9.453k (± 4.5%) i/s -     47.580k in   5.043716s
    ```
    
    The downside is that the timeout isn't exact.  Since `IO.select` times
    out every `0.5` seconds (according to the `SELECT_TIMEOUT` constant),
    the deadline in the `publish` method could be missed by that amount of
    time.
    
    Refs njh#115
    tenderlove committed Jan 27, 2020
    Configuration menu
    Copy the full SHA
    61c3703 View commit details
    Browse the repository at this point in the history
  2. fix Ruby 1.9

    tenderlove committed Jan 27, 2020
    Configuration menu
    Copy the full SHA
    aa25879 View commit details
    Browse the repository at this point in the history
  3. Configuration menu
    Copy the full SHA
    d162ae9 View commit details
    Browse the repository at this point in the history

Commits on Jan 28, 2020

  1. Added more recent rubies to test against

    Removed older rubies, no-longer in rvm
    njh committed Jan 28, 2020
    Configuration menu
    Copy the full SHA
    78410d4 View commit details
    Browse the repository at this point in the history
  2. fix Ruby 1.9

    tenderlove committed Jan 28, 2020
    Configuration menu
    Copy the full SHA
    a9dd5b8 View commit details
    Browse the repository at this point in the history