Google Cloud Pub/Sub alternative — Google Cloud Pub/Sub vs Skippr
Google Cloud Pub/Sub is Google's managed pub/sub. Topics take publishes. Subscriptions deliver: pull, push, BigQuery, or Cloud Storage. Schema Registry holds Avro, Protocol Buffer, or JSON Schema. Iceberg is not in the broker. A BigQuery subscription writes an existing BigQuery table as messages arrive; Google documents that the same path works for BigQuery-managed Iceberg tables (Parquet in your Cloud Storage bucket, catalog still BigQuery). A Cloud Storage subscription writes Text or Avro objects. Google's own note: if you wanted Parquet, use the BigQuery Iceberg subscription, not the bucket writer. Pub/Sub Lite is deprecated (new customers closed 24 Sep 2024). CDC is Datastream, not Pub/Sub. List throughput is 40 USD per TiB after the first 10 GiB of basic delivery; BigQuery and Cloud Storage export subscriptions are 50 USD per TiB with no free 10 GiB; import topics from Kinesis are 50 USD per TiB, from Cloud Storage / Event Hubs / MSK / Confluent Cloud 80 USD per TiB; retained messages 0.27 USD per GiB-month. UDF single-message transforms are 40 USD per TiB; AI inference SMTs 60 USD per TiB plus Gemini. This is not Iceberg ∪ WAL you query in one binary.
Skippr is an open Streamhouse you run as one Rust binary. Write skippr.yml (or the same thing in Python), discover, sync. You query live state over Iceberg ∪ WAL, and the history is ordinary Iceberg in your bucket. No Pub/Sub topic. ELT into a warehouse is one path, not the product.
| Feature | Skippr | Google Cloud Pub/Sub |
|---|---|---|
| Deploy | Single Rust binary, your VPC or on-prem | Google-managed topics and subscriptions |
| Schema | In-stream evolution, sibling columns | Optional topic schema (Avro / Protobuf / JSON Schema) |
| Storage | Open Iceberg on Parquet you own | The topic. Iceberg is a BigQuery-managed table via export |
| CDC | Log-based; fails closed if the dest cannot honour | Not Pub/Sub. Datastream (or an app) writes the topic |
| Query | skipprd query on Iceberg ∪ WAL; history in any Iceberg engine | Subscribers. Iceberg after BigQuery export |
| Pricing | Free self-hosted engine | 40 USD/TiB basic; 50 USD/TiB BigQuery or GCS export. |
What Google Cloud Pub/Sub is good at
A global bus many independent subscribers share, with push, pull, and two export subscriptions so you do not have to run a Dataflow job just to land bytes. That is the product. BigQuery-managed Iceberg from a subscription is why some GCP estates skip a second Spark writer. If the job is "this event onto this Google topic," that is a real product.
Where the job is wider
Pub/Sub is a message bus. It is not a Streamhouse. There is no Iceberg ∪ WAL. There is no skipprd query on in-flight lake rows. Cloud Storage subscriptions write Text or Avro, not Iceberg metadata. Postgres CDC still starts in Datastream or the application. Skippr has no Pub/Sub source today.
Topics, subscriptions, quotas, and the BigQuery or bucket bill are the ops. Skippr will not replace a Pub/Sub topic that already fans out to many subscribers. Skippr also will not run Pub/Sub. Datastream and Dataflow are separate pages.
If the job is "Pub/Sub we already staff," Pub/Sub is the narrower tool. If the job is live SQL on Iceberg you run, the topic was never that.
Getting started
Install skipprd from the install guide, or pip install skippr. The three tabs write the same skippr.yml. Then discover, sync, and query.
skippr:
workspace: analytics
skipprd_el_storage_mode: local
pipelines:
orders:
data_source: data_sources.app_db
data_sink: data_sinks.lake
data_sources:
app_db:
Postgres:
host: db.internal
user: skippr_reader
password: ${APP_DB_PASSWORD}
database: app
tables: [orders, customers]
cdc_mode: snapshot_then_cdc
data_sinks:
lake:
AthenaIceberg:
warehouse: s3://my-iceberg-warehouse/
glue_database_name: analytics
athena_workgroup_name: primary
athena_results_s3_bucket: my-athena-results
region: us-east-1
schema_sink: schema_sinks.lake_schema
schema_sinks:
lake_schema:
AthenaIceberg:
warehouse: s3://my-iceberg-warehouse/
glue_database_name: analytics
athena_workgroup_name: primary
athena_results_s3_bucket: my-athena-results
region: us-east-1skipprd --workspace analytics --storage-mode local connect data-source postgres \
--pipeline orders \
--name app_db \
--host db.internal \
--user skippr_reader \
--password '${APP_DB_PASSWORD}' \
--database app \
--tables orders \
--tables customers \
--cdc-mode snapshot_then_cdc
skipprd connect data-sink athenaiceberg \
--pipeline orders \
--name lake \
--warehouse s3://my-iceberg-warehouse/ \
--glue-database-name analytics \
--athena-workgroup-name primary \
--athena-results-s3-bucket my-athena-results \
--region us-east-1
skipprd connect schema-sink athenaiceberg \
--pipeline orders \
--name lake_schemafrom skippr import (
Config,
DataSinkAthenaIceberg,
DataSourcePostgres,
DataSourcePostgresSourceCdcMode,
EnvRef,
LocalStorage,
Pipeline,
)
cfg = Config().workspace("analytics").storage(LocalStorage())
app_db = cfg.data_source(
"app_db",
DataSourcePostgres(
host="db.internal",
user="skippr_reader",
password=EnvRef("APP_DB_PASSWORD"),
database="app",
tables=["orders", "customers"],
cdc_mode=DataSourcePostgresSourceCdcMode.SNAPSHOTTHENCDC,
),
)
lake = cfg.data_sink(
"lake",
DataSinkAthenaIceberg(
warehouse="s3://my-iceberg-warehouse/",
glue_database_name="analytics",
athena_workgroup_name="primary",
athena_results_s3_bucket="my-athena-results",
region="us-east-1",
),
schema_sink="lake_schema",
)
cfg.pipeline("orders", Pipeline(data_source=app_db, data_sink=lake))
cfg.save("skippr.yml")export APP_DB_PASSWORD='your-postgres-password'
skipprd discover --pipeline orders
skipprd sync --pipeline orders --once
skipprd query "SELECT count(*) FROM analytics.orders"Which to choose
Choose Pub/Sub if you want a Google-managed bus, and a BigQuery Iceberg export subscription on that topic is enough.
Choose Skippr if you want one binary, live SQL on Iceberg ∪ WAL, and files that stay yours. Skippr will not run Pub/Sub.
Install from Install. Connector and query reference live in Developer Docs. For optional onboarding in your VPC, Enterprise Jumpstart or Contact.
