HTTP Sync Target
Forward every row change to a downstream HTTP service as batched POST requests.
Configuration
targets = [{
type = http-sync
base_url = "https://downstream.example.com/api/sync"
batch_size = 500
flush_interval = 200ms
timeout_ms = 5000
retry_count = 3
retry_backoff_ms = 500
auth_header = "Bearer ..."
headers {
X-Source = laredo
}
}]
HTTP protocol
Baseline
POST {base_url}/baseline/start → {"table": {...}, "columns": [...]}
POST {base_url}/baseline/batch → {"table": {...}, "rows": [{...}, ...]} (repeated)
POST {base_url}/baseline/complete → {"table": {...}}
Changes
POST {base_url}/changes → {
"table": {"schema": "public", "table": "config_document"},
"changes": [
{"action": "INSERT", "lsn": "0/1A2B3C4D", "columns": {...}},
{"action": "UPDATE", "lsn": "0/1A2B3C50", "columns": {...}, "identity": {...}},
...
]
}
Batching
Changes are buffered internally and flushed when either condition is met:
- Buffer reaches
batch_size flush_intervalelapses
This batching is transparent to the ACK system — IsDurable() returns true only after a batch is flushed and a 2xx response is received. Buffered-but-unflushed changes are not considered durable.
Retry
On HTTP failure, the target retries with exponential backoff up to retry_count times. If all retries are exhausted, the error propagates to the pipeline error policy.
Library usage
target := httpsync.New(
httpsync.BaseURL("https://downstream.example.com/api/sync"),
httpsync.BatchSize(500),
httpsync.FlushInterval(200 * time.Millisecond),
httpsync.Timeout(5 * time.Second),
httpsync.AuthHeader("Bearer ..."),
)