You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Feature] Extend Database Migrations to NoSQL stores #4156
The DB Migration tools in Paramore.Brighter.BoxProvisioning covers SQL stores but not NoSQL stores like DynamoDB and MongoDB. These tend to have different approaches to schema, locking, etc., so they require a different approach.
Provisioning can use the existing process for a fresh install, but we should harmonize the interface as much as possible
It may be that if we do not need to alter index properties, and the payload is JSON, the issue is whether the application code can handle earlier versions, our migration code would have to load and re-save previous JSON entries
If we need to alter indexable properties, it may be beyond us, as it may require a new table and migrating all the existing entries
Dependency from #4628 (spec 0039, ADR 0089): this issue has to land before the distributed outbox circuit breaker can support the NoSQL outboxes.
The distributed breaker shares tripped topics through a small trip table that sits beside the outbox, in the same database, and is created through box provisioning (BoxType.TrippedTopics). ADR 0089 ships stores for MsSql, PostgreSql and MySql first. DynamoDB, MongoDb and Firestore users cannot use the breaker until:
box provisioning can create a table or collection on those stores (this issue), and
a trip store for each backend is written.
A backend's store must provide:
an atomic per-topic upsert that keeps the later trip time and returns the prior one;
a marking of expired entries as ended that returns each marked entry to exactly one caller;
a read of the live entries;
durability across restarts;
a fixed number of operations per read, or a stated bound.
For DynamoDB, ReturnValues = ALL_OLD gives the first. Its conditional updates are per item, so its read cost grows with the number of ended trips, and that backend's ADR has to state that bound.
Sqlite and Spanner are different. They already have box provisioning, and have no distributed lock provider, so a multi-instance deployment there is not possible today anyway. They need only a trip store, not new provisioning.
Until a backend ships, those users keep InMemoryOutboxCircuitBreaker, which in spec 0039 Phase 1 gains a maximum trip duration so a trip can no longer go stale.
Activity
[-]Extend Database Migrations to NoSQL stores[/-][+][Feature] Extend Database Migrations to NoSQL stores[/+]iancooper commentedon Oct 26, 2026
Dependency from #4628 (spec 0039, ADR 0089): this issue has to land before the distributed outbox circuit breaker can support the NoSQL outboxes.
The distributed breaker shares tripped topics through a small trip table that sits beside the outbox, in the same database, and is created through box provisioning (
BoxType.TrippedTopics). ADR 0089 ships stores for MsSql, PostgreSql and MySql first. DynamoDB, MongoDb and Firestore users cannot use the breaker until:A backend's store must provide:
For DynamoDB,
ReturnValues = ALL_OLDgives the first. Its conditional updates are per item, so its read cost grows with the number of ended trips, and that backend's ADR has to state that bound.Sqlite and Spanner are different. They already have box provisioning, and have no distributed lock provider, so a multi-instance deployment there is not possible today anyway. They need only a trip store, not new provisioning.
Until a backend ships, those users keep
InMemoryOutboxCircuitBreaker, which in spec 0039 Phase 1 gains a maximum trip duration so a trip can no longer go stale.