Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
54eb02c
docs(clients): document QWP ingestion and queries in the JavaScript c…
glasstiger Sep 28, 2026
e5c2f6a
docs(clients): mark JavaScript QWP support as stable
glasstiger Sep 28, 2026
5816730
docs(clients): correct JavaScript client behavior found in review
glasstiger Sep 29, 2026
56ee2b7
docs(clients): scope the QWP client docs to Node.js
glasstiger Sep 30, 2026
f2a9919
docs(clients): clarify Node.js journal sharing and memory-mode loss
glasstiger Sep 30, 2026
ee0c3ae
docs(clients): explain when queryViews() callbacks throttle the server
glasstiger Sep 30, 2026
f4b8a1c
docs(clients): address Node.js QWP review findings
glasstiger Sep 30, 2026
427bf48
docs(nodejs): correct QWP examples and shared guidance
glasstiger Sep 30, 2026
8a864af
docs(nodejs): fix ingestion and recovery contracts
glasstiger Sep 30, 2026
957fe3f
docs(nodejs): address QWP review findings
glasstiger Sep 30, 2026
c54acac
docs(nodejs): clarify QWP errors, timeouts, and retry behavior
glasstiger Sep 30, 2026
fe424b4
docs(nodejs): address QWP client review findings
glasstiger Sep 30, 2026
23c26ef
docs(nodejs): fix data-loss and failover guidance found in review
glasstiger Oct 1, 2026
1d13aec
docs(clients): document the current sender error policies for Java an…
glasstiger Oct 1, 2026
3289438
docs(nodejs): clarify QWP client usage and delivery semantics
glasstiger Oct 1, 2026
353084d
docs(nodejs): fix QWP examples and delivery guidance
glasstiger Oct 1, 2026
0ced676
Merge branch 'main' into ia_js_client
glasstiger Oct 1, 2026
1fd38e5
docs: correct Node.js QWP guidance and split operations reference
glasstiger Oct 1, 2026
db92c89
docs: simplify Node.js client guide into one page
glasstiger Oct 1, 2026
25903c9
docs: clarify QWP delivery and Node.js recovery guidance
glasstiger Oct 1, 2026
e9a12cb
docs: address review findings in the Node.js client guide
glasstiger Oct 2, 2026
32056fc
docs(nodejs): fix startup, batch size, transaction, and failover guid…
glasstiger Oct 2, 2026
775becf
docs(nodejs): fix quick start, ACK timeouts, and recovery guidance
glasstiger Oct 2, 2026
aa3e030
docs(nodejs): fix lock recovery, drainer, and error guidance from review
glasstiger Oct 2, 2026
e162824
docs(replication): correct the throttle window default to 1 second
glasstiger Oct 2, 2026
a268159
docs(nodejs): fix failover, shutdown, and error guidance from review
glasstiger Oct 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/validate-links.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,8 @@ jobs:
- name: Install dependencies
run: yarn install --frozen-lockfile

- name: Run plugin tests
run: yarn test

- name: Build site for broken link validation
run: yarn build
8 changes: 8 additions & 0 deletions documentation/changelog.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@ description: Recent updates and improvements to the QuestDB documentation.

This page tracks significant updates to the QuestDB documentation.

## October 2026

### Updated

