Categorygithub.com/pongsatt/go-dbevent
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)

Test

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

# Packages

No description provided by the author
No description provided by the author

# 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.