Monthly Review — Month 5: gRPC, Architecture & Microservices¶
🎬 Headline¶
I can design, build, test, document, and release a real gRPC + Redis-queue microservice — hexagonally layered, resilient (retries/backoff/jitter/DLQ), observable (metrics), and operable (health, reflection, graceful shutdown).
🛠️ Skills Acquired¶
| Skill | Confidence (1-5) | Evidence (link) |
|---|---|---|
| Protobuf/gRPC wire & error model | 4 | examples/month-05/protowire, statuscodes |
| Interceptors, TLS, REST transcoding | 4 | interceptors, tls, transcoding |
| gRPC service skeleton + graceful lifecycle | 3 | Day 134 |
| Hexagonal architecture / ports & adapters | 4 | hexagonal, manualdi |
| Redis-backed queue + worker pool | 3 | jobqueue, workerpool |
| Resilience: backoff, jitter, DLQ, idempotency | 4 | retry, exercises/.../deadletter |
| Race-clean tests + Prometheus-style metrics | 3 | metrics, exercises/.../metrics |
| Docs & ADRs | 4 | Day 139 |
📦 Projects Completed¶
- Capstone: gRPC + Redis job-queue microservice — gRPC API → hexagonal core → Redis queue → resilient workers → metrics → docs/ADRs. Key learning: a service is a domain core wrapped in adapters wrapped in middleware; resilience and observability are first-class, not afterthoughts.
💡 Lessons Learned¶
- Dependencies point inward: the core owns its ports; adapters conform and translate infra errors to domain errors.
GracefulStopoverStop; drive shutdown fromsignal.NotifyContext.- Redis lists are queues;
BRPOPLPUSHbuys at-least-once delivery, which forces idempotent handlers. - Only the producer closes a channel, once; buffered capacity is backpressure.
- Retry only transient errors, with overflow-safe backoff + full jitter, under a budget; dead-letter the rest with a
%w-wrapped cause. - Sort label keys, avoid unbounded label cardinality, and run concurrency tests under
-race. - ADRs freeze the why so settled design debates stay settled.
📉 Areas for Improvement¶
- Streaming RPCs (interceptors + tests) — still the thinnest spot from Week 2.
- Operational depth: reclaiming stuck jobs, picking budgets/caps from SLOs, DLQ re-drive tooling.
- Metrics interceptor and histograms with sensible custom buckets.
🔁 Concepts to Keep Reviewing (carry into spaced repetition)¶
- Interceptor chain order (first = outermost) and TLS trust model (CA/SAN/validity).
- Channel axioms: closed-channel receive, who-closes, nil-channel blocking.
errors.Is/Asvs string matching;%wwrapping.- At-least-once ⇒ idempotency; backoff + full jitter; DLQ.
🧑💼 Interview Readiness¶
| Area | Ready? | Notes |
|---|---|---|
| Language fundamentals | ✅ | Solid since Months 1–2; reinforced via interface design this month. |
| Concurrency | ✅ | Worker pool, channel ownership, -race, context cancellation. |
| Web/DB | ✅ | M4 REST/DB + this month's gRPC/transcoding/Redis. |
| Architecture & systems design | 🟧 | Can explain hexagonal, queue-based decoupling, retries/DLQ/idempotency; want more on scaling/streaming. |
| Observability | 🟧 | Metrics fundamentals (RED) in hand; tracing/logging depth comes in Month 6. |
🎒 Portfolio Updates¶
- Updated capstone README (quickstart, grpcurl example, architecture sketch)
- New résumé bullet: "Built a hexagonally-layered gRPC microservice with a Redis-backed job queue, resilient retries/dead-letter, and Prometheus-style metrics in Go."
- Pinned/featured: the Month 5 capstone repo path
- Tagged release
v0.5.0+ wrote release notes - Authored ADRs (hexagonal layering, Redis broker, at-least-once + idempotency)
📊 Metrics¶
| Total hours | Days completed | Exercises | Projects | Books/articles | Avg confidence |
|---|---|---|---|---|---|
| 42 | 28/28 | 9 | 1 | 12 | 3.6/5 |
⏭️ Next Month Preview¶
Month 6 — Production, Observability & Capstone: structured logging, metrics in depth, distributed tracing across the queue boundary, containerization/deployment, load testing, and the final capstone polish toward v0.6.0.
Suggested commit: docs(journal): month 5 review then git tag -a v0.5.0 -m "Month 5 complete"