garagemq

by valinurovam

valinurovam / garagemq

AMQP message broker implemented with golang

138 Stars 18 Forks Last release: Not found MIT License 134 Commits 0 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

GarageMQ Build Status Coverage Status Go Report Card

GarageMQ is a message broker that implement the Advanced Message Queuing Protocol (AMQP). Compatible with any AMQP or RabbitMQ clients (tested streadway/amqp and php-amqp lib)

Table of Contents

Goals of this project

  • Have fun and learn a lon
  • Implement AMQP message broker in Go
  • Make protocol compatible with RabbitMQ and standard AMQP 0-9-1.

Demo

Simple demo server on Digital Ocean,

2 GB Memory / 25 GB Disk / FRA1 - Ubuntu Docker 17.12.0~ce on 16.04

| Server | Port | Admin port | Login | Password | Virtual Host | |:-------------:|:----:|:----------:|:-----:|:--------:|:------------:| | 46.101.117.78 | 5672 | 15672 | guest | guest | / |

Installation and Building

Docker

The quick way to start with GarageMQ is by using

docker
. You can build it by your own or pull from docker-hub
shell
docker pull amplitudo/garagemq
docker run --name garagemq -p 5672:5672 -p 15672:15672 amplitudo/garagemq
or
go get -u github.com/valinurovam/garagemq/...
cd $GOPATH/src/github.com/valinurovam/garagemq
docker build -t garagemq .
docker run --name garagemq -p 5672:5672 -p 15672:15672 garagemq

Go get

You can also use go get:

go get -u github.com/valinurovam/garagemq/...
shell
go get -u github.com/valinurovam/garagemq/...
cd $GOPATH/src/github.com/valinurovam/garagemq
make build.all && make run

Execution flags

| Flag | Default | Description | ENV | | :--- | :--- | :--- | :--- | | --config | default config | Config path | GMQCONFIG | | --log-file | stdout | Log file path or

stdout
,
stderr
| GMQ
LOGFILE | | --log-level | info | Logger level | GMQLOGLEVEL | | --hprof | false | Enable or disable hprof profiler | GMQHPROF | | --hprof-host | 0.0.0.0 | Profiler host | GMQHPROFHOST | | --hprof-port | 8080 | Profiler port | GMQHPROFPORT |

Default config params

# Proto name to implement (amqp-rabbit or amqp-0-9-1)
proto: amqp-rabbit
# User list
users:
  - username: guest
    password: 084e0343a0486ff05530df6c705c8bb4 # guest md5
# Server TCP settings
tcp:
  ip: 0.0.0.0
  port: 5672
  nodelay: false
  readBufSize: 196608
  writeBufSize: 196608
# Admin-server settings
admin:
  ip: 0.0.0.0
  port: 15672
queue:
  shardSize: 8192
  maxMessagesInRam: 131072
# DB settings
db:
  # default path 
  defaultPath: db
  # backend engine (badger or buntdb) 
  engine: badger
# Default virtual host path  
vhost:
  defaultPath: /
# Security check rule (md5 or bcrypt)
security:
  passwordCheck: md5
connection:
  channelsMax: 4096
  frameMaxSize: 65536

Performance tests

Performance tests with load testing tool https://github.com/rabbitmq/rabbitmq-perf-test on test-machine:

MacBook Pro (15-inch, 2016)
Processor 2,6 GHz Intel Core i7
Memory 16 GB 2133 MHz LPDDR3

Persistent messages

./bin/runjava com.rabbitmq.perf.PerfTest --exchange test -uri amqp://guest:[email protected]:5672 --queue test --consumers 10 --producers 5 --qos 100 -flag persistent
...
...
id: test-235131-686, sending rate avg: 53577 msg/s
id: test-235131-686, receiving rate avg: 51941 msg/s

Transient messages

./bin/runjava com.rabbitmq.perf.PerfTest --exchange test -uri amqp://guest:[email protected]:5672 --queue test --consumers 10 --producers 5 --qos 100
...
...
id: test-235231-085, sending rate avg: 71247 msg/s
id: test-235231-085, receiving rate avg: 69009 msg/s

Internals

Backend for durable entities

Database backend is changeable through config

db.engine
db:
  defaultPath: db
  engine: badger
db:
  defaultPath: db
  engine: buntdb
- Badger https://github.com/dgraph-io/badger - BuntDB https://github.com/tidwall/buntdb

QOS

basic.qos
method implemented for standard AMQP and RabbitMQ mode. It means that by default qos applies for connection(global=true) or channel(global=false). RabbitMQ Qos means for channel(global=true) or each new consumer(global=false).

Admin server

The administration server is available at standard

:15672
port and is
read only mode
at the moment. Main page above, and more screenshots at /readme folder

Overview

TODO

  • [ ] Optimize binds
  • [ ] Replication and clusterization
  • [ ] Own backend for durable entities and persistent messages
  • [ ] Migrate to message reference counting

Contribution

Contribution of any kind is always welcome and appreciated. Contribution Guidelines in WIP

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.