็ญ่ง้ขๅ
ๅฎนๅๅ็ณป็ป
้ซๆง่ฝ็ญ่ง้ข Feed ๆต็ณป็ป
ๅบไบ Go ๆๅปบ๏ผ้็จไธ็บง็ผๅญๆถๆใๅผๆญฅไบไปถ้ฉฑๅจไธๆจๆๆททๅๅๅ็ญ็ฅ
ๅๆบ 6890 QPS๏ผP99 ๅๅบ 8.4ms
๐ ้ซๆง่ฝ Feed ๅๅ
ๅบๆฏ
็ญ็ฅ
ๆง่ฝ
Timeline
ๆถ้ดๆๅบ + ไธ็บง็ผๅญ + Singleflight ้ฒๅป็ฉฟ
P99 8.4ms
Hot
Redis ZSET ๆปๅจ็ชๅฃๅฎๆถ่ๅ
QPS 4190
Following
ๆจๆๆททๅ๏ผ10k ็ฒไธ้ๅผ๏ผ
P99 8.4ms
Recommend
ไฝๅผฆ็ธไผผๅบฆ + ็ญๅบฆ + ๆฐ้ฒๅบฆๅคไฟกๅทๆๅบ
P99 8.4ms
โก ๅผๆญฅไบๅจๆตๆฐด็บฟ
็จๆท็น่ต โ Redis ๅฟซๅ๏ผไน่ง้๏ผ โ RabbitMQ ๅผๆญฅ โ Worker ่ฝๅบ MySQL
โ
MQ ๆ
้่ชๅจ้็บงไธบๅๆญฅๅๅ
ฅ
16 ๅ็่ฎกๆฐๅจ โ ๆ user_id ๅๆฃ็ญ็นๅๅ
ฅ
WATCH + TxPipeline โ Redis ไน่ง้ไฟ่ฏๅนถๅๅฎๅ
จ
ๅน็ญ้ฎ โ ้ฒๆญข้ๅคๆไฝ
่ชๅจ้็บง โ MQ ๆ
้ๆถๅๆญฅ็ดๅ MySQL
้ถไพ่ตๅ้ๅ โ ๅๅธ N-gram 128 ็ปดๅ้๏ผๆ ้ๅค้จ ML ๆๅก
ๅคไฟกๅทๆๅบ โ 70% ็ธไผผๅบฆ + 20% ็ญๅบฆ + 10% ๆฐ้ฒๅบฆ
ๅทๅฏๅจ้็บง โ ๆ ็จๆทๅ้ๆถ 65% ็ญๅบฆ + 35% ๆฐ้ฒๅบฆ
7 ๅคฉๆๅ
ๅป้ โ ้ฒๆญขๅ
ๅฎน้ๅคๆจ่
็ฒไธ้็บง
็ญ็ฅ
ๅๅ
ฅๆๆฌ
่ฏปๅๆๆฌ
< 10k
ๆจ้ๅฐ็ฒไธ inbox
O(็ฒไธๆฐ)
O(1)
โฅ 10k
ๅๅ
ฅไฝ่
outbox
O(1)
O(ๅ
ณๆณจ็ๅคงVๆฐ)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ React Web Client โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ HTTP
โโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Gin HTTP Server โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ โ Account โ โ Video โ โ Feed โ โInteractionโ ... โ
โ โ Handler โ โ Handler โ โ Handler โ โ Handler โ โ
โ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โ
โ โ โ โ โ โ
โ โโโโโโผโโโโโโโโโโโโโผโโโโโโโโโโโโโผโโโโโโโโโโโโโผโโโโโโ โ
โ โ Application Layer โ โ
โ โ Service (Business Logic + Strategy Pattern) โ โ
โ โโโโโโฌโโโโโโโโโโโโโฌโโโโโโโโโโโโโฌโโโโโโโโโโโโโฌโโโโโโ โ
โ โ โ โ โ โ
โ โโโโโโผโโโโโโ โโโโโโผโโโโโโ โโโโโโผโโโโโโ โโโโโผโโโโโโโ โ
โ โ MySQL โ โ Redis โ โ RabbitMQ โ โ GORM โ โ
โ โ (11 tables)โ โ(Multi-level)โ โ (Async) โ โ(Persist) โ โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Worker Process โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ โ Action โ โ Fanout โ โ Embeddingโ โ
โ โ Worker โ โ Worker โ โ Worker โ โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ๆๆ
ๆฐๅผ
่ฏดๆ
Feed ่ฏปๅ QPS
6,890
ๅๆบ 20 ๅนถๅ
Feed ่ฏปๅ P99
8.4ms
ไธ็บง็ผๅญ + ๆธธๆ ๅ้กต
ไบๅจๅๅ
ฅ Avg
74ms
Redis ๅฟซๅ + MQ ๅๅธ
ๅผๆญฅ่ฝๅบๅปถ่ฟ
~2s
MQ ๆถ่ดนๅฎๆ
# ๅ
้้กน็ฎ
git clone https://github.com/raaaaap/SwiftFeed.git
cd SwiftFeed/apps
# ๅฏๅจๆๆๆๅก
docker compose up -d --build
# ๆฅ็ๆฅๅฟ
docker compose logs -f api web
apps/api/internal/
โโโ application/ # ๅบ็จๅฑ๏ผไธๅก้ป่พ๏ผ
โ โโโ feed/ # Feed ๆตๆๅก๏ผ็ญ็ฅๆจกๅผ + ๅค็บง็ผๅญ๏ผ
โ โโโ interaction/ # ไบๅจๆๅก๏ผๅผๆญฅๆตๆฐด็บฟ๏ผ
โ โโโ recommendation/ # ๆจ่ๆๅก๏ผๅ้ๅ + ๆๅบ๏ผ
โ โโโ video/ # ่ง้ขๆๅก๏ผFanout Worker๏ผ
โ โโโ relation/ # ็คพไบคๅ
ณ็ณป๏ผๆจๆๆททๅๅๅ๏ผ
โโโ domain/ # ้ขๅๅฑ๏ผๅฎไฝ + ๆฅๅฃ๏ผ
โ โโโ feed/ # Feed ้ขๅๆจกๅ
โ โโโ interaction/ # ไบๅจ้ขๅๆจกๅ
โ โโโ embedding/ # ๅ้ๅ๏ผๅๅธ N-gram๏ผ
โโโ infra/ # ๅบ็ก่ฎพๆฝๅฑ
โโโ cache/ # Redis ็ผๅญๅฎ็ฐ
โโโ mq/ # RabbitMQ ๅฎขๆท็ซฏ
โโโ persistence/ # GORM ๆไน
ๅ
โโโ database/ # ๆฐๆฎๅบ่ฟๆฅ
็ฑปๅซ
ๆๆฏ
่ฏดๆ
่ฏญ่จ
Go
้ซๅนถๅใ้ๆ็ผ่ฏใ้จ็ฝฒ็ฎๅ
Web ๆกๆถ
Gin
่ทฏ็ฑๆง่ฝๅฅฝใไธญ้ดไปถ็ตๆดป
ORM
GORM
่ชๅจ่ฟ็งปใ้ฉๅญๅฝๆฐใ้ขๅ ่ฝฝ
ๆฐๆฎๅบ
MySQL 8.4
InnoDBใไบๅก่ก้ใB+ ๆ ็ดขๅผ
็ผๅญ
Redis 7.4
ZSET ็ญๆฆใHASH ่ฎกๆฐใPipeline ๆน้ๆไฝ
ๆถๆฏ้ๅ
RabbitMQ 3.13
Topic Exchangeใๆไน
ๅใๆๅจ ACK
ๅฎนๅจๅ
Docker + Compose
ๅค้ถๆฎตๆๅปบใๅฅๅบทๆฃๆฅใไผ้
ๅ
ณ้ญ
ๅ็ซฏ
React 18 + Vite 5
ๅ็ดๆปๅจใๆๅ
่ฟฝ่ธชใๆ่ฒไธป้ข
GET /api/feed-items?scene=timeline&limit=10&cursor=xxx
POST /api/feed-queries (JSON body with scene, cursor, limit, context)
PUT /api/videos/:videoId/like # ็น่ต
DELETE /api/videos/:videoId/like # ๅๆถ็น่ต
PUT /api/videos/:videoId/favorite # ๆถ่
DELETE /api/videos/:videoId/favorite # ๅๆถๆถ่
POST /api/videos/:videoId/comments # ่ฏ่ฎบ
GET /api/videos/:videoId/comments # ่ฏ่ฎบๅ่กจ
DELETE /api/comments/:commentId # ๅ ้ค่ฏ่ฎบ
POST /api/users # ๆณจๅ
POST /api/sessions # ็ปๅฝ
GET /api/users/me # ไธชไบบไฟกๆฏ
PATCH /api/users/me # ๆดๆฐ่ตๆ
PUT /api/users/me/following/:targetId # ๅ
ณๆณจ
DELETE /api/users/me/following/:targetId # ๅๆถๅ
ณๆณจ
GET /api/users/me/following # ๅ
ณๆณจๅ่กจ
GET /api/users/me/followers # ็ฒไธๅ่กจ
POST /api/videos # ๅๅธ่ง้ข
GET /api/videos/:videoId # ่ง้ข่ฏฆๆ
DELETE /api/videos/:videoId # ๅ ้ค่ง้ข
GET /api/users/me/videos # ๆ็ไฝๅ
# ่ฟ่กๆๆๆต่ฏ
cd apps/api && go test ./test/ -v
# ่ฟ่กๅๅ
ๆต่ฏ
go test ./internal/domain/embedding/ -v
go test ./internal/infra/cache/ -v
go test ./internal/application/feed/ -v
go test ./internal/application/recommendation/ -v
# ๆง่ฝๆต่ฏ
hey -n 500 -c 20 " http://127.0.0.1:8080/api/feed-items?scene=timeline&limit=10"
MIT License โ see LICENSE for details.