|
13 | 13 | - At-least-once retries, terminal domain rejection, strict poison ordering, |
14 | 14 | dead letters, and tail retry |
15 | 15 | - Transactional effects with success/failure actor messages |
16 | | -- Actor-to-actor asynchronous outbox delivery |
| 16 | +- Actor-to-actor asynchronous outbox delivery. Effects and broadcasts use |
| 17 | + portable status rows with polling indexes and database check constraints on |
| 18 | + status, which works on all three adapters; a future version may add narrow |
| 19 | + ready/claimed membership tables for very large outboxes, as messages already |
| 20 | + have |
17 | 21 | - One-shot and recurring reminders with `:latest` or `:all` catch-up |
18 | 22 | - Durable observable invalidations, scalar Turbo replacement, keyed ERB |
19 | 23 | components, signed component locals, and authorized replace or morph refresh |
20 | 24 | - Batched component refreshes: components sharing a signed `batch:` collapse to |
21 | 25 | one browser request per revision, served as HTML frames in a JSON envelope |
22 | 26 | - Personalized state payload broadcasts computed per subscriber under that |
23 | | - subscriber's authorization context, fenced by actor revision |
| 27 | + subscriber's authorization context, fenced by actor revision, resolved through |
| 28 | + `payload_authorization_context` so the block and `authorize_query` see the |
| 29 | + same subject a controller render passes, and confined so one failing payload |
| 30 | + cannot reject the subscription or stop its siblings |
24 | 31 | - Reconciliation read APIs |
25 | 32 | - Installation doctor, authorization reference, fit guide, and legacy-state |
26 | 33 | migration cookbook |
|
59 | 66 |
|
60 | 67 | ## Partially implemented |
61 | 68 |
|
62 | | -- Wake-up strategy: in-process signaling, durable polling, injection, and an |
63 | | - opt-in PostgreSQL notification adapter are implemented; a Redis adapter is |
64 | | - not. In-process signaling cannot cross process boundaries, so without the |
65 | | - adapter a commit in a web process does not wake a broadcast executor in a |
66 | | - worker process and that delivery waits up to `polling_interval`, 100 ms by |
67 | | - default. `WakeUpAdapters.for` removes that delay on PostgreSQL, measured at |
68 | | - 103.7 ms to 2.9 ms at p50. It is opt-in rather than automatic: it opens a |
69 | | - connection per waiting thread outside the pool, and `LISTEN` does not survive |
70 | | - a transaction-pooling proxy such as PgBouncer. MySQL has no notification |
71 | | - primitive, so MySQL applications keep polling unless they configure the Redis |
72 | | - adapter. |
| 69 | +- Wake-up strategy: in-process signaling, durable polling, injection, and |
| 70 | + cross-process adapters for PostgreSQL and Redis are implemented and tested. |
| 71 | + What is not done is making any of them automatic. In-process signaling cannot |
| 72 | + cross process boundaries, so by default a commit in a web process does not |
| 73 | + wake a broadcast executor in a worker process and that delivery waits up to |
| 74 | + `polling_interval`, 100 ms. An adapter removes that floor, measured at 103.7 ms |
| 75 | + to 2.9 ms at p50 on PostgreSQL and 103.8 ms to 5.7 ms on Redis, but each stays |
| 76 | + opt-in for a reason: the PostgreSQL adapter opens a connection per waiting |
| 77 | + thread outside the pool and `LISTEN` does not survive a transaction-pooling |
| 78 | + proxy such as PgBouncer, and Redis is not a dependency of this gem. |
| 79 | + `WakeUpAdapters.for` selects notifications on PostgreSQL and the in-process |
| 80 | + default elsewhere; it never selects Redis. An application that configures |
| 81 | + nothing keeps polling, and MySQL applications keep polling unless they |
| 82 | + configure Redis explicitly. |
73 | 83 | - Realtime: scalar and dependency-driven keyed ERB component replacement or |
74 | 84 | morphing, personalized refresh authorization, revision fencing, coalescing, |
75 | 85 | reconnect convergence, batched refreshes, and personalized state payloads are |
|
88 | 98 | distributed per-actor rate limits and global admission control do not. |
89 | 99 | - Administration: actor and dead-letter views plus policy hooks exist; richer |
90 | 100 | filtering, audit records, and bulk-safe tools do not. |
91 | | -- Outboxes use portable status rows with polling indexes; future versions may |
92 | | - introduce narrow ready/claimed membership tables for very large outboxes. |
93 | 101 |
|
94 | 102 | ## Next milestones |
95 | 103 |
|
|
0 commit comments