- [Node.js client](/docs/connect/clients/nodejs/) - Rewrote the page for QWP support in `@questdb/nodejs-client` 5.0.0: pooled ingestion and streaming SQL queries from one connect string, every column type, compiled object-row writers, acknowledgements, transactions, store-and-forward, UDP, failover, error handling, and migration from ILP and from 4.x. The [connect string reference](/docs/connect/clients/connect-string/) and the high-availability and wire-protocol pages now note where the Node.js client's keys, defaults, and behavior differ
- [Store-and-forward](/docs/high-availability/store-and-forward/concepts/) - Corrected the replay semantics for every client: replay is at least once and can insert duplicate rows unless the table uses `DEDUP UPSERT KEYS`. The error policy table now shows the real defaults, which include no drop policy, and the [Java](/docs/connect/clients/java/#ingestion-errors) and [.NET](/docs/connect/clients/dotnet/#how-errors-surface) client pages now document their retriable, terminal, and abandoned policies. [Client failover](/docs/high-availability/client-failover/concepts/#authentication-is-cluster-wide) now lists which clients retry authentication rejections after a sender's first connection
- [Replication tuning](/docs/high-availability/tuning/) - Corrected the default of `replication.primary.throttle.window.duration` to 1 second, its value since QuestDB Enterprise 3.3.1, in the tuning guide and the [replication configuration reference](/docs/configuration/database-replication/#replicationprimarythrottlewindowduration)

## September 2026

### QuestDB Enterprise Releases
Expand Down
45 changes: 28 additions & 17 deletions documentation/concepts/delivery-semantics.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,40 @@
title: Delivery semantics
sidebar_label: Delivery semantics
description:
How QuestDB clients deliver data (at-least-once), where duplicate rows can
arise, and how to combine designated timestamps with deduplication for
exactly-once outcomes.
How QuestDB QWP/WebSocket senders replay unacknowledged writes, where
duplicates arise, and how to use deduplication for exactly-once outcomes.
---

QuestDB clients deliver data **at-least-once**: every row your application
publishes is guaranteed to reach the server, but under failure it may arrive
more than once. Storing each row exactly once is the application's
responsibility, and QuestDB provides the mechanisms to make it routine.
QuestDB QWP/WebSocket senders retry **published, unacknowledged batches**
while they retain them. This gives at-least-once delivery under transport
failures, but a row may be stored more than once. QWP/UDP is fire-and-forget:
it has no acknowledgement or retry, so rows can be lost. Storing each row
exactly once is the application's responsibility, and QuestDB provides the
mechanisms to make it routine.

Without [store-and-forward](/docs/high-availability/store-and-forward/concepts/),
unacknowledged rows live in memory and are lost if the process exits, or the
sender closes, before the server acknowledges them. A Node.js sender in
default memory mode also gives up after `reconnect_max_duration_millis` of
outage; see the
[Node.js client](/docs/connect/clients/nodejs/#ingestion-reconnect).
Server rejections and exhausted buffer capacity can also stop delivery; handle
those errors rather than assuming every attempted write will arrive.

This page explains where duplicates come from and how to suppress them.

## At-least-once vs exactly-once

| Property | Meaning | Where it comes from |
|----------|---------|---------------------|
| **At-most-once** | Each row reaches the server zero or one times. Rows can be lost. | A "fire and forget" client that does not retransmit on failure. |
| **At-least-once** | Each row reaches the server one or more times. No row is lost; duplicates are possible. | A client that retransmits unacknowledged data after a transport error. **This is the QuestDB client default.** |
| **At-most-once** | Each row reaches the server zero or one times. Rows can be lost. | Fire-and-forget delivery without ACKs or retries, such as QWP/UDP. |
| **At-least-once** | Each row reaches the server one or more times. Duplicates are possible. | QWP/WebSocket senders retry published batches while they retain them; disk-backed store-and-forward extends replay across process restarts. |
| **Exactly-once** | Each row is stored exactly once. | At-least-once delivery plus server-side deduplication on a key covering row identity. |

QuestDB's clients retransmit unacknowledged batches after transport errors,
host failovers, and process restarts. The trade-off is deliberate: losing
data silently is the worse failure mode. The cost is that the application
must tolerate or suppress duplicates.
QWP/WebSocket senders retransmit unacknowledged batches after transport errors
and host failovers, and across process restarts with store-and-forward. The
trade-off is deliberate: losing data silently is the worse failure mode. The
cost is that the application must tolerate or suppress duplicates.

## Where duplicates come from

Expand All @@ -38,7 +48,7 @@ the server confirms a batch, the client reconnects and re-sends. If the
server had already committed the batch but the acknowledgement was lost in
flight, the second send produces duplicates.

This path applies to every QuestDB client deployment.
This path applies to QWP/WebSocket senders, not QWP/UDP.

### Multi-host failover replay

Expand Down Expand Up @@ -112,12 +122,13 @@ If two distinct events can share `(ts, symbol, side)` and both should be
preserved, widen `UPSERT KEYS` to include a column that distinguishes them
— for example a `trade_id` or `seq` column.

:::warning DEDUP is required on tables behind multi-host failover
:::warning Use DEDUP behind multi-host failover when duplicates matter

When the client fails over from one primary to another, unacknowledged
batches are replayed against the new primary. Without `DEDUP UPSERT KEYS`
covering row identity, those replays produce duplicate rows in the target
table.
covering row identity, those replays can produce duplicate rows in the target
table. Enable DEDUP for exactly-once outcomes; applications that tolerate
occasional duplicates can skip it.

:::

Expand Down
2 changes: 1 addition & 1 deletion documentation/configuration/database-replication.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ better for constrained networks but more costly.

### replication.primary.throttle.window.duration

- **Default**: `10000`
- **Default**: `1000`
- **Reloadable**: no

The millisecond duration of the sliding window used to process replication
Expand Down
Loading
Loading