Google Cloud Pub/Sub Core Knowledge
Full Reference: See advanced.md for Java/Python/Go producer patterns, Spring Cloud GCP consumer, push subscription handlers, and Terraform for DLT, IAM, VPC Service Controls, and monitoring alerts.
Deep Knowledge: Use
mcp__documentation__fetch_docswith technology:google-pubsubfor comprehensive documentation.
Quick Start (Emulator)
# docker-compose.yml
services:
pubsub:
image: gcr.io/google.com/cloudsdktool/google-cloud-cli:emulators
command: gcloud beta emulators pubsub start --host-port=0.0.0.0:8085
ports:
- "8085:8085"
docker-compose up -d
# Set emulator env
export PUBSUB_EMULATOR_HOST=localhost:8085
# Create topic and subscription
gcloud pubsub topics create orders
gcloud pubsub subscriptions create order-processor --topic=orders
# Test
gcloud pubsub topics publish orders --message='{"id":"123"}'
gcloud pubsub subscriptions pull order-processor --auto-ack
Core Concepts
| Concept | Description | |---------|-------------| | Topic | Named resource for publishing messages | | Subscription | Named resource for receiving messages | | Publisher | Sends messages to topic | | Subscriber | Receives messages from subscription | | Ack Deadline | Time to acknowledge before redelivery | | Message Retention | How long unacked messages are kept |
Delivery Types
| Type | Description | Use Case | |------|-------------|----------| | Pull | Subscriber requests messages | Batch processing, variable load | | Push | Pub/Sub sends to endpoint | Serverless, webhooks | | BigQuery | Direct export to BigQuery | Analytics pipelines | | Cloud Storage | Direct export to GCS | Data archival |
Architecture
Publisher ──▶ Topic ──▶ Subscription 1 (Pull) ──▶ Subscriber
──▶ Subscription 2 (Push) ──▶ Cloud Run
──▶ Subscription 3 ──▶ BigQuery
Node.js Producer (@google-cloud/pubsub)
import { PubSub } from '@google-cloud/pubsub';
const pubsub = new PubSub({
projectId: 'my-project',
});
const topic = pubsub.topic('orders');
// Publish single message
const messageId = await topic.publishMessage({
data: Buffer.from(JSON.stringify(order)),
attributes: {
'correlation-id': correlationId,
'order-type': order.type,
},
orderingKey: order.customerId, // For ordered delivery
});
// Batch publishing (automatic batching)
const publishOptions = {
batching: {
maxMessages: 100,
maxMilliseconds: 10,
},
};
const batchTopic = pubsub.topic('orders', publishOptions);
Node.js Consumer (Pull Subscription)
const subscription = pubsub.subscription('order-processor', {
flowControl: {
maxMessages: 100,
maxExtensionMinutes: 10,
},
ackDeadline: 30,
});
const messageHandler = async (message) => {
try {
const order = JSON.parse(message.data.toString());
const correlationId = message.attributes['correlation-id'];
await processOrder(order);
message.ack();
} catch (error) {
console.error('Processing failed:', error);
message.nack(); // Will be redelivered
}
};
subscription.on('message', messageHandler);
subscription.on('error', (error) => console.error('Subscription error:', error));
// Graceful shutdown
process.on('SIGTERM', async () => {
await subscription.close();
});
Dead Letter Topics
# Create DLT
gcloud pubsub topics create orders-dlq
gcloud pubsub subscriptions create orders-dlq-sub --topic=orders-dlq
# Create subscription with DLT
gcloud pubsub subscriptions create order-processor \
--topic=orders \
--dead-letter-topic=orders-dlq \
--max-delivery-attempts=5
When NOT to Use This Skill
Use alternative messaging solutions when:
- AWS-native architecture - SQS has better AWS integration
- Azure-native architecture - Use Azure Service Bus
- Event streaming with replay - Use Dataflow or Kafka
- On-premise deployment - Use RabbitMQ or ActiveMQ
- Multi-cloud portability - Use Kafka or RabbitMQ
- Complex routing patterns - RabbitMQ provides more flexibility
- JMS compliance required - Use ActiveMQ
Anti-Patterns
| Anti-Pattern | Why It's Bad | Solution | |--------------|--------------|----------| | No dead letter topic | Failed messages lost | Configure DLT for all subscriptions | | Short ack deadline | Duplicate processing | Set deadline > max processing time | | No retry policy | Immediate redelivery on failure | Configure exponential backoff | | Synchronous publish | Poor throughput | Use batching and async publish | | Pull without flow control | Consumer overwhelmed | Set max_messages limit | | No message ordering when needed | Out of order processing | Use ordering keys | | Large message payloads | Higher costs, poor performance | Use Cloud Storage with reference | | No IAM least privilege | Security risk | Use service accounts with minimal roles |
Quick Troubleshooting
| Issue | Likely Cause | Fix | |-------|--------------|-----| | Messages not received | No subscription or wrong topic | Create subscription, verify topic | | Duplicate messages | Ack deadline expired | Increase ack deadline or process faster | | Messages in DLT | Max delivery attempts exceeded | Check processing logic, review DLT | | Permission denied | Missing IAM roles | Grant Publisher/Subscriber roles | | Ordering not working | No ordering key or wrong subscription | Set ordering key, enable message ordering | | High latency | Batching delay or network | Reduce batch delay, check network | | Push subscription failing | Endpoint down or auth failure | Check endpoint health, verify auth | | Backlog growing | Slow consumers | Add consumers or optimize processing |
Production Readiness
Monitoring Metrics
| Metric | Alert Threshold | |--------|-----------------| | num_undelivered_messages | > 10000 | | oldest_unacked_message_age | > 3600s | | num_outstanding_messages | > 10000 | | dead_letter_message_count | > 0 | | publish_latencies | p99 > 1s |
Checklist
- [ ] IAM roles with least privilege
- [ ] Service account per component
- [ ] Dead letter topic configured
- [ ] Retry policy configured
- [ ] Ack deadline appropriate
- [ ] Message retention set
- [ ] Monitoring alerts configured
- [ ] Schema validation (if needed)
- [ ] Message ordering (if needed)
- [ ] VPC Service Controls (if needed)
Reference Documentation
Deep Knowledge: Use
mcp__documentation__fetch_docswith technology:google-pubsubfor comprehensive documentation.
Available topics: basics, producers, consumers, production
微信扫一扫