Giter Club home page Giter Club logo

krakow's Introduction

Krakow

"KRAKOW! KRAKOW! Two direct hits!"

Spiff

require 'krakow'

producer = Krakow::Producer.new(
  :host => 'HOST',
  :port => 'PORT',
  :topic => 'target'
)
producer.write('KRAKOW!', 'KRAKOW!')

Zargons

require 'krakow'

consumer = Krakow::Consumer.new(
  :nsqlookupd => 'http://HOST:PORT',
  :topic => 'target',
  :channel => 'ship'
)

consumer.queue.size # => 2
2.times do
  msg = consumer.queue.pop
  puts "Received: #{msg}"
  consumer.confirm(msg.message_id)
end

What is this?

It's a Ruby library for NSQ using Celluloid under the hood.

Information and FAQ that I totally made up

Max in flight for consumers is 1, regardless of number of producers

Yep, that's right. Just one lowly message at a time. And that's probably not what you want, so adjust it when you create your consumer instance.

require 'krakow'

consumer = Krakow::Consumer.new(
  :nsqlookupd => 'http://HOST:PORT',
  :topic => 'target',
  :channel => 'ship',
  :max_in_flight => 30
)

Clean up after yourself

Since Celluloid is in use under the hood, and the main interaction points are Actors (Consumer and Producer) you'll need to be sure you clean up. This simply means terminating the instance (since falling out of scope will not cause it to be garbage collected).

consumer = Krakow::Consumer.new(
  :nsqlookupd => 'http://HOST:PORT',
  :topic => 'target',
  :channel => 'ship',
  :max_in_flight => 30
)

# do stuff

consumer.terminate

Please make it shutup!

Sure:

Krakow::Utils::Logging.level = :warn # :debug / :info / :warn / :error / :fatal

Why is it forcing something called an "unready state"?

Because forcing starvation is mean. We don't want to be mean, so we'll ensure we are consuming from all registered connections.

I just want to connect to a producer, not a lookup service

Fine!

consumer = Krakow::Consumer.new(
  :host => 'HOST',
  :port => 'PORT',
  :topic => 'target',
  :channel => 'ship',
  :max_in_flight => 30
)

Great for testing, but you really should use the lookup service in the "real world"

Backoff support

NSQ has this backoff notion. It's pretty swell. Basically, if messages from a specific producer get re-queued (fail), then message consumption from that producer is halted, and slowly ramped back up. It gives time for downstream issues to work themselves out, if possible, instead of just keeping the firehose of gasoline on. Neat.

By default backoff support is disabled. It can be enabled by setting the :backoff_interval when constructing the Consumer. The interval is in seconds (and yes, floats are allowed for sub-second intervals):

consumer = Krakow::Consumer.new(
  :nsqlookupd => 'http://HOST:PORT',
  :topic => 'target',
  :channel => 'ship',
  :max_in_flight => 30,
  :backoff_interval => 1
)

I need TLS!

OK!

consumer = Krakow::Consumer.new(
  :nsqlookupd => 'http://HOST:PORT',
  :topic => 'target',
  :channel => 'ship',
  :connection_options => {
    :features => {
      :tls_v1 => true
    }
  }
)

I need Snappy compression!

OK!

consumer = Krakow::Consumer.new(
  :nsqlookupd => 'http://HOST:PORT',
  :topic => 'target',
  :channel => 'ship',
  :connection_options => {
    :features => {
      :snappy => true
    }
  }
)

NOTE: snappy support requires the snappy gem and is not provided by default, so you will need to ensure it is installed either on the system, or within the bundle.

I need Deflate compression!

OK!

consumer = Krakow::Consumer.new(
  :nsqlookupd => 'http://HOST:PORT',
  :topic => 'target',
  :channel => 'ship',
  :connection_options => {
    :features => {
      :deflate => true
    }
  }
)

I want to use TLS based authentication!

OK!

consumer = Krakow::Consumer.new(
  :nsqlookupd => 'http://HOST:PORT',
  :topic => 'target',
  :channel => 'ship',
  :connection_options => {
    :features => {
      :tls_v1 => true
    },
    :config => {
      :ssl_context => {
        :certificate => '/path/to/cert',
        :key => '/path/to/key'
      }
    }
  }
)

Running the tests

Run them all!

bundle exec ruby test/run.rb

Or, run part of them:

bundle exec ruby test/specs/consumer_spec.rb

NOTE: the specs expect that nsqd and nsqlookupd are available in $PATH

It doesn't work

Create an issue on the github repository

It doesn't do x

Create an issue, or even better, send a PR.

Info

Contributors

  • Pete Hopkins (@phopkins)
  • Sam Phillips (@i2amsam)
  • Brendan Schwartz (@bschwartz)
  • Thomas Holmes (@thomas-holmes)
  • Jeremy Hinegardner (@copiousfreetime)

krakow's People

Contributors

bschwartz avatar chrisroberts avatar copiousfreetime avatar georgicodes avatar thomas-holmes avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.