RSwim

RSwim is a Ruby implementation of the SWIM gossip protocol, a mechanism for discovering new peers and getting updates about liveness of existing peers in a network.

It is an implementation inspired by the original SWIM: Scalable Weakly-consistent Infection-style Process Group Membership Protocol paper by Abhinandan Das, Indranil Gupta, Ashish Motivala.

The implementation is kept intentionally simple and includes only the features described in the paper along with a few additions after version 2.0.0:

  • The ability to piggyback custom state on the liveness propagation mechanism was added in version 2.0.0, see RSwim::Node#append_custom_state
  • Encryption of messsages between peers based on a shared secret was introduced in version 2.2.0, see module RSwim::Serialization::Encrypted

No attempts have been made to address known security issues such as Byzantine attacks.

Currently RSwim runs on UDP. In the unencrypted mode it uses a custom, human readable serialization format. Peers in unencrypted mode cannot communicate with peers in encrypted mode.

Installation

Add this line to your application's Gemfile:

gem 'rswim'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install rswim

Usage

To try out a small demo script, execute bin/run_node --help for more information.

Example:

  require 'rswim'

  RSwim.encrypted = true
  RSwim.shared_secret = 'santa 2000'

  port = 4545

  # known, running nodes to connect with initially.
  seed_hosts = ['192.168.1.42', '192.168.1.43']

  puts "Starting node"

  # Instantiate node, setting my_host to nil to auto detect host IP.
  node = RSwim::Node.udp(nil, seed_hosts, port)

  # Subscribe to updates
  node.subscribe do |host, status, custom_state|
    puts "Update: #{host} entered liveness state #{status} with custom state #{custom_state}"
  end

  # Periodically append new state for publishing
  Thread.new do
    uptime = 0
    loop do
      sleep(5)
      uptime += 5
      node.append_custom_state(:uptime_seconds, uptime)
    end
  end.abort_on_exception = true

  puts "Ready\n"
  begin
    # Run node (blocking)
    node.start
  rescue Interrupt
  end
  puts "\nDone"

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/beatmadsen/rswim.

License

The gem is available as open source under the terms of the MIT License.