This project implements a generic event-driven worker that can be used with various message brokers. It provides an event-dispatching mechanism where users only need to implement the event interface and handlers. The EventDispatcher is already implemented, making it easy to register and dispatch events.
- Supports integration with different message brokers (Kafka, RabbitMQ, NATS, etc.)
- Dispatches events based on message keys
- Processes messages concurrently using goroutines
- Ensures partition-aware or queue-aware message handling
Ensure you have Go installed (1.18+ recommended) and initialize your project:
go mod init your_projectEach event must implement the EventInterface:
package events
import "time"
type EventInterface interface {
GetName() string
GetDateTime() time.Time
GetPayload() []byte
}Example event struct:
type CreateOrderEvent struct {
DateTime time.Time
Payload []byte
}
func (e *CreateOrderEvent) GetName() string { return "createOrder" }
func (e *CreateOrderEvent) GetDateTime() time.Time { return e.DateTime }
func (e *CreateOrderEvent) GetPayload() []byte { return e.Payload }Handlers must implement the EventHandlerInterface:
package events
import (
"fmt"
"sync"
)
type OrderEventHandler struct {}
func (h *OrderEventHandler) Handle(event EventInterface, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("Processing Order Event:", string(event.GetPayload()))
}The worker listens for messages from the broker, determines the event type by message key, and dispatches them accordingly.
package main
import (
"context"
"fmt"
"log"
"sync"
"time"
"your_project/events"
)
func main() {
dispatcher := events.NewEventDispatcher()
orderHandler := &events.OrderEventHandler{}
ctx := context.Background()
dispatcher.Register(ctx, "createOrder", orderHandler)
for {
messages := fetchMessagesFromBroker() // Implement this based on your broker
var wg sync.WaitGroup
for _, msg := range messages {
wg.Add(1)
go func(msg Message) {
defer wg.Done()
eventKey := msg.Key
switch eventKey {
case "createOrder":
event := &events.CreateOrderEvent{
DateTime: time.Now(),
Payload: msg.Value,
}
fmt.Println("Received createOrder event:", string(msg.Value))
dispatcher.Dispatch(ctx, event)
default:
fmt.Println("Unknown event key:", eventKey)
}
}(msg)
}
wg.Wait()
}
}- Start your message broker (Kafka, RabbitMQ, etc.) and configure topics/queues.
- Run the worker:
go run main.go- Produce messages to the broker using your preferred method.
To add new event types:
- Create a new event struct implementing
EventInterface. - Implement a handler that satisfies
EventHandlerInterface. - Register the event and handler in the worker.
This worker provides a generic event-driven architecture, allowing integration with different message brokers. The EventDispatcher is already implemented, so you only need to define your events and handlers.
🚀 Happy coding!