Skip to main content

Events

An EventBus is a communication mechanism or pattern used in software development to enable the exchange of messages, events, or notifications between different parts of a software system or between loosely coupled components. It simplifies the decoupling of components and promotes a more scalable and maintainable architecture.

Local Eventbus

github: https://github.com/goxiaoy/go-eventbus

The Repository uses local eventbus to publish entities change events

Distributed Event

Producer

type Producer interface {
io.Closer
Send(ctx context.Context, msg Event) error
BatchSend(ctx context.Context, msg []Event) error
}
warning

Not all the underlying distributed event buses support atomic batch sending.

Consumer

type HandlerOf[T any] interface {
Process(context.Context, T) error
}
type ConsumerHandler HandlerOf[Event]

type Consumer interface {
io.Closer
// Process start process event with handler
Process(ctx context.Context, handler ConsumerHandler) error
}

Consistency

Unit of Work Producer

Combining with Aggregate Root allows for delayed event sending until the unit of work is committed.

event.ConsumerFactoryServer implements kratos transport.Server You can apply middleware pattern to ConsumerFactoryServer

	srv := event.NewConsumerFactoryServer(e, container)
// panic recovery,tracing,logging,unit of work
srv.Use(event.ConsumerRecover(event.WithLogger(logger)), trace.Receive(), event.Logging(logger), event.ConsumerUow(uowMgr))

Two-phase message Exposed Endpoint

You can embed eventserver.EventProviderSet to your di container to expose grpc endpoints for cases like Cache Consistency

eventserver "github.com/go-saas/kit/event/server"

service EventService{
rpc HandleEvent(HandleEventRequest)returns(google.protobuf.Empty){
}
rpc PublishEvent(PublishEventRequest)returns(google.protobuf.Empty){
}
}

Provider

Kafka

Pulsar