Skip to content

Monthly Review — Month 5: gRPC, Architecture & Microservices

Journal index · Roadmap › this month · Release notes

🎬 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.
  • GracefulStop over Stop; drive shutdown from signal.NotifyContext.
  • Redis lists are queues; BRPOPLPUSH buys 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/As vs string matching; %w wrapping.
  • 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"