L83 — Capstone: Implement Phase
URL Shortener có Analytics. Ba module tương tác: kiến trúc clean, luồng request (shorten / redirect cache-first / stats), và async click pipeline non-blocking.
1 · Kiến trúc Clean — bấm vào từng tầng
Mũi tên phụ thuộc luôn trỏ VÀO TRONG: adapter → usecase → domain. Bấm một tầng để xem nó chứa gì và import gì.
domain
url.go · click.go — entity + business rule
usecase
ports.go · shorten/redirect/stats.go
adapter/http
handler.go · middleware.go (driving)
adapter/memory
url_repo · cache · queue (driven)
adapter/analytics
worker.go (consumer + StatsStore)
cmd/server
main.go — composition root
2 · Luồng request — shorten / redirect / stats
Chọn một luồng rồi bấm "Chạy" để xem từng bước. Để ý redirect tra cache TRƯỚC (cache-first), miss thì mới vào repo và populate.
Chọn luồng và bấm Chạy…
3 · Async click pipeline — non-blocking
Bấm "Click redirect" nhiều lần. Redirect trả 302 ngay (fast path) rồi ném event vào channel; worker tiêu thụ ở background và aggregate. Redirect KHÔNG chờ worker.
Redirect ~1µs
emit click → trả 302
Channel (buffer)
Worker background
consume → aggregate
| Chỉ số (read model) | Giá trị |
|---|---|
| total_clicks (đã aggregate) | 0 |
| event còn trong channel | 0 |
| redirect đã trả 302 | 0 |
Redirect đã phục vụ 0 lần mà không chờ worker. Tắt worker để thấy event dồn lại trong channel mà redirect vẫn nhanh — đó là ý nghĩa "non-blocking".