more checkout
This commit is contained in:
+20
-4
@@ -21,7 +21,9 @@ import (
|
||||
|
||||
"git.k6n.net/mats/go-cart-actor/pkg/actor"
|
||||
"git.k6n.net/mats/go-cart-actor/pkg/flow"
|
||||
"git.k6n.net/mats/go-cart-actor/pkg/idempotency"
|
||||
"git.k6n.net/mats/go-cart-actor/pkg/order"
|
||||
"git.k6n.net/mats/go-cart-actor/pkg/outbox"
|
||||
messages "git.k6n.net/mats/go-cart-actor/proto/order"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protojson"
|
||||
@@ -39,6 +41,7 @@ type server struct {
|
||||
provider order.PaymentProvider
|
||||
defaultFlow string
|
||||
dataDir string
|
||||
idem *idempotency.Store
|
||||
logger *slog.Logger
|
||||
}
|
||||
|
||||
@@ -94,10 +97,15 @@ func main() {
|
||||
amqpURL := os.Getenv("AMQP_URL")
|
||||
var emitPub order.Publisher
|
||||
if amqpURL != "" {
|
||||
if pub, err := newRabbitPublisher(amqpURL); err != nil {
|
||||
logger.Warn("amqp_emit hook: publisher unavailable", "err", err)
|
||||
// The amqp_emit hook writes to a durable outbox rather than the broker
|
||||
// directly; a relay goroutine drains it to RabbitMQ (reconnecting), so an
|
||||
// event survives a broker outage or a crash after the state change.
|
||||
box, err := outbox.Open(filepath.Join(dataDir, "outbox.log"))
|
||||
if err != nil {
|
||||
logger.Warn("outbox disabled: open failed", "err", err)
|
||||
} else {
|
||||
emitPub = pub
|
||||
go box.Run(context.Background(), newRabbitPublisher(amqpURL), 5*time.Second, logger)
|
||||
emitPub = box
|
||||
}
|
||||
}
|
||||
freg := flow.NewRegistry()
|
||||
@@ -115,10 +123,18 @@ func main() {
|
||||
log.Fatalf("load flows: %v", err)
|
||||
}
|
||||
|
||||
// Durable idempotency store for order creation — survives a restart, so a
|
||||
// client retry after a crash returns the existing order instead of creating
|
||||
// a duplicate.
|
||||
idem, err := idempotency.Open(filepath.Join(dataDir, "idempotency.log"))
|
||||
if err != nil {
|
||||
log.Fatalf("open idempotency store: %v", err)
|
||||
}
|
||||
|
||||
s := &server{
|
||||
pool: pool, applier: applier, storage: storage, reg: reg,
|
||||
engine: engine, freg: freg, flows: flows, provider: provider,
|
||||
defaultFlow: def.Name, dataDir: dataDir, logger: logger,
|
||||
defaultFlow: def.Name, dataDir: dataDir, idem: idem, logger: logger,
|
||||
}
|
||||
|
||||
mux := http.NewServeMux()
|
||||
|
||||
Reference in New Issue
Block a user