Small IoT/edge project in Go.
- MQTT telemetry flow:
device-simulator -> mosquitto -> edge-service - Edge-side telemetry validation and anomaly alerts (
temperature > 8C) - HTTP API for health and current state
- Reliability feature: local buffering + retry forwarding when backend is unavailable
- Minimal Kubernetes deployment for all components
device-simulator
|
| MQTT publish (QoS 1)
v
mosquitto broker
|
| MQTT subscribe (devices/+/telemetry)
v
edge-service
- validate telemetry
- detect alerts
- expose HTTP API
- forward to backend with local buffer/retry
|
v
mock-backend
Start services in this order.
Terminal 1 (broker):
docker run -d --name mosquitto -p 1883:1883 \
-v "$(pwd)/infra/mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf:ro" \
eclipse-mosquitto:2Terminal 2 (mock backend):
go run ./cmd/mock-backendTerminal 3 (edge service):
BACKEND_INGEST_URL=http://localhost:9999/ingest go run ./cmd/edge-serviceTerminal 4 (device simulator):
go run ./cmd/device-simulatorcurl -s http://localhost:8080/health
curl -s http://localhost:8080/devices
curl -s http://localhost:8080/alerts
curl -s http://localhost:8080/buffer
curl -s "http://localhost:9999/events?limit=5"- If backend forwarding fails, edge-service stores events in a local
JSONLbuffer. - A periodic flush retries buffered events.
GET /buffershows queue size and buffer file path.
Manifests are in k8s/:
00-namespace.yaml01-configmap.yaml02-mosquitto.yaml03-mock-backend.yaml04-edge-service.yaml05-device-simulator.yaml
Apply:
kubectl apply -f k8s/
kubectl get pods -n edge-monitoring
kubectl get svc -n edge-monitoringIf your cluster cannot see local Docker images, load/tag them first.
Example for kind:
kind load docker-image edgedevicemonitoringservice-edge-service:latest
kind load docker-image edgedevicemonitoringservice-device-simulator:latest
kind load docker-image edgedevicemonitoringservice-mock-backend:latestPort-forward for local checks:
kubectl port-forward -n edge-monitoring svc/edge-service 8080:8080
kubectl port-forward -n edge-monitoring svc/mock-backend 9999:9999Then test:
curl -s http://localhost:8080/health
curl -s http://localhost:8080/devices
curl -s http://localhost:8080/buffer
curl -s "http://localhost:9999/events?limit=5"Cleanup:
kubectl delete namespace edge-monitoringlookup mock-backend ... no such hostin edge-service:- mock backend may be down; restart
go run ./cmd/mock-backend.
- mock backend may be down; restart
- Port conflicts (
1883,8080,9999):- stop old containers/processes and restart.
- Broker cleanup:
docker rm -f mosquitto
Edge service:
GET /healthGET /devicesGET /alertsGET /buffer
Mock backend:
GET /healthPOST /ingestGET /events?limit=20