Files
upstream-watermill/_examples/real-world-examples/consumer-groups/crm-service/main.go
2026-09-15 21:27:46 +05:00

164 lines
3.9 KiB
Go

package main
import (
"context"
"encoding/json"
"fmt"
"os"
"strings"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill-redisstream/pkg/redisstream"
"github.com/ThreeDotsLabs/watermill-routing-example/server/common"
"github.com/ThreeDotsLabs/watermill/components/cqrs"
"github.com/ThreeDotsLabs/watermill/message"
"github.com/ThreeDotsLabs/watermill/message/router/middleware"
"github.com/redis/go-redis/v9"
)
var (
replica = os.Getenv("REPLICA")
serviceName = "crm-service"
serviceNameWithReplica = serviceName + "-" + replica
)
func main() {
logger := watermill.NewStdLogger(false, false)
router, err := message.NewRouter(message.RouterConfig{}, logger)
if err != nil {
panic(err)
}
pubClient := redis.NewClient(&redis.Options{
Addr: "redis:6379",
})
publisher, err := redisstream.NewPublisher(
redisstream.PublisherConfig{
Client: pubClient,
},
logger,
)
if err != nil {
panic(err)
}
router.AddMiddleware(middleware.Recoverer)
router.AddMiddleware(common.NotifyMiddleware(publisher, serviceNameWithReplica))
subClient := redis.NewClient(&redis.Options{
Addr: "redis:6379",
})
subscriber, err := redisstream.NewSubscriber(
redisstream.SubscriberConfig{
Client: subClient,
ConsumerGroup: "",
},
logger,
)
if err != nil {
panic(err)
}
if replica == "1" {
router.AddConsumerHandler(
"OnUserSignedUp-2",
"UserSignedUp-2",
subscriber,
func(msg *message.Message) error {
var event common.UserSignedUp
err := json.Unmarshal(msg.Payload, &event)
if err != nil {
return err
}
fmt.Println("Adding user", event.UserID, "to the CRM")
return nil
},
)
}
if replica == "1" {
eventProc8, err := cqrs.NewEventProcessorWithConfig(router, cqrs.EventProcessorConfig{
GenerateSubscribeTopic: func(params cqrs.EventProcessorGenerateSubscribeTopicParams) (string, error) {
return fmt.Sprintf("%s-8", params.EventName), nil
},
SubscriberConstructor: func(params cqrs.EventProcessorSubscriberConstructorParams) (message.Subscriber, error) {
handlerName := strings.Split(params.HandlerName, "-")[0]
return redisstream.NewSubscriber(
redisstream.SubscriberConfig{
Client: subClient,
ConsumerGroup: fmt.Sprintf("%s_%s", serviceName, handlerName),
},
logger,
)
},
Marshaler: cqrs.JSONMarshaler{
GenerateName: cqrs.StructName,
},
Logger: logger,
})
if err != nil {
panic(err)
}
err = eventProc8.AddHandlers(
cqrs.NewEventHandler("AddToCRM-8", HandleCRM),
cqrs.NewEventHandler("AddToSupport-8", HandleSupport),
)
if err != nil {
panic(err)
}
}
eventProc9, err := cqrs.NewEventProcessorWithConfig(router, cqrs.EventProcessorConfig{
GenerateSubscribeTopic: func(params cqrs.EventProcessorGenerateSubscribeTopicParams) (string, error) {
return fmt.Sprintf("%s-9", params.EventName), nil
},
SubscriberConstructor: func(params cqrs.EventProcessorSubscriberConstructorParams) (message.Subscriber, error) {
handlerName := strings.Split(params.HandlerName, "-")[0]
return redisstream.NewSubscriber(
redisstream.SubscriberConfig{
Client: subClient,
ConsumerGroup: fmt.Sprintf("%s_%s", serviceName, handlerName),
},
logger,
)
},
Marshaler: cqrs.JSONMarshaler{
GenerateName: cqrs.StructName,
},
Logger: logger,
})
if err != nil {
panic(err)
}
err = eventProc9.AddHandlers(
cqrs.NewEventHandler("AddToCRM-9", HandleCRM),
cqrs.NewEventHandler("AddToSupport-9", HandleSupport),
)
if err != nil {
panic(err)
}
err = router.Run(context.Background())
if err != nil {
panic(err)
}
}
func HandleCRM(ctx context.Context, e *common.UserSignedUp) error {
fmt.Println("Adding user", e.UserID, "to the CRM")
return nil
}
func HandleSupport(ctx context.Context, e *common.UserSignedUp) error {
fmt.Println("Adding user", e.UserID, "to the support channel")
return nil
}