Skip to content

How outboxer works

Adam Mikulasev edited this page Apr 18, 2025 · 8 revisions

Queueing messages

sequenceDiagram
    participant A as Application Service
    participant T as ActiveRecord::Base.transaction
    participant E as Event
    participant Q as Outboxer::Message
    participant M as Outboxer::Models::Message

    A->>T: begin
    activate T

    T->>E: create!
    note right of E: in after_create callback
    E->>Q: queue(messageable: event)
    activate Q
    Q->>M: create!(messageable: event, status: "queued")
    deactivate Q

    T->>T: commit
    deactivate T

Loading

Publishing messages

sequenceDiagram
    participant CLI as bin/outboxer_publisher
    participant P as Outboxer::Publisher
    participant M as Outboxer::Models::Message
    participant J as OutboxerIntegration::PublishMessageJob
    participant R as Redis (Sidekiq)

    CLI->>P: publish_message(&block)
    activate P

    P->>M: dequeue(status: "queued")

    loop for each message
        P->>M: update status: "publishing"
        P->>J: perform_async(message_id, messageable_id, messageable_type)
        J->>R: enqueue Sidekiq job
        R-->>J: acknowledged
        P->>M: update status: "published"
    end

    P-->>CLI: return
    deactivate P

Loading
Clone this wiki locally