Skip to content

fix(socket): kalıcı pes etme yerine sınırsız yeniden bağlanma + backoff#685

Merged
lilyshen0722 merged 1 commit into
Team-Commonly:mainfrom
alptekinkekilli:fix/socket-reconnect
Jul 19, 2026
Merged

fix(socket): kalıcı pes etme yerine sınırsız yeniden bağlanma + backoff#685
lilyshen0722 merged 1 commit into
Team-Commonly:mainfrom
alptekinkekilli:fix/socket-reconnect

Conversation

@alptekinkekilli

Copy link
Copy Markdown
Contributor

Sorun

SocketContext.tsxreconnectionAttempts: 5. socket.io gecikmeyi üstel artırdığı için bu ~17 saniyelik bir pencere demek (1s→2s→4s→5s→5s; reconnectionDelayMax varsayılanı 5000).

Bu pencereyi aşan her kesintide — laptop uykusu, backend deploy'u, uzun ağ blip'i — socket kalıcı olarak pes ediyor ve bir daha denemiyor. Sayfa açık kalır, REST ile yüklenmiş eski mesajlar durur, yeni hiçbir şey gelmez. Kullanıcı sessizce bayat veriye bakar ve "mesajım gitmedi mi?" diye sorar; F5 "düzeltir".

Pod'u açık bırakıp agentları izlemek bu üründe beklenen kullanım — kalıcı pes etmek kabul edilemez. Canlıda gözlendi (2026-07-16): sekme ~1 saat açık kaldıktan sonra ölü.

Ölçüm (A/B, aynı backend, iki istemci yan yana)

12sn kesinti  -> ESKİ(5): deneme #5'te toparladı      YENİ(∞): deneme #4'te toparladı
45sn kesinti  -> ESKİ(5): *** PES ETTİ — bir daha denemeyecek ***
                 YENİ(∞): *** YENİDEN BAĞLANDI (deneme #6) *** -> CONNECT

Kısa kesintide ikisi de toparlıyor; fark uzun kesintide ortaya çıkıyor.

Backend suçsuz: socket.io client bağlanıp CLI'dan mesaj atıldığında newMessage anında geliyor (emit yolu messageController.ts:311, agentMessageService.ts:1426, server.ts:734 sağlam).

Değişiklik

  • reconnectionAttempts: Infinity + reconnectionDelayMax: 30000 + jitter — sunucu dönene kadar dener, backoff ile sunucuyu dövmez
  • visibilitychange / online / focus → hemen connect(): backoff 30sn'ye çıkabildiği için kullanıcı sekmeye döndüğünde bir sonraki denemeyi beklemesin. Sunucu taraflı kapatmada (io.disconnect) otomatik reconnect zaten devreye girmez — bu olaylar o durumun da tek kurtarma yolu
  • Listener'lar cleanup'ta kaldırılıyor

Doğrulama

tsc --noEmit: SocketContext.tsx temiz (repodaki diğer tip hataları mevcut ve bu değişiklikle ilgisiz). Vite HMR derledi, hata yok.

Kalan (bu PR'da değil)

connected state'i UI'da gösterilmiyor — yalnız pod'a katılma mantığında kullanılıyor. Bağlantı koptuğunda kullanıcı hâlâ bir şey görmüyor; artık kalıcı değil ama backoff penceresinde sessiz. Bir gösterge tasarım kararı gerektiriyor.

🤖 Generated with Claude Code

reconnectionAttempts: 5 idi. socket.io gecikmeyi üstel artırdığı için bu ~17
saniyelik bir pencere demek (1s→2s→4s→5s→5s, delayMax 5000 varsayılanı).
Bu pencereyi aşan HER kesintide — laptop uykusu, backend deploy'u, uzun ağ
blip'i — socket KALICI olarak pes ediyor ve bir daha denemiyordu. Sayfa açık
kalıyor, REST ile yüklenmiş eski mesajlar duruyor, yeni hiçbir şey gelmiyor:
kullanıcı sessizce bayat veriye bakıp 'mesajım gitmedi mi?' diyor. Pod'u açık
bırakıp agentları izlemek bu üründe beklenen kullanım (canlı gözlendi
2026-07-16: sekme ~1 saat sonra ölü, F5 ile düzeliyor).

A/B ölçümü (aynı backend, iki istemci yan yana, 45sn kesinti):
  ESKİ(5): deneme Team-Commonly#5 -> *** PES ETTİ — bir daha denemeyecek ***
  YENİ(∞): deneme Team-Commonly#6 -> *** YENİDEN BAĞLANDI *** -> CONNECT
12sn'lik kısa kesintide ikisi de toparlıyor — sorun yalnız uzun kesintide.

Değişiklik:
- reconnectionAttempts: Infinity + reconnectionDelayMax 30sn + jitter 0.5
  (sunucu dönene kadar dener; backoff ile sunucuyu dövmez)
- visibilitychange/online/focus -> hemen connect(): backoff 30sn'ye çıkabildiği
  için kullanıcı sekmeye döndüğünde bir sonraki denemeyi beklemesin. Sunucu
  taraflı kapatmada (io.disconnect) otomatik reconnect devreye girmez —
  bu olaylar o durumun da tek kurtarma yolu.
- Listener'lar cleanup'ta kaldırılıyor.

Doğrulama: tsc SocketContext.tsx için temiz (repodaki diğer tip hataları
mevcut ve ilgisiz); vite HMR derledi, hata yok.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@lilyshen0722 lilyshen0722 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This explains a class of 'the app silently stopped updating' reports we've been chasing. 5 attempts ≈ 17s meant every laptop sleep or deploy window permanently killed realtime while the tab showed stale data. Infinity + 30s max backoff + reconnect-on-visible/online/focus (with proper listener cleanup) is the right shape, and leaving a pod open to watch agents is exactly the intended use pattern you named. Merging all three — thanks for a genuinely great set of contributions.

@lilyshen0722
lilyshen0722 merged commit 8f4f5cc into Team-Commonly:main Jul 19, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants