nats 0.4.28 → 0.5.0.beta.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/HISTORY.md +16 -0
- data/README.md +8 -5
- data/bin/nats-queue +14 -5
- data/bin/nats-request +12 -3
- data/bin/nats-sub +13 -5
- data/lib/nats/client.rb +189 -35
- data/lib/nats/server.rb +27 -4
- data/lib/nats/server/cluster.rb +102 -0
- data/lib/nats/server/connection.rb +47 -17
- data/lib/nats/server/connz.rb +0 -2
- data/lib/nats/server/const.rb +14 -2
- data/lib/nats/server/options.rb +19 -2
- data/lib/nats/server/route.rb +279 -0
- data/lib/nats/server/server.rb +35 -10
- data/lib/nats/server/varz.rb +1 -0
- data/nats.gemspec +6 -4
- metadata +38 -26
    
        data/lib/nats/server/server.rb
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            require 'set'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module NATSD #:nodoc: all
         | 
| 2 4 |  | 
| 3 5 | 
             
              # Subscriber
         | 
| @@ -8,7 +10,7 @@ module NATSD #:nodoc: all | |
| 8 10 | 
             
                class << self
         | 
| 9 11 | 
             
                  attr_reader :id, :info, :log_time, :auth_required, :ssl_required, :debug_flag, :trace_flag, :syslog, :options
         | 
| 10 12 | 
             
                  attr_reader :max_payload, :max_pending, :max_control_line, :auth_timeout, :ssl_timeout, :ping_interval, :ping_max
         | 
| 11 | 
            -
                  attr_accessor :varz, :healthz, :max_connections, :num_connections, :in_msgs, :out_msgs, :in_bytes, :out_bytes
         | 
| 13 | 
            +
                  attr_accessor :varz, :healthz, :connections, :max_connections, :num_connections, :in_msgs, :out_msgs, :in_bytes, :out_bytes
         | 
| 12 14 |  | 
| 13 15 | 
             
                  alias auth_required? :auth_required
         | 
| 14 16 | 
             
                  alias ssl_required?  :ssl_required
         | 
| @@ -36,13 +38,16 @@ module NATSD #:nodoc: all | |
| 36 38 | 
             
                  def setup(argv)
         | 
| 37 39 | 
             
                    process_options(argv)
         | 
| 38 40 |  | 
| 39 | 
            -
                    @id, @cid = fast_uuid, 1
         | 
| 41 | 
            +
                    @id, @cid, @rid = fast_uuid, 1, 1
         | 
| 40 42 | 
             
                    @sublist = Sublist.new
         | 
| 41 43 |  | 
| 44 | 
            +
                    @connections = {}
         | 
| 42 45 | 
             
                    @num_connections = 0
         | 
| 43 46 | 
             
                    @in_msgs = @out_msgs = 0
         | 
| 44 47 | 
             
                    @in_bytes = @out_bytes = 0
         | 
| 45 48 |  | 
| 49 | 
            +
                    @num_routes = 0
         | 
| 50 | 
            +
             | 
