Skip to content

Latest commit

 

History

History
47 lines (36 loc) · 1.05 KB

File metadata and controls

47 lines (36 loc) · 1.05 KB

pubsub

Publish/subscribe messaging with fan-out semantics.

Usage

// Create broker (Postgres or Noop)
broker := postgres.NewBroker(db, cfg, log)
broker := pubsub.NewNoopBroker()

// Publish
env := pubsub.Envelope{
    ID:      model.NewID(),
    Topic:   "user.created",
    Payload: user,
}
broker.Publish(ctx, "user.created", env)

// Subscribe (each subscriber gets all messages)
broker.Subscribe(ctx, "user.created", func(ctx context.Context, env pubsub.Envelope) error {
    user := env.Payload.(User)
    // handle...
    return nil
}, pubsub.SubscribeOptions{SubscriberID: "email-sender"})

API

type Publisher interface {
    Publish(ctx context.Context, topic string, env Envelope) error
}

type Subscriber interface {
    Subscribe(ctx context.Context, topic string, handler Handler, opts SubscribeOptions) error
}

At-least-once delivery. Named subscribers resume from last offset.