KubeMQ
ConnectorsGoogle Cloud Pub/SubReference

Capabilities

What the KubeMQ Pub/Sub connector supports — the 38 v1 RPCs across Publisher, Subscriber, SchemaService, and IAMPolicy stubs, and the operations it rejects.

This reference defines exactly what the embedded KubeMQ Pub/Sub connector supports, what it accepts-and-ignores, and what it rejects. The connector implements the real Pub/Sub v1 gRPC services — 38 RPCs total — so unmodified Google client libraries and gcloud pubsub talk to KubeMQ exactly as they would to Google's local emulator. Use it to decide which Pub/Sub SDK calls are safe to rely on and which ones are refused.

Milestone tags below: M1 core drop-in · M2 advanced delivery · M3 full parity.

The 38-RPC matrix

ServiceCount
google.pubsub.v1.Publisher9
google.pubsub.v1.Subscriber16
google.pubsub.v1.SchemaService10
google.iam.v1.IAMPolicy3 (permissive stubs)
Total38

Publisher (9)

#RPCMNotes
1CreateTopicM1Validates the name; kms_key_name accepted-and-ignored; ingestion configs rejected (INVALID_ARGUMENT); retention clamped to the broker ceiling. Backing log gcp.{t}
2GetTopicM1Returns the requested (un-clamped) retention
3ListTopicsM1Opaque page token
4DeleteTopicM1Tombstone — the record is retained so existing subscriptions survive; re-creating the topic reuses the log
5PublishM1Batch (≤ 1000); assigns id + publish-time; writes the topic log once, then fans out one queue copy per subscription (applying each sub's filter). M3 adds schema enforce-on-publish
6ListTopicSubscriptionsM1
7UpdateTopicM2FieldMask over labels, message_retention_duration, schema_settings
8ListTopicSnapshotsM3
9DetachSubscriptionM3Marks detached, drops backlog + leases; the subscription stays re-fillable by Seek

Subscriber (16)

#RPCMNotes
1CreateSubscriptionM1Binds to a topic; queue gcp.sub.{s} created lazily. Export subscriptions (BigQuery/Cloud Storage/Bigtable) and ingestion are rejected. Filter compiled at create-time (immutable)
2GetSubscriptionM1Returns the requested (un-clamped) retention
3ListSubscriptionsM1
4DeleteSubscriptionM1Drops backlog + leases
5UpdateSubscriptionM2FieldMask over ack deadline / retention / DLQ / retry / push / exactly-once / labels. name and filter are immutable
6PullM1max_messages ≤ 1000; a detached subscription → FAILED_PRECONDITION
7AcknowledgeM1Decodes ack_id → acks the broker sequence. Exactly-once subs return a status for invalid/expired ids (below)
8ModifyAckDeadlineM10 = immediate nack/redeliver; >0 = extend (10..600 s)
9StreamingPullM1Bidirectional; per-stream flow control; exactly-once confirmations; periodic server-initiated close every StreamCloseSeconds
10ModifyPushConfigM2Switch pull ↔ push; an empty config returns to pull
11SeekM3To a timestamp or a snapshot; replays the topic log into the subscription queue, bounded by MaxSeekReplay
12CreateSnapshotM3Cursor snapshot, 7-day default expiry
13GetSnapshotM3
14ListSnapshotsM3
15UpdateSnapshotM3May change labels and expire_time
16DeleteSnapshotM3

The 250 ms lease sweeper, retry backoff, dead-letter republish, and per-key ordering cursor are connector-internal mechanics behind these RPCs — see Subscribing and Reliability.

SchemaService (10, M3)

CreateSchema, GetSchema (BASIC/FULL), ListSchemas, ListSchemaRevisions, CommitSchema, RollbackSchema, DeleteSchemaRevision (keeps ≥ 1), DeleteSchema, ValidateSchema, ValidateMessage — over Avro and Protobuf definitions, each with server-assigned revision ids and full revision history. A definition that fails to parse → INVALID_ARGUMENT; definitions are capped at 300 KB. See Schema Validation.

IAMPolicy (3, M2)

GetIamPolicy returns an empty Policy{Version: 3}; SetIamPolicy and TestIamPermissions echo the request. These are permissive stubs — there is no IAM enforcement (emulator parity). The connector runs with no authentication.

Feature support

FeatureSupported?Notes
Basic publish / pull / ackM1 core drop-in
Batch publish (≤ 1000)Atomic — the whole batch is validated before anything is enqueued
StreamingPull + flow controlPer-stream max_outstanding_messages / _bytes; ≤ 0 = unlimited (capped by MaxOutstandingMessages)
Ordering keysenable_message_ordering; at most one in flight per key, in-order redelivery
Attribute filteringCEL-subset, attributes-only, ≤ 256 chars, immutable, applied at fan-out
Dead-letter topicdead_letter_topic + max_delivery_attempts (5..100)
Push deliveryWrapped JSON envelope or no_wrapper; optional OIDC Bearer; HTTPS (HTTP only for localhost)
Exactly-once delivery(node-local)enable_exactly_once_delivery; an ack_id is valid only on the node that minted it
Seek to timestamp / snapshotReplays the topic log; a pre-window timestamp clamps to the earliest retained message
Snapshots7-day default expiry, swept hourly
Schema validation (Avro / Protobuf)Enforce-on-publish; whole batch rejected on the first non-conforming message
Cross-protocol interopPub/Sub publish ⇄ native KubeMQ consume on Events Store gcp.{t}
IAM enforcementPermissive stubs only; no enforcement

Accepted-and-ignored / rejected

These are documented non-goals. They are never used as working examples, and most are actively rejected by the connector with the error code shown:

Operation / fieldBehavior
kms_key_name (on CreateTopic)accepted and ignored — no KMS in emulator mode
Project segment projects/{p}/…parsed, validated, then ignored — single-tenant; resource ids are global across projects
Ingestion sources (topic / subscription)rejected (INVALID_ARGUMENT) — no KubeMQ analog
Export subscriptions (BigQuery / Cloud Storage / Bigtable)rejected (INVALID_ARGUMENT)
REST / JSON v1 (grpc-gateway)not served — gRPC only
Google OAuth2 / JWT / IAMnot validated — emulator mode, no auth

The documented gotchas

These behaviors deviate from real Google Cloud Pub/Sub and are easy to miss until a corner case hits production. Each is documented in depth where shown:

#GotchaWhere documented
1Exactly-once is node-local — an ack_id minted on one node is invalid on another; pin a subscription's StreamingPull to one node (sticky LB) or accept at-least-once across nodesSubscribing, Reliability, Migrating from Google Cloud Pub/Sub
2Project id parsed but ignored — resource ids are global across projectsGetting Started, Channel Mapping
3Credentials cleared / insecure path when PUBSUB_EMULATOR_HOST is set — the SDK skips Google auth and dials insecure gRPCConnectivity & Emulator Mode
4Filtering is an attributes-only CEL-subset — malformed → INVALID_ARGUMENTMessage Filtering, Limits & Rules
5Retention clamped to the broker maximumGetTopic / GetSubscription echo the requested value; fan-out, seek, and the dashboard use the clamped valueLimits & Rules, Seek & Snapshots
6max_delivery_attempts must be 5..100 (0 = unset)Reliability, Limits & Rules
7Topic ids may not start with sub. (reserved namespace)Channel Mapping, Limits & Rules
8Seek of a pre-window timestamp clamps to the earliest retained message (not an error)Seek & Snapshots
9gRPC only — no REST/JSON v1 (grpc-gateway not used)Architecture, this page

Two further documented deviations are surfaced in the reference docs but are not headline gotchas: the unary invalid-ack returns FAILED_PRECONDITION + ErrorInfo(PERMANENT_FAILURE_INVALID_ACK_ID) (matching the real SDK contract, not a literal INVALID_ARGUMENT), and export subscriptions / ingestion are rejected while kms_key_name is accepted-and-ignored. Both live in Error Codes and Migrating from Google Cloud Pub/Sub.

Was this page helpful?

On this page