| 46 51 | 
             
                    @info = {
         | 
| 47 52 | 
             
                      :server_id => Server.id,
         | 
| 48 53 | 
             
                      :host => host,
         | 
| @@ -62,6 +67,7 @@ module NATSD #:nodoc: all | |
| 62 67 | 
             
                        # These log messages visible to controlling TTY
         | 
| 63 68 | 
             
                        log "Starting #{NATSD::APP_NAME} version #{NATSD::VERSION} on port #{NATSD::Server.port}"
         | 
| 64 69 | 
             
                        log "Starting http monitor on port #{@options[:http_port]}" if @options[:http_port]
         | 
| 70 | 
            +
                        log "Starting routing on port #{@options[:cluster_port]}" if @options[:cluster_port]
         | 
| 65 71 | 
             
                        log "Switching to daemon mode"
         | 
| 66 72 | 
             
                      end
         | 
| 67 73 | 
             
                      opts = {
         | 
| @@ -85,12 +91,14 @@ module NATSD #:nodoc: all | |
| 85 91 | 
             
                    File.open(@options[:pid_file], 'w') { |f| f.puts "#{Process.pid}" } if @options[:pid_file]
         | 
| 86 92 | 
             
                  end
         | 
| 87 93 |  | 
| 88 | 
            -
                  def subscribe(sub)
         | 
| 94 | 
            +
                  def subscribe(sub, is_route=false)
         | 
| 89 95 | 
             
                    @sublist.insert(sub.subject, sub)
         | 
| 96 | 
            +
                    broadcast_sub_to_routes(sub) unless is_route
         | 
| 90 97 | 
             
                  end
         | 
| 91 98 |  | 
| 92 | 
            -
                  def unsubscribe(sub)
         | 
| 99 | 
            +
                  def unsubscribe(sub, is_route=false)
         | 
| 93 100 | 
             
                    @sublist.remove(sub.subject, sub)
         | 
| 101 | 
            +
                    broadcast_unsub_to_routes(sub) unless is_route
         | 
| 94 102 | 
             
                  end
         | 
| 95 103 |  | 
| 96 104 | 
             
                  def deliver_to_subscriber(sub, subject, reply, msg)
         | 
| @@ -119,7 +127,7 @@ module NATSD #:nodoc: all | |
| 119 127 | 
             
                    end
         | 
| 120 128 | 
             
                  end
         | 
| 121 129 |  | 
| 122 | 
            -
                  def route_to_subscribers(subject, reply, msg)
         | 
| 130 | 
            +
                  def route_to_subscribers(subject, reply, msg, is_route=false)
         | 
| 123 131 | 
             
                    qsubs = nil
         | 
| 124 132 |  | 
| 125 133 | 
             
                    # Allows nil reply to not have extra space
         | 
| @@ -129,15 +137,28 @@ module NATSD #:nodoc: all | |
| 129 137 | 
             
                    @in_msgs += 1
         | 
| 130 138 | 
             
                    @in_bytes += msg.bytesize unless msg.nil?
         | 
| 131 139 |  | 
| 140 | 
            +
                    # Routes
         | 
| 141 | 
            +
                    routes = nil
         | 
| 142 | 
            +
             | 
| 132 143 | 
             
                    @sublist.match(subject).each do |sub|
         | 
| 133 144 | 
             
                      # Skip anyone in the closing state
         | 
| 134 145 | 
             
                      next if sub.conn.closing
         | 
| 135 146 |  | 
| 136 | 
            -
                       | 
| 137 | 
            -
             | 
| 138 | 
            -
             | 
| 147 | 
            +
                      # Skip all routes if sourced from another route (1-hop semantics)
         | 
| 148 | 
            +
                      next if (is_route && sub.conn.is_route?)
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                      if sub[:qgroup].nil?
         | 
| 151 | 
            +
                        if sub.conn.is_route?
         | 
| 152 | 
            +
                          # Only send messages once over a given route
         | 
| 153 | 
            +
                          routes ||= Set.new
         | 
| 154 | 
            +
                          deliver_to_subscriber(sub, subject, reply, msg) unless routes.include?(sub.conn.remote_rid)
         | 
| 155 | 
            +
                          routes << sub.conn.remote_rid
         | 
| 156 | 
            +
                        else
         | 
| 157 | 
            +
                          deliver_to_subscriber(sub, subject, reply, msg)
         | 
| 158 | 
            +
                        end
         | 
| 159 | 
            +
                      elsif !is_route
         | 
| 139 160 | 
             
                        if NATSD::Server.trace_flag?
         | 
| 140 | 
            -
                          trace( | 
| 161 | 
            +
                          trace('Matched queue subscriber', sub[:subject], sub[:qgroup], sub[:sid], sub.conn.client_info)
         | 
| 141 162 | 
             
                        end
         | 
| 142 163 | 
             
                        # Queue this for post processing
         | 
| 143 164 | 
             
                        qsubs ||= Hash.new
         | 
| @@ -152,7 +173,7 @@ module NATSD #:nodoc: all | |
| 152 173 | 
             
                      # Randomly pick a subscriber from the group
         | 
| 153 174 | 
             
                      sub = subs[rand*subs.size]
         | 
| 154 175 | 
             
                      if NATSD::Server.trace_flag?
         | 
| 155 | 
            -
                        trace( | 
| 176 | 
            +
                        trace('Selected queue subscriber', sub[:subject], sub[:qgroup], sub[:sid], sub.conn.client_info)
         | 
| 156 177 | 
             
                      end
         | 
| 157 178 | 
             
                      deliver_to_subscriber(sub, subject, reply, msg)
         | 
| 158 179 | 
             
                    end
         | 
| @@ -167,6 +188,10 @@ module NATSD #:nodoc: all | |
| 167 188 | 
             
                    @cid += 1
         | 
| 168 189 | 
             
                  end
         | 
| 169 190 |  | 
| 191 | 
            +
                  def rid
         | 
| 192 | 
            +
                    @rid += 1
         | 
| 193 | 
            +
                  end
         | 
| 194 | 
            +
             | 
| 170 195 | 
             
                  def info_string
         | 
| 171 196 | 
             
                    @info.to_json
         | 
| 172 197 | 
             
                  end
         | 
    
        data/lib/nats/server/varz.rb
    CHANGED
    
    
    
        data/nats.gemspec
    CHANGED
    
    | @@ -16,10 +16,10 @@ spec = Gem::Specification.new do |s| | |
| 16 16 | 
             
              s.authors = ['Derek Collison']
         | 
| 17 17 | 
             
              s.email = ['derek.collison@gmail.com']
         | 
| 18 18 |  | 
| 19 | 
            -
              s.add_dependency('eventmachine', ' | 
| 20 | 
            -
              s.add_dependency('json_pure', '>= 1. | 
| 21 | 
            -
              s.add_dependency('daemons', '>= 1.1. | 
| 22 | 
            -
              s.add_dependency('thin', '>= 1. | 
| 19 | 
            +
              s.add_dependency('eventmachine', '>= 1.0.3')
         | 
| 20 | 
            +
              s.add_dependency('json_pure', '>= 1.8.0')
         | 
| 21 | 
            +
              s.add_dependency('daemons', '>= 1.1.9')
         | 
| 22 | 
            +
              s.add_dependency('thin', '>= 1.5.0')
         | 
| 23 23 |  | 
| 24 24 | 
             
              s.require_paths = ['lib']
         | 
| 25 25 | 
             
              s.bindir = 'bin'
         | 
| @@ -44,6 +44,8 @@ spec = Gem::Specification.new do |s| | |
| 44 44 | 
             
                lib/nats/server.rb
         | 
| 45 45 | 
             
                lib/nats/server/server.rb
         | 
| 46 46 | 
             
                lib/nats/server/connection.rb
         | 
| 47 | 
            +
                lib/nats/server/cluster.rb
         | 
| 48 | 
            +
                lib/nats/server/route.rb
         | 
| 47 49 | 
             
                lib/nats/server/options.rb
         | 
| 48 50 | 
             
                lib/nats/server/sublist.rb
         | 
| 49 51 | 
             
                lib/nats/server/const.rb
         | 
    
        metadata
    CHANGED
    
    | @@ -1,60 +1,71 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: nats
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 5 | 
            -
              prerelease: 
         | 
| 4 | 
            +
              version: 0.5.0.beta.12
         | 
| 6 5 | 
             
            platform: ruby
         | 
| 7 6 | 
             
            authors:
         | 
| 8 7 | 
             
            - Derek Collison
         | 
| 9 8 | 
             
            autorequire: 
         | 
| 10 9 | 
             
            bindir: bin
         | 
| 11 10 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 11 | 
            +
            date: 2013-10-02 00:00:00.000000000 Z
         | 
| 13 12 | 
             
            dependencies:
         | 
| 14 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 14 | 
             
              name: eventmachine
         | 
| 16 | 
            -
              requirement:  | 
| 17 | 
            -
                none: false
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 18 16 | 
             
                requirements:
         | 
| 19 | 
            -
                - -  | 
| 17 | 
            +
                - - ! '>='
         | 
| 20 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 21 | 
            -
                    version: 0. | 
| 19 | 
            +
                    version: 1.0.3
         | 
| 22 20 | 
             
              type: :runtime
         | 
| 23 21 | 
             
              prerelease: false
         | 
| 24 | 
            -
              version_requirements:  | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - ! '>='
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: 1.0.3
         | 
| 25 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 26 28 | 
             
              name: json_pure
         | 
| 27 | 
            -
              requirement:  | 
| 28 | 
            -
                none: false
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 29 30 | 
             
                requirements:
         | 
| 30 31 | 
             
                - - ! '>='
         | 
| 31 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 32 | 
            -
                    version: 1. | 
| 33 | 
            +
                    version: 1.8.0
         | 
| 33 34 | 
             
              type: :runtime
         | 
| 34 35 | 
             
              prerelease: false
         | 
| 35 | 
            -
              version_requirements:  | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - ! '>='
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: 1.8.0
         | 
| 36 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 37 42 | 
             
              name: daemons
         | 
| 38 | 
            -
              requirement:  | 
| 39 | 
            -
                none: false
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 40 44 | 
             
                requirements:
         | 
| 41 45 | 
             
                - - ! '>='
         | 
| 42 46 | 
             
                  - !ruby/object:Gem::Version
         | 
| 43 | 
            -
                    version: 1.1. | 
| 47 | 
            +
                    version: 1.1.9
         | 
| 44 48 | 
             
              type: :runtime
         | 
| 45 49 | 
             
              prerelease: false
         | 
| 46 | 
            -
              version_requirements:  | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - ! '>='
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: 1.1.9
         | 
| 47 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 48 56 | 
             
              name: thin
         | 
| 49 | 
            -
              requirement:  | 
| 50 | 
            -
                none: false
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 51 58 | 
             
                requirements:
         | 
| 52 59 | 
             
                - - ! '>='
         | 
| 53 60 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            -
                    version: 1. | 
| 61 | 
            +
                    version: 1.5.0
         | 
| 55 62 | 
             
              type: :runtime
         | 
| 56 63 | 
             
              prerelease: false
         | 
| 57 | 
            -
              version_requirements:  | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - ! '>='
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: 1.5.0
         | 
| 58 69 | 
             
            description: A lightweight cloud messaging system.
         | 
| 59 70 | 
             
            email:
         | 
| 60 71 | 
             
            - derek.collison@gmail.com
         | 
| @@ -86,6 +97,8 @@ files: | |
| 86 97 | 
             
            - lib/nats/server.rb
         | 
| 87 98 | 
             
            - lib/nats/server/server.rb
         | 
| 88 99 | 
             
            - lib/nats/server/connection.rb
         | 
| 100 | 
            +
            - lib/nats/server/cluster.rb
         | 
| 101 | 
            +
            - lib/nats/server/route.rb
         | 
| 89 102 | 
             
            - lib/nats/server/options.rb
         | 
| 90 103 | 
             
            - lib/nats/server/sublist.rb
         | 
| 91 104 | 
             
            - lib/nats/server/const.rb
         | 
| @@ -94,26 +107,25 @@ files: | |
| 94 107 | 
             
            - lib/nats/server/connz.rb
         | 
| 95 108 | 
             
            homepage: http://github.com/derekcollison/nats
         | 
| 96 109 | 
             
            licenses: []
         | 
| 110 | 
            +
            metadata: {}
         | 
| 97 111 | 
             
            post_install_message: 
         | 
| 98 112 | 
             
            rdoc_options: []
         | 
| 99 113 | 
             
            require_paths:
         | 
| 100 114 | 
             
            - lib
         | 
| 101 115 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 102 | 
            -
              none: false
         | 
| 103 116 | 
             
              requirements:
         | 
| 104 117 | 
             
              - - ! '>='
         | 
| 105 118 | 
             
                - !ruby/object:Gem::Version
         | 
| 106 119 | 
             
                  version: '0'
         | 
| 107 120 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 108 | 
            -
              none: false
         | 
| 109 121 | 
             
              requirements:
         | 
| 110 | 
            -
              - - ! ' | 
| 122 | 
            +
              - - ! '>'
         | 
| 111 123 | 
             
                - !ruby/object:Gem::Version
         | 
| 112 | 
            -
                  version:  | 
| 124 | 
            +
                  version: 1.3.1
         | 
| 113 125 | 
             
            requirements: []
         | 
| 114 126 | 
             
            rubyforge_project: 
         | 
| 115 | 
            -
            rubygems_version: 1. | 
| 127 | 
            +
            rubygems_version: 2.1.5
         | 
| 116 128 | 
             
            signing_key: 
         | 
| 117 | 
            -
            specification_version:  | 
| 129 | 
            +
            specification_version: 4
         | 
| 118 130 | 
             
            summary: A lightweight cloud messaging system.
         | 
| 119 131 | 
             
            test_files: []
         |