modulepackage
0.0.0-20210509142449-e49965d93b7f
Repository: https://github.com/pongsatt/go-dbevent.git
Documentation: pkg.go.dev
# README
Go Database Eventing (Publish event using database)
Go library to help publishing events along with transation data atomically
Features include:
Running example
Consumer Example
Start mysql server
./start_server.sh
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"github.com/pongsatt/go-dbevent"
"github.com/pongsatt/go-dbevent/driver"
)
// Data represent example json data
type Data struct {
ID string
}
func main() {
var nodeID string
if len(os.Args) > 1 {
nodeID = os.Args[1]
} else {
panic("nodeID required")
}
dbConfig := &dbevent.DBConfig{
Host: "127.0.0.1",
Port: 3306,
DBName: "testdb",
User: "root",
Password: "my-secret-pw",
}
mysqlDriver := driver.NewMySQLEventDriver(dbConfig, &driver.MySQLStoreConfig{NodeID: nodeID})
eventStore := dbevent.NewStore(mysqlDriver)
defer eventStore.Close()
consumer := eventStore.NewConsumer("group1", &dbevent.ConsumerConfig{})
defer consumer.Close()
consumer.Consume(func(event *dbevent.Event) error {
fmt.Printf("got event %d\n", event.ID)
return nil
})
fmt.Println("Consumer ready")
termChan := make(chan os.Signal)
signal.Notify(termChan, syscall.SIGINT, syscall.SIGTERM)
<-termChan
fmt.Println("Done")
}
Start consumer
go run example/consumer_highlevel/* node1
Producer Example
package main
import (
"encoding/json"
"fmt"
"os"
"strconv"
"time"
// we need it
_ "github.com/go-sql-driver/mysql"
"github.com/google/uuid"
"github.com/pongsatt/go-dbevent"
"github.com/pongsatt/go-dbevent/driver"
)
// Data represent example json data
type Data struct {
ID string
}
func main() {
eventNum := 1
if len(os.Args) > 1 {
eventNum, _ = strconv.Atoi(os.Args[1])
}
dbConfig := &dbevent.DBConfig{
Host: "127.0.0.1",
Port: 3306,
DBName: "testdb",
User: "root",
Password: "my-secret-pw",
}
mysqlDriver := driver.NewMySQLEventDriver(dbConfig, &driver.MySQLStoreConfig{})
if err := mysqlDriver.Provision(); err != nil {
panic(err)
}
defer mysqlDriver.Close()
for i := 0; i < eventNum; i++ {
now := time.Now()
data := &Data{
ID: uuid.NewString(),
}
b, _ := json.Marshal(data)
event := &dbevent.Event{
Type: "testtype",
AggregateType: "aggType",
AggregateID: "agg1",
Data: b,
CreatedAt: &now,
}
if err := mysqlDriver.Create(event); err != nil {
panic(err)
}
fmt.Printf("event '%s' produced\n", data.ID)
}
}
Run producer
go run example/producer/* 1
Consumer output
got event 1
# Functions
NewBackoff creates new backoff object.
NewBuilder returns new builder instance.
NewConsumer creates new consumer.
NewStore creates new store.
# Structs
Backoff represents exponential backoff.
BackOffConfig represents backoff configuration.
Consumer represents consumer.
ConsumerConfig represents consumer configuration.
DBConfig represents database configuration.
Event represents event data.
MockBackoffer is an autogenerated mock type for the Backoffer type.
MockConsumerDriver is an autogenerated mock type for the ConsumerDriver type.
Store represents event store.
# Interfaces
Backoffer represents backoff algorithm interface.
ConsumerDriver represents event consumer driver.
StoreDriver represents event store driver.
# Type aliases
JSON custom data type.