WIP: feat(realtime): print on several application nodes (shared wakeups, durable connection record, claim gate on any node) #36
Draft
james.maes
wants to merge 2 commits from
feat/multi-node-realtime-20261110 into main
pull from: feat/multi-node-realtime-20261110
merge into: QRun-IO:main
QRun-IO:main
QRun-IO:fix/delete-refusal-under-lock
QRun-IO:feat/delete-stations-printers-20261111
QRun-IO:fix/print-job-created-date-time
QRun-IO:feat/station-identity-20261110
QRun-IO:wip/native-auth-pins-20261107
QRun-IO:docs/release-1.1.2-20261106
QRun-IO:ci/gitea-registry-rc22-20261106
QRun-IO:docs/release-1.1.1-20261106
QRun-IO:fix/realtime-header-case-20261106
QRun-IO:docs/release-1.1.0-20261105
QRun-IO:feat/remove-printers-devices-main-20261105
QRun-IO:feat/printer-approval-20261105
QRun-IO:feat/remove-printers-devices-20261105
QRun-IO:docs/printing-release-closeout-20261104
QRun-IO:release/printing-1.0.0-20261103
QRun-IO:release/printing-cohort-20261101
QRun-IO:dependabot/maven/org.codehaus.mojo-exec-maven-plugin-3.6.4
QRun-IO:dependabot/maven/org.apache.maven.plugins-maven-surefire-plugin-3.6.1
QRun-IO:dependabot/maven/org.apache.maven.plugins-maven-checkstyle-plugin-3.6.0
QRun-IO:migration/cutoff-cf06815f30e1-b9a717
QRun-IO:migration/cutoff-7bedb1016fa9-a854c1
QRun-IO:migration/cutoff-5f74c0c69a55-38f8f8
QRun-IO:dependabot/maven/com.puppycrawl.tools-checkstyle-14.3.0
QRun-IO:dependabot/maven/com.kingsrook-qbit-build-parent-2.1.2
QRun-IO:dependabot/github_actions/github/codeql-action/upload-sarif-4.39.1
QRun-IO:dependabot/github_actions/github/codeql-action/init-4.39.1
QRun-IO:dependabot/github_actions/astral-sh/setup-uv-10.3.2
QRun-IO:dependabot/github_actions/KofTwentyTwo/standards/dot-github/workflows/pr.yml-1.2.1
QRun-IO:dependabot/github_actions/actions/setup-java-6.1.0
QRun-IO:chore/printing-quality-integration-20261101
QRun-IO:feat/small-label-tests-20261101
QRun-IO:archive/qrun-github-cutover-20261101/e08b3ef9c817/dependabot/github_actions/github/codeql-action/init-4.39.1
QRun-IO:migration/cutoff-e08b3ef9c817-b21637
QRun-IO:archive/qrun-github-cutover-20261101/de286e7eb67b/dependabot/github_actions/github/codeql-action/upload-sarif-4.39.1
QRun-IO:migration/cutoff-de286e7eb67b-06d241
QRun-IO:archive/qrun-github-cutover-20261101/cc4dc3dc2700/dependabot/github_actions/astral-sh/setup-uv-10.3.2
QRun-IO:migration/cutoff-cc4dc3dc2700-4e3528
QRun-IO:archive/qrun-github-cutover-20261101/2cec82bf4aa9/dependabot/github_actions/actions/setup-java-6.1.0
QRun-IO:migration/cutoff-2cec82bf4aa9-68d7f8
QRun-IO:archive/qrun-github-cutover-20261101/2a2eedc89f64/dependabot/github_actions/KofTwentyTwo/standards/dot-github/workflows/pr.yml-1.2.1
QRun-IO:migration/cutoff-2a2eedc89f64-2894f0
QRun-IO:archive/qrun-github-cutover-20261101/088692e3aefa/main
QRun-IO:archive/qrun-github-cutover-20261101/7bedb1016fa9/dependabot/maven/org.apache.maven.plugins-maven-surefire-plugin-3.6.1
QRun-IO:archive/qrun-github-cutover-20261101/5f74c0c69a55/dependabot/maven/org.apache.maven.plugins-maven-checkstyle-plugin-3.6.0
QRun-IO:archive/qrun-github-cutover-20261101/1db6a1163d5e/dependabot/github_actions/actions/setup-java-6.1.0
QRun-IO:archive/qrun-github-cutover-20261101/c8f8e016cf29/dependabot/maven/com.kingsrook-qbit-build-parent-2.1.2
QRun-IO:migration/cutoff-c8f8e016cf29-8a552b
QRun-IO:archive/qrun-github-cutover-20261101/cf06815f30e1/dependabot/maven/org.codehaus.mojo-exec-maven-plugin-3.6.4
QRun-IO:archive/qrun-github-cutover-20261101/985acc06d7e9/dependabot/maven/com.puppycrawl.tools-checkstyle-14.3.0
QRun-IO:migration/cutoff-985acc06d7e9-7f35cb
QRun-IO:archive/qrun-github-cutover-20261101/1a0964ef233d/main
QRun-IO:chore/server-source-standards-20261101
QRun-IO:archive/qrun-github-cutover-20261101/02b922aa11fa/main
QRun-IO:archive/qrun-github-cutover-20261101/4f962f7fbfd8/dependabot/maven/com.kingsrook-qbit-build-parent-2.1.2
QRun-IO:archive/qrun-github-cutover-20261101/8460edb60d58/dependabot/maven/org.apache.maven.plugins-maven-surefire-plugin-3.6.1
QRun-IO:archive/qrun-github-cutover-20261101/05c83067e182/dependabot/maven/com.puppycrawl.tools-checkstyle-14.3.0
QRun-IO:archive/qrun-github-cutover-20261101/b1b8f3b065b8/dependabot/maven/org.apache.maven.plugins-maven-checkstyle-plugin-3.6.0
QRun-IO:archive/qrun-github-cutover-20261101/e0ff82392398/dependabot/maven/org.codehaus.mojo-exec-maven-plugin-3.6.4
QRun-IO:feat/print-anything
QRun-IO:feat/record-printing
QRun-IO:archive/qrun-github-cutover-20261101/9128133f5cdd/dependabot/github_actions/actions/setup-java-6.1.0
QRun-IO:docs/installed-native-020-20261031
QRun-IO:dependabot/github_actions/KofTwentyTwo/standards/dot-github/workflows/codeql.yml-1.2.1
QRun-IO:dependabot/github_actions/actions/download-artifact-8.0.2
2
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
42dff1ff39
|
docs(realtime): describe printing on several application nodes
REALTIME.md replaces the single-node boundary with what is shared and where (jobs and the claim, the connection record, the claim gate, wakeups), what happens when the shared bus loses a wakeup, the delivery guarantee, the four columns a host that owns its schema must add, and what is and is not verified. README, OPERATIONS and the changelog follow. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> |
||
|
|
4aa63ae1d1
|
feat(realtime): print on several nodes: shared wakeups, a durable connection record and a claim gate any node can answer
A device holds one realtime connection, on one node. Until now the wakeup listeners, the connection ownership and the claim gate lived in that JVM, so a job accepted on another node never reached the device, and a claim that reached another node was refused with 409. - PrintingRealtimeBus joins the application's QQQ realtime bus (in memory on one node, the configured shared bus such as Redis on several). A wakeup is delivered to this JVM directly and handed to the shared bus by a bounded background worker, so the committing caller never waits for the transport. The route provider joins at start; hosts need no new wiring. - The connection is recorded on the device row (connection id, node, ready flag, lease). Every statement is a guarded update: the newest connection takes the row, only the named connection can renew, mark or clear it. The claim gate accepts a claim on a node without the socket when the row shows a live, ready connection and the device has applied the current desired state and settings. - On every heartbeat (PING) the connection renews its lease and asks the database whether anything was committed that it has not been told; a wakeup the bus lost costs at most one heartbeat interval. A connection replaced through another node closes on the bus message, or on its next frame when the bus is down. - The QUEUED to CLAIMED update carries a status guard in addition to the device row lock. - A database failure during the socket upgrade answers 503 (retryable), not 403, which a client treats as "ask a person to sign in". Tests: two services with separate buses and route providers over one database and one application bus (wake, claim over HTTP on the other node, events on either node, bus down, replacement), the bus on its own, and the claim, acknowledgement and connection record on PostgreSQL 17 (Testcontainers). Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> |