A lightweight message bus on top of RabbitMQ supporting:
- Supported messaging semantics
- One Way
- Duplex
- Publish/Subscribe
- Request/Reply (RPC)
- Long running processes via the Saga pattern
- Retry and backoffs
- Publisher confirms
- Deadlettering
Planned:
- Transactional Outbox
- Deduplication of inbound messages
- PostgreSQL
- MySql
- gob
- Avro
- Opentracing
import (
"github.com/rhinof/grabbit/gbus"
"github.com/rhinof/grabbit/gbus/builder"
)Define a message
type SomeMessage struct {}
func(SomeMessage) Name() string{
return "some.unique.namespace.somemessage"
}Creating a transactional GBus instance
gb := builder.
New().
Bus("connection string to RabbitMQ").
Txnl("pg", "connection string to PostgreSQL").
Build("name of your service")Register a command handler
handler := func(invocation gbus.Invocation, message *gbus.BusMessage) error
cmd, ok := message.Payload.(SomeCommand)
if ok {
fmt.Printf("handler invoked with message %v", cmd)
return nil
}
return fmt.Errorf("failed to handle message")
}
gb.HandleMessage(SomeCommand{}, handler)Register an event handler
eventHandler := func(invocation gbus.Invocation, message *gbus.BusMessage) {
evt, ok := message.Payload.(SomeEvent)
if ok {
fmt.Printf("handler invoked with event %v", evt)
return nil
}
return fmt.Errorf("failed to handle event")
}
gb.HandleEvent("name of exchange", "name of topic", SomeEvent{}, eventHandler)Start the bus
gb.Start()
defer gb.Shutsown()Send a command
gb.Send("name of service you are sending the command to", gbus.NewBusMessage(SomeCommand{}))Publish an event
gb.Publish("name of exchange", "name of topic", gbus.NewBusMessage(SomeEvent))RPC style call
request := gbus.NewBusMessage(SomeRPCRequest{})
reply := gbus.NewBusMessage(SomeRPCReply{})
timeOut := 2 * time.Second
reply, e := gb.RPC("name of service you are sending the request to", cmd, reply, timeOut)
if e != nil{
fmt.Printf("rpc call failed with error %v", e)
} else{
fmt.Printf("rpc call returned with reply %v", reply)
}- make sure to first:
docker-compose up -d - then to run the tests:
go test ./...