feat: batch enqueue, delivery batching, and smart batching modes

Merged
VI
8mo ago
+1023-21

Summary

  • Add batchEnqueue(List<EnqueueMessage>) method for explicit batch enqueue via BatchEnqueue RPC
  • Add transparent delivery batching in consume stream -- unpacks ConsumeResponse.messages (repeated field) with singular message fallback for backward compatibility
  • Add BatchMode with three modes: AUTO (opportunistic, default), LINGER (timer-based), DISABLED
  • enqueue() now routes through background batcher by default (zero config, zero latency penalty at low load)
  • Single-item optimization: 1 message uses regular Enqueue RPC (preserves exact error types like QueueNotFoundException), 2+ messages use BatchEnqueue
  • close() drains pending batched messages before disconnecting
  • Update proto to include BatchEnqueue RPC and ConsumeResponse.messages repeated field

Test plan

  • BatchModeTest -- 7 unit tests for mode configuration and validation
  • BatchEnqueueResultTest -- 4 unit tests for success/error result types
  • BuilderTest -- 4 new tests for batch mode builder options (11 total)
  • BatchClientTest -- 8 integration tests: explicit batch, mixed queue results, auto batching, linger batching, disabled batching, multi-message consume, error propagation through batcher, default mode verification
  • All 34 tests pass (TlsAuthClientTest failure is pre-existing)

Generated with Claude Code


Summary by cubic

Adds explicit batch enqueue, client-side smart batching for enqueue(), and delivery batching for consume(). Default mode is AUTO, which coalesces messages under load without adding latency at low load.

  • New Features

    • Added batchEnqueue(List<EnqueueMessage>) with per-message BatchEnqueueResult.
    • Added delivery batching: consume() now unpacks ConsumeResponse.messages with singular fallback.
    • Introduced BatchMode: AUTO (default), LINGER, DISABLED.
    • enqueue() routes through a background batcher by default; 1 message uses Enqueue, 2+ use BatchEnqueue.
    • close() now drains pending batched messages.
    • Updated proto with BatchEnqueue RPC and batched ConsumeResponse.messages.
  • Migration

    • Requires a server that implements BatchEnqueue to benefit from batching; use withBatchMode(BatchMode.disabled()) to stay compatible with older servers.
    • No changes needed for consumers; the client transparently handles batched and single-message responses.