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 channel0
redirect đã trả 3020
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".