[engine] Concurrency modeli — Node'daki leave-while-send race'ini çöz #22
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
ASIL SEBEP. Node'da saf thread + paylaşımlı bellek olmadığı için Mutex kurulamıyordu; biri odadan ayrılırken başka thread o client'e yazınca race oluyordu.
Go çözümü: room/peer state için tek-yazıcı owner-goroutine (actor) + channel, ya da
sync.RWMutex. Ayrılma ve gönderim aynı state'e seri erişmeli. Tasarımıdecisions'a yaz.Go portunda çözüldü (branch:
go-rewrite) — bu issue CLAUDE.md gereği insan onayına açık bırakıldı, kapatılmadı.Concurrency modeli: bağlantı-başına TEK yazıcı goroutine (sokete yazan tek şey
writePump) +Send'in her zamandonekanalını da seçmesi (kapanan peer'e gönderim panik/race yerine sessizce düşer) + paylaşılan durumunRWMutexile korunması (Room.Broadcastüyeleri kilit altında snapshot'lar, kilitsiz gönderir). "Ayrılırken-yazma" race'i yapısal olarak imkânsız hale geldi.Regresyon testi:
internal/ws/ws_test.go → TestLeaveWhileSendRace(4 broadcaster + 30 eşzamanlı Eject/Join) —go test -racetemiz.Tasarım seçimi (actor yerine RWMutex + tek-yazıcı) ve gerekçesi
REVIEW.md/decisions.md'de.Yüksek ölçek değerlendirmesi (sürekli trafik + çok bağlantı):
OutboundBuffer1024,MaxMessageSize16 MiB, ping/pong/buffer'lar — hepsi env ile ayarlanabilir.WriteBufferPool(paylaşımlısync.Pool) → yüksek bağlantı sayısında yazma buffer'ları yeniden kullanılır, bellek tasarrufu.pairedBy) + davet bekleme listesi temizliği → churn altında sınırsız büyüme yok (O(derece) disconnect temizliği).loadtestmodülü, 150 bağlantı, 3 sn): ping ~149k req/s (0 hata, p50 ~680µs, p99 ~5.7ms), relay ~210k msg/s (%99.98 teslim), engine RSS ~43 MB. Graceful shutdown temiz.