https://github.com/zerjioang/go-bus
a deadly simple thread-safe, zero-alloc event bus for Golang
https://github.com/zerjioang/go-bus
embedded eventbus golang mq pubsub
Last synced: 5 months ago
JSON representation
a deadly simple thread-safe, zero-alloc event bus for Golang
- Host: GitHub
- URL: https://github.com/zerjioang/go-bus
- Owner: zerjioang
- License: gpl-3.0
- Created: 2018-12-12T23:52:22.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2019-04-27T20:20:40.000Z (about 7 years ago)
- Last Synced: 2025-08-13T19:28:31.781Z (10 months ago)
- Topics: embedded, eventbus, golang, mq, pubsub
- Language: Go
- Homepage:
- Size: 41 KB
- Stars: 9
- Watchers: 1
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
PubSub Event bus for Go
Package **go-bus** is a thread-safe, **zero-alloc**, pub-sub event bus for embebbed go apps and microservices.
## Install
```bash
go get github.com/zerjioang/go-bus
```
## TL;DR
```go
func TestExampleCalculationBus(t *testing.T) {
//define a global bus instance
bus := mutex.NewBus()
//register our subscriber: the calculation engine
bus.Subscribe("calc", func(message gobus.EventMessage) {
println("new calculation request arrived")
a := message.Get("a").(int)
b := message.Get("b").(int)
println("received a = ", a)
println("received b = ", b)
println("the sum is", a+b)
})
//register our data publisher
bus.Send("calc", gobus.EventPayload{
"a": 5,
"b": 10,
})
bus.Send("calc", gobus.EventPayload{
"a": 8,
"b": 12,
})
bus.Shutdown()
}
```
```bash
new calculation request arrived
new calculation request arrived
received a = 5
received b = 10
received a = 8
received b = 12
the sum is 15
the sum is 20
```
## Benchmarking
Always do benchmarking with your own data. Here are mine:
### For mutex based version
```bash
BenchmarkEventBus/instantiation-4 2000000000 0.42 ns/op 2394.34 MB/s 0 B/op 0 allocs/op
BenchmarkEventBus/instantiation-ptr- 2000000000 0.43 ns/op 2310.56 MB/s 0 B/op 0 allocs/op
BenchmarkEventBus/str-to-uint32-4 50000000 37.6 ns/op 26.56 MB/s 0 B/op 0 allocs/op
BenchmarkEventBus/subscribe-4 5000000 274 ns/op 3.64 MB/s 43 B/op 0 allocs/op
BenchmarkEventBus/subscribe-invalid-no-name-4 500000000 3.38 ns/op 295.51 MB/s 0 B/op 0 allocs/op
BenchmarkEventBus/subscribe-invalid-no-listener-4 300000000 4.20 ns/op 238.03 MB/s 0 B/op 0 allocs/op
BenchmarkEventBus/publish-no-subscriber-4 3000000 468 ns/op 2.13 MB/s 0 B/op 0 allocs/op
BenchmarkEventBus/publish-with-subscriber-4 3000000 476 ns/op 2.10 MB/s 0 B/op 0 allocs/op
BenchmarkEventBus/pub-sub-4 100000 79957 ns/op 0.01 MB/s 48 B/op 0 allocs/op
PASS
```
Special thanks to http://ernestmicklei.com/2014/11/guava-like-eventbus-for-go/ for it's original approach
## License
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Uses GPL license described below
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.