Quick Start¶
This guide will walk you through the basic concepts and operations in Skarv.
Basic Concepts¶
Skarv is built around three main concepts:
- Publishing: Putting data into the system with a key
- Subscribing: Listening for data with matching keys
- Retrieving: Getting stored data by key patterns
Your First Skarv Application¶
Let's create a simple sensor monitoring system:
import skarv
import time
# Subscribe to temperature sensor data
@skarv.subscribe("sensor/temperature")
def handle_temperature(sample):
print(f"Temperature: {sample.value}°C")
# Subscribe to all sensor data
@skarv.subscribe("sensor/*")
def handle_all_sensors(sample):
print(f"All sensors - {sample.key_expr}: {sample.value}")
# Simulate sensor readings
skarv.put("sensor/temperature", 22.5)
skarv.put("sensor/humidity", 65.2)
skarv.put("sensor/pressure", 1013.25)
# Wait a moment for processing
time.sleep(0.1)
This will output:
Temperature: 22.5°C
All sensors - sensor/temperature: 22.5
All sensors - sensor/humidity: 65.2
All sensors - sensor/pressure: 1013.25
Key Expressions¶
Skarv uses key expressions for flexible message routing:
# Exact match
skarv.put("device/001/status", "online")
# Wildcard patterns
@skarv.subscribe("device/*/status") # Matches any device status
@skarv.subscribe("sensor/**") # Matches all sensor data
@skarv.subscribe("*/temperature") # Matches any temperature reading
Retrieving Data¶
You can retrieve stored data using key patterns:
# Store some data
skarv.put("device/001/temperature", 23.5)
skarv.put("device/002/temperature", 24.1)
skarv.put("device/001/humidity", 65.2)
# Retrieve all device temperatures
temperatures = skarv.get("device/*/temperature")
print(temperatures)
# Output: [Sample(key_expr='device/001/temperature', value=23.5),
# Sample(key_expr='device/002/temperature', value=24.1)]
# Retrieve all data for device 001
device_001_data = skarv.get("device/001/*")
print(device_001_data)
# Output: [Sample(key_expr='device/001/temperature', value=23.5),
# Sample(key_expr='device/001/humidity', value=65.2)]
Using Middleware¶
Middleware allows you to transform data as it flows through the system:
import skarv
from skarv.middlewares import throttle, average
# Throttle temperature updates to at most once every 5 seconds
skarv.register_middleware("sensor/temperature", throttle(5.0))
# Average humidity readings over 10 samples
skarv.register_middleware("sensor/humidity", average(10))
@skarv.subscribe("sensor/temperature")
def handle_throttled_temperature(sample):
print(f"Throttled temperature: {sample.value}°C")
@skarv.subscribe("sensor/humidity")
def handle_averaged_humidity(sample):
print(f"Averaged humidity: {sample.value}%")
# These will be processed by middleware
skarv.put("sensor/temperature", 22.5)
skarv.put("sensor/humidity", 65.2)
Complete Example: IoT Dashboard¶
Here's a more complete example simulating an IoT dashboard:
import skarv
import time
import random
# Dashboard handlers
@skarv.subscribe("sensor/temperature")
def update_temperature_display(sample):
print(f"🌡️ Temperature: {sample.value}°C")
@skarv.subscribe("sensor/humidity")
def update_humidity_display(sample):
print(f"💧 Humidity: {sample.value}%")
@skarv.subscribe("device/*/status")
def update_device_status(sample):
device_id = str(sample.key_expr).split('/')[1]
print(f"📱 Device {device_id}: {sample.value}")
@skarv.subscribe("alert/*")
def handle_alerts(sample):
print(f"🚨 ALERT: {sample.key_expr} - {sample.value}")
# Simulate sensor readings
def simulate_sensors():
while True:
# Temperature fluctuates around 22°C
temp = 22 + random.uniform(-2, 2)
skarv.put("sensor/temperature", round(temp, 1))
# Humidity fluctuates around 65%
humidity = 65 + random.uniform(-5, 5)
skarv.put("sensor/humidity", round(humidity, 1))
# Check for alerts
if temp > 24:
skarv.put("alert/high_temperature", f"Temperature too high: {temp}°C")
time.sleep(2)
# Start simulation
print("Starting IoT Dashboard...")
simulate_sensors()
Next Steps¶
Now that you understand the basics: