Skip to main content
โšก Calmops

Edge Computing: Building Distributed Systems at the Network Edge

Introduction

Edge computing brings computation and data storage closer to where data is generated. This reduces latency, saves bandwidth, and enables real-time processing essential for IoT, autonomous vehicles, and immersive experiences. This guide covers edge computing architecture, implementation patterns, and building production edge systems.

Edge Computing Architecture

The Edge Hierarchy

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   Edge Computing Hierarchy                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                             โ”‚
โ”‚  Cloud (Central)                                            โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚ - Heavy compute, storage                            โ”‚   โ”‚
โ”‚  โ”‚ - Complex analytics, ML training                    โ”‚   โ”‚
โ”‚  โ”‚ - Historical data analysis                          โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                           โ”‚                                 โ”‚
โ”‚  Fog Layer (Regional)                                     โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚ - Regional aggregation                              โ”‚   โ”‚
โ”‚  โ”‚ - Data filtering, batching                          โ”‚   โ”‚
โ”‚  โ”‚ - Short-term storage                                โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                           โ”‚                                 โ”‚
โ”‚  Edge (Device)                                             โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚ - Real-time processing                              โ”‚   โ”‚
โ”‚  โ”‚ - Local inference                                   โ”‚   โ”‚
โ”‚  โ”‚ - Sensor data collection                           โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                                                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Edge Device Programming

Embedded Linux

# Raspberry Pi / Edge device Python
import board
import digitalio
import adafruit_dht
import time

class EdgeSensorNode:
    """Run on edge device for local processing."""
    
    def __init__(self):
        self.dht = adafruit_dht.DHT22(board.D4)
        self.led = digitalio.DigitalInOut(board.LED)
        self.led.direction = digitalio.Direction.OUTPUT
    
    def read_sensors(self) -> dict:
        """Read all connected sensors."""
        try:
            temperature = self.dht.temperature
            humidity = self.dht.humidity
            
            return {
                "temperature": temperature,
                "humidity": humidity,
                "timestamp": time.time()
            }
        except Exception as e:
            return {"error": str(e)}
    
    def process_locally(self, data: dict) -> dict:
        """Apply local processing rules."""
        # Simple anomaly detection
        if data.get("temperature", 0) > 30:
            self.led.value = True  # Alert LED
            data["alert"] = True
        
        return data
    
    def run(self, interval: int = 60):
        """Main loop."""
        while True:
            data = self.read_sensors()
            processed = self.process_locally(data)
            
            # Send to gateway/cloud
            self.transmit(processed)
            
            time.sleep(interval)

Containerized Edge

# Edge device container
FROM python:3.11-slim AS builder

COPY requirements.txt .
RUN pip install --target=/install -r requirements.txt

FROM python:3.11-slim

COPY --from=builder /install /usr/local/lib/python3.11/site-packages

COPY app.py .
COPY models/ ./models/

# Run as non-root user
RUN useradd -m -u 1000 edgeuser
USER edgeuser

CMD ["python", "app.py"]

Edge Orchestration

Kubernetes at the Edge

# Edge Kubernetes deployment
apiVersion: v1
kind: Pod
metadata:
  name: edge-ai-processor
  labels:
    node-type: edge
spec:
  nodeSelector:
    kubernetes.io/arch: arm64
  containers:
    - name: processor
      image: edge-ai:latest
      resources:
        limits:
          memory: "512Mi"
          cpu: "500m"
      volumeMounts:
        - name: models
          mountPath: /models
        - name: config
          mountPath: /config
  volumes:
    - name: models
      persistentVolumeClaim:
        claimName: edge-models-pvc
    - name: config
      configMap:
        name: edge-config

K3s: Lightweight Kubernetes

# K3s installation on edge device
curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="644" sh -

# Register as edge node
k3s agent --server https://k3s-server:6443 \
  --token-file /var/lib/rancher/k3s/server/agent-token

Edge AI

Model Optimization

# Quantization for edge deployment
import torch

def quantize_model(model_path: str, output_path: str):
    """Quantize model for edge deployment."""
    
    # Load model
    model = torch.load(model_path)
    model.eval()
    
    # Dynamic quantization
    quantized = torch.quantization.quantize_dynamic(
        model,
        {torch.nn.Linear, torch.nn.Conv2d},
        dtype=torch.qint8
    )
    
    # Save
    torch.jit.save(quantized, output_path)
    
    return quantized

# Pruning for edge
def prune_model(model, amount: float = 0.5):
    """Prune model weights."""
    import torch.nn.utils.prune as prune
    
    for name, module in model.named_modules():
        if isinstance(module, torch.nn.Conv2d):
            prune.l1_unstructured(
                module, 
                name='weight', 
                amount=amount
            )
            prune.remove(module, 'weight')
    
    return model

Inference at Edge

# TensorFlow Lite inference
import tflite_runtime.interpreter as tflite

class EdgeInference:
    """Lightweight inference engine."""
    
    def __init__(self, model_path: str):
        self.interpreter = tflite.Interpreter(
            model_path=model_path,
            num_threads=4
        )
        self.interpreter.allocate_tensors()
        
        self.input_details = self.interpreter.get_input_details()
        self.output_details = self.interpreter.get_output_details()
    
    def predict(self, input_data):
        """Run inference."""
        # Set input
        self.interpreter.set_tensor(
            self.input_details[0]['index'],
            input_data
        )
        
        # Run
        self.interpreter.invoke()
        
        # Get output
        output = self.interpreter.get_tensor(
            self.output_details[0]['index']
        )
        
        return output

Data Synchronization

Edge-Cloud Sync

import asyncio
import sqlite3

class EdgeDataSync:
    """Synchronize edge data with cloud."""
    
    def __init__(self, db_path: str, cloud_endpoint: str):
        self.db_path = db_path
        self.cloud_endpoint = cloud_endpoint
        self.local_db = self.init_local_db()
    
    def init_local_db(self):
        """Initialize local SQLite."""
        conn = sqlite3.connect(self.db_path)
        conn.execute("""
            CREATE TABLE IF NOT EXISTS readings (
                id INTEGER PRIMARY KEY,
                timestamp REAL,
                temperature REAL,
                humidity REAL,
                synced INTEGER DEFAULT 0
            )
        """)
        return conn
    
    def store_locally(self, data: dict):
        """Store data locally first."""
        self.local_db.execute(
            """INSERT INTO readings 
               (timestamp, temperature, humidity) 
               VALUES (?, ?, ?)""",
            (data["timestamp"], data["temperature"], data["humidity"])
        )
        self.local_db.commit()
    
    async def sync_to_cloud(self):
        """Sync unsynced data to cloud."""
        cursor = self.local_db.execute(
            "SELECT * FROM readings WHERE synced = 0"
        )
        unsynced = cursor.fetchall()
        
        if not unsynced:
            return
        
        # Batch upload
        batch = [dict(row) for row in unsynced]
        
        response = await self.cloud_upload(batch)
        
        if response.success:
            # Mark as synced
            ids = [row[0] for row in unsynced]
            placeholders = ','.join('?' * len(ids))
            self.local_db.execute(
                f"UPDATE readings SET synced = 1 WHERE id IN ({placeholders})",
                ids
            )
            self.local_db.commit()

Use Cases

1. Smart Manufacturing

# Manufacturing edge application
class QualityInspectionEdge:
    """Real-time quality inspection on factory floor."""
    
    def __init__(self):
        self.model = EdgeInference("quality_model.tflite")
        self.camera = Camera()
    
    def inspect(self):
        """Run inspection on product."""
        # Capture image
        image = self.camera.capture()
        
        # Preprocess
        input_data = self.preprocess(image)
        
        # Local inference
        prediction = self.model.predict(input_data)
        
        # Make decision
        if prediction["defect_probability"] > 0.8:
            self.trigger_rejection()
        
        return prediction

2. Autonomous Vehicles

# Vehicle edge computing
class VehicleEdge:
    """Vehicle-based edge processing."""
    
    def __init__(self):
        self.lidar = LidarSensor()
        self.camera = Cameras()
        self.models = {
            "detection": load_model("vehicle_detect.tflite"),
            "segmentation": load_model("road_segment.tflite")
        }
    
    def process_perception(self):
        """Real-time perception processing."""
        # Parallel sensor processing
        lidar_data = self.lidar.read()
        camera_data = self.camera.read()
        
        # Local inference
        detections = self.models["detection"](lidar_data)
        segmentation = self.models["segmentation"](camera_data)
        
        # Fuse results
        perception = self.fuse_perception(detections, segmentation)
        
        return perception
    
    def latency_critical_processing(self):
        """Safety-critical processing with minimal latency."""
        # Direct hardware access for minimal latency
        # ...
        pass

3. Smart Retail

# Retail edge application
class RetailEdge:
    """In-store edge processing."""
    
    def __init__(self):
        self.cameras = CameraSystem()
        self.product_recognition = load_model("products.tflite")
        self.inventory_system = InventorySystem()
    
    def analyze_store(self):
        """Real-time store analytics."""
        for camera in self.cameras:
            frame = camera.get_frame()
            
            # Product detection
            products = self.product_recognition.detect(frame)
            
            # Update inventory
            for product in products:
                self.inventory_system.update_count(
                    product.sku,
                    product.location,
                    product.count
                )

Security at the Edge

Secure Communication

# Edge device security
class SecureEdgeCommunication:
    """Encrypted communication for edge devices."""
    
    def __init__(self, device_cert: str, ca_cert: str):
        self.context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
        self.context.load_verify_locations(ca_cert)
        self.context.load_cert_chain(device_cert)
    
    def send_secure(self, data: dict, endpoint: str):
        """Send encrypted data to cloud."""
        payload = json.dumps(data)
        
        with self.context.wrap_socket(
            socket.socket(), 
            server_hostname=endpoint
        ) as sock:
            sock.connect((endpoint, 443))
            sock.send(payload.encode())

Best Practices

1. Design for Intermittent Connectivity

# Handle offline operation
class OfflineFirst:
    def __init__(self):
        self.local_store = LocalStorage()
        self.sync_manager = SyncManager()
    
    def write(self, data):
        # Always write locally first
        self.local_store.save(data)
        
        # Try to sync when possible
        if self.is_connected():
            self.sync_manager.sync()

2. Minimize Data Transfer

# Filter at edge
class EdgeFilter:
    """Filter data before transmission."""
    
    def should_transmit(self, data: dict) -> bool:
        # Only send significant changes
        if self.has_significant_change(data):
            return True
        
        # Periodic transmission
        if self.time_for_periodic_send():
            return True
        
        return False

3. Monitor Edge Health

# Edge device monitoring
edge_metrics = {
    "cpu_usage": "System CPU utilization",
    "memory_usage": "RAM utilization",
    "disk_usage": "Storage space",
    "network_status": "Connectivity state",
    "model_inference_time": "ML model latency",
    "battery_level": "Power state (if battery-backed)"
}

Conclusion

Edge computing enables real-time, responsive applications. Key points:

  • Process locally: Reduce latency, enable real-time decisions
  • Design for offline: Handle intermittent connectivity gracefully
  • Optimize models: Quantize and prune for edge deployment
  • Secure devices: Implement device authentication and encrypted communication
  • Sync intelligently: Batch and filter data to minimize transfer

As IoT and immersive experiences grow, edge computing becomes essential for responsive applications.

Comments