[engine] Concurrency modeli — Node'daki leave-while-send race'ini çöz #22

Open
opened 2026-06-16 23:54:02 +03:00 by saqut · 1 comment
Owner

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.

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.
saqut added this to the 0.1.0 milestone 2026-06-16 23:54:02 +03:00
saqut added the
engine
go
concurrency
labels 2026-06-16 23:54:02 +03:00
Author
Owner

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 zaman done kanalını da seçmesi (kapanan peer'e gönderim panik/race yerine sessizce düşer) + paylaşılan durumun RWMutex ile 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 -race temiz.

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ı):

  • Yapılandırılabilir yüksek limitler/poollar: OutboundBuffer 1024, MaxMessageSize 16 MiB, ping/pong/buffer'lar — hepsi env ile ayarlanabilir.
  • gorilla WriteBufferPool (paylaşımlı sync.Pool) → yüksek bağlantı sayısında yazma buffer'ları yeniden kullanılır, bellek tasarrufu.
  • Leak sağlamlaştırma: pairing ters-indeksi (pairedBy) + davet bekleme listesi temizliği → churn altında sınırsız büyüme yok (O(derece) disconnect temizliği).
  • Benchmark (loadtest modü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.
**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 zaman `done` kanalını da seçmesi (kapanan peer'e gönderim panik/race yerine sessizce düşer) + paylaşılan durumun `RWMutex` ile 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 -race` temiz. **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ı): - Yapılandırılabilir yüksek limitler/poollar: `OutboundBuffer` 1024, `MaxMessageSize` 16 MiB, ping/pong/buffer'lar — hepsi env ile ayarlanabilir. - gorilla `WriteBufferPool` (paylaşımlı `sync.Pool`) → yüksek bağlantı sayısında yazma buffer'ları yeniden kullanılır, bellek tasarrufu. - Leak sağlamlaştırma: pairing ters-indeksi (`pairedBy`) + davet bekleme listesi temizliği → churn altında sınırsız büyüme yok (O(derece) disconnect temizliği). - Benchmark (`loadtest` modü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.
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: saqut/MWSE#22
No description provided.