High Availability AMQP Messaging with Redundant Queues
Beetle grew out of a project to improve an existing ActiveMQ based messaging infrastructure. It offers the following features:
-
High Availability (by using multiple message broker instances)
-
Redundancy (by replicating queues)
-
Simple client API (by encapsulating the publishing/ deduplication logic)
More information can be found on the project website.
# configure machines Beetle.config do |config| config.servers = "broker1:5672, broker2:5672" config.redis_server = "redis1:6379" end # instantiate a beetle client b = Beetle::Client.new # configure exchanges, queues, bindings, messages and handlers b.configure do |config| config.queue :test config.message :test config.handler(:test) { |message| puts message.data } end
b.publish :test, "I'm a test message"
b.listen_queues
Beetle ships with a number of example scripts.
The top level Rakefile comes with targets to start several RabbitMQ and redis instances locally. Make sure the corresponding binaries are in your search path. Open four new shell windows and execute the following commands:
rake rabbit:start1 rake rabbit:start2 rake redis:start1 rake redis:start2
To set up a redundant messaging system you will need
-
at least 2 AMQP servers (we use RabbitMQ)
-
at least one Redis server (better are two in a master/slave setup, see REDIS_AUTO_FAILOVER.rdoc)
For testing purposes, you will need a MySQL database with the database ‘beetle_test` created. This is needed to test special cases in which Beetle handles the connection with ActiveRecord:
mysql -e 'create database beetle_test;'
You also need a Redis instance running. The default configuration of Redis will work:
redis-server
At runtime, Beetle will use
-
uuid4r (which needs ossp-uuid)
-
amqp (which is based on eventmachine)
For development, you’ll need
For tests, you’ll need
Stefan Kaes, Pascal Friederich, Ali Jelveh, Bjoern Rochel and Sebastian Roebke.
You can find out more about our work on our dev blog.
Copyright © 2010-2015 XING AG
Released under the MIT license. For full details see MIT-LICENSE included in this distribution.
-
Fork it
-
Create your feature branch (‘git checkout -b my-new-feature`)
-
Commit your changes (‘git commit -am ’Add some feature’‘)
-
Push to the branch (‘git push origin my-new-feature`)
-
Create new Pull Request
Don’t increase the gem version in your pull requests. It will be done after merging the request, to allow merging of pull requests in a flexible order.
Update RELEASE_NOTES.rdoc!
We use semantic versioning and create a git tag for each release.
Edit ‘lib/beetle/version.rb` to set the new version number (`Major.Minor.Patch`).
In short (see semver.org for details):
-
Major version MUST be incremented if any backwards incompatible changes are introduced to the public API.
-
Minor version MUST be incremented if new, backwards compatible functionality is introduced to the public API. It MUST be incremented if any public API functionality is marked as deprecated.
-
Patch version MUST be incremented if only backwards compatible bug fixes are introduced.
Then use ‘rake release` which will create the git tag and upload the gem to gems.xing.com:
$ bundle exec rake release
The generated gem is located in the ‘pkg/` directory.