🎉 75% of content is free forever — Unlock Premium from $10/mo →
CW
đŸ’ŧ Servicesâ„šī¸ Aboutâœ‰ī¸ ContactView Pricing Plansfrom $10

Azure Cosmos DB: Global Distribution, Consistency & HTAP

Azure Data EngineeringAzure Cosmos DB⭐ Premium

Advertisement

Azure Cosmos DB: Global Distribution, Consistency & HTAP

Multi-model database with global distribution, turnkey replication, and guaranteed single-digit millisecond latency

Cosmos DB Architecture

Consistency Levels

LevelGuaranteesLatencyThroughputUse Case
StrongLinearizable readsHighestLowestFinancial transactions
Bounded StalenessReads lag by K versions or T secondsHighLowOrder tracking
SessionRead your writesMediumMediumUser profiles (default)
Consistent PrefixNo out-of-order readsMediumMediumSocial media feeds
EventualEventually consistentLowestHighestCounters, non-critical

Change Feed for Data Engineering

# Change Feed processor for real-time data sync
from azure.cosmos import CosmosClient, PartitionKey
from azure.cosmos.change_feed.change_feed_processor import ChangeFeedProcessor
import json

client = CosmosClient(
    "https://cosmos-prod.documents.azure.com:443/",
    {"masterKey": "your-key"}
)

database = client.get_database_client("telemetry")
container = database.get_container_client("events")

# Read change feed
import time
from datetime import datetime

start_time = datetime.utcnow()
continuation_token = None

while True:
    response = container.query_items_change_feed(
        start_time=start_time,
        continuation_token=continuation_token
    )
    
    for event in response:
        print(f"New/Modified: {event['id']}")
        print(f"Data: {json.dumps(event)}")
        
        # Process event (e.g., write to ADLS)
        process_to_data_lake(event)
    
    if response.continuation_token:
        continuation_token = response.continuation_token
        start_time = datetime.utcnow()
    
    time.sleep(5)  # Poll interval

def process_to_data_lake(event):
    from azure.storage.filedatalake import DataLakeServiceClient
    from azure.identity import DefaultAzureCredential
    
    credential = DefaultAzureCredential()
    datalake = DataLakeServiceClient(
        account_url="https://stdatalake001.dfs.core.windows.net",
        credential=credential
    )
    
    file_client = datalake.get_file_client(
        "curated",
        f"events/{event['date']}/{event['id']}.json"
    )
    
    file_client.upload_data(
        json.dumps(event),
        overwrite=True
    )
python
from azure.cosmos import CosmosClient, PartitionKey, exceptions

client = CosmosClient(
    "https://cosmos-prod.documents.azure.com:443/",
    DefaultAzureCredential()
)

database = client.create_database_if_not_exists(
    id="analytics",
    offer_throughput=4000
)

container = database.create_container(
    id="events",
    partition_key=PartitionKey(path="/deviceId"),
    default_ttl=2592000,  # 30 days
    offer_throughput=1000
)

# Upsert with TTL
container.upsert_item({
    "id": "event-001",
    "deviceId": "sensor-123",
    "temperature": 72.5,
    "timestamp": "2024-01-15T10:30:00Z",
    "ttl": 86400  # 24 hours (override default)
})

# Query with partition key (efficient)
items = container.query_items(
    query="SELECT * FROM c WHERE c.deviceId = @deviceId",
    parameters=[
        {"name": "@deviceId", "value": "sensor-123"}
    ],
    enable_cross_partition_query=False
)

# Cross-partition query (expensive)
all_items = container.query_items(
    query="SELECT * FROM c WHERE c.temperature > 70",
    enable_cross_partition_query=True
)

âš ī¸

Important: Cross-partition queries are expensive and slow. Always include the partition key in queries when possible. Use composite indexes for frequently queried non-partition-key fields.

Interview Questions

Q1: Explain the trade-off between consistency levels in Cosmos DB. A: Strong consistency provides the highest consistency but lowest throughput and highest latency. Eventual consistency provides the lowest latency and highest throughput but eventual consistency. Session consistency (default) provides read-your-writes guarantee within a session.

Q2: How do you choose a partition key for Cosmos DB? A: Choose a key with high cardinality (many distinct values) and even distribution. Avoid keys that create hot partitions (e.g., timestamps). Example: /deviceId for IoT data, /userId for user profiles.

Q3: What is the cost model for Cosmos DB? A: Cosmos DB charges for: 1) Request Units (RU/s) per second, 2) Storage (GB/month), 3) Network egress. RU consumption depends on operation type, item size, and index properties. Use Azure Cosmos DB Capacity Calculator to estimate costs.

🔒

Premium Content

Azure Cosmos DB: Global Distribution, Consistency & HTAP

You've previewed the first section. Unlock this full lesson and 900+ advanced tutorials with a Premium plan.

đŸŽ¯End-to-end Projects
đŸ’ŧInterview Prep
📜Certificates
🤝Community Access

Already a member? Log in

Advertisement