Tenant 1001 - Muzibu

Concurrent Playback Limit Sistemi

Mevcut Device Limit vs Önerilen Concurrent Stream Analizi

Rapor Tarihi
17 Aralık 2025

Yönetici Özeti

Basit Anlatım (Herkes İçin)

Problem: Bir kafe sahibi 1 abonelik alıyor ama aynı anda 3 farklı alanda (salon, WC, depo) müzik çalabiliyor. Bu, iş modeli açısından kayıp yaratıyor.

Mevcut Sistem: Sadece kaç cihazdan "giriş yapıldığını" kontrol ediyor. Aynı bilgisayardaki 3 sekmede 3 farklı müzik çalınabilir.

Önerilen Sistem (Spotify Modeli): Kaç yerde "müzik çaldığını" kontrol ediyor. 1 abonelik = 1 yerde aktif müzik. 2. yerde çalmak isterse → "Limit aşıldı, ek abonelik alın" hatası.

Sonuç: Kafe sahibi 3 alanda müzik istiyorsa → 3 abonelik satın alması gerekecek. Gelir artacak.

Teknik Özet (Geliştiriciler İçin)

Mevcut Mimari
Device Limit (Login Token Bazlı)
DeviceService.php + user_active_sessions tablosu
Önerilen Mimari
Concurrent Playback Limit (Heartbeat Bazlı)
PlaybackSessionService.php + active_playback_sessions tablosu
Uygulama Zorluğu
ORTA
~2-3 saat, mevcut yapı korunarak eklenebilir
Risk Seviyesi
DÜŞÜK
Mevcut device limit sistemi paralel çalışmaya devam edebilir

İş Gereksinimi - Kafe Senaryosu

Problem

1
Kafe sahibi 1 abonelik satın alıyor
2
Ana salonda müzik çalıyor (PC Sekme 1)
3
WC'de farklı müzik çalıyor (PC Sekme 2)
4
Depo alanında başka müzik (PC Sekme 3)
Sonuç: 1 abonelik → 3 yerde müzik
Bu iş modeli açısından kayıp yaratıyor!

Beklenen Davranış

1 abonelik = 1 eşzamanlı müzik akışı
3 farklı yerde müzik → 3 ayrı abonelik gereksin
Kullanıcı aynı anda 10 sekmede gözatabilmeli
Telefonda playlist bakabilmeli
Sadece AYNI ANDA 2 YERDE ÇALMAYI engellemeliyiz
Hedef: Gelir Artışı + Adil Kullanım

Mevcut Sistem - Device Limit Analizi Aktif

Mimari Akış

User Login
registerSession()
Login Token + DB Kayıt
enforceDeviceLimit()
LIFO: Eski Silinir

Backend Dosyaları

DeviceService.php
Modules/Muzibu/app/Services/
user_active_sessions
Tenant database tablosu
SubscriptionPlan.php
device_limit field'i (default: 1)

Frontend Dosyaları

session.js
themes/muzibu/js/player/features/
player-core.js
themes/muzibu/js/player/core/

Device Tanımı

1 Device = 1 Browser (tarayıcı)
Aynı tarayıcıda 10 sekme = 1 device
Chrome → Firefox = 2 device

Limit Hiyerarşisi (3-tier)

1 User Override: user->device_limit
2 Plan: plan->device_limit
3 Setting: auth_device_limit

LIFO Mekanizması (Last In First Out)

Adım 1
Tab A login → token_A oluşur
Adım 2
Tab B login → LIFO: token_A silinir
Adım 3
Tab A polling → Token yok → LOGOUT

Problemler

Çok Katı: Kullanıcı telefonda browse yapamaz (device limit aşılır)
Kötü UX: Yeni sekme açmak bile device sayılabilir
Kafe Problemi: Aynı tarayıcıda 3 sekme = 1 device → HEPSİ ÇALAR
Gereksiz Kısıtlama: Browse/search gibi pasif işlemler de sınırlanıyor

Artılar

Basit: Sadece login token kontrolü
Hızlı: Tek tablo sorgusu
Güvenilir: Cookie-based, browser native
Zaten Var: Kod yazılmış, test edilmiş

Önerilen Sistem - Concurrent Playback Limit Spotify Modeli

Mimari Akış

Play Butonu
registerPlayback()
Aktif Stream Sayısı Kontrol
Limit OK → Çal
Heartbeat (10s)
pingPlayback()
30s Timeout → Auto Cleanup

Temel Farklar

Ne İzleniyor?
Login session
→ Aktif müzik çalma durumu
Limit Tipi
X device
→ X concurrent stream
Browse/Search
Sınırlı (device sayılır)
→ Sınırsız
Çoklu Playback
Engellenemez
→ Engellenir

Yeni Tablo: active_playback_sessions

Kolon Tip Açıklama
playback_id UUID Her tab için unique ID (sessionStorage)
user_id FK Kullanıcı referansı
session_id VARCHAR Laravel session referansı
current_song_id FK nullable Şu an çalan şarkı
last_ping TIMESTAMP Heartbeat zamanı (kritik!)
device_name VARCHAR Cihaz bilgisi (opsiyonel)
ip_address VARCHAR(45) IPv4/IPv6

SubscriptionPlan Değişikliği

ALTER TABLE subscription_plans
ADD COLUMN concurrent_streams_limit INT DEFAULT 1
AFTER device_limit;
Mevcut device_limit korunur, yeni concurrent_streams_limit eklenir.

Heartbeat Sistemi

10s
Ping Interval
Frontend → Backend
30s
Timeout
3 ping kaçırırsa expired
Auto
Cleanup
Expired session'lar silinir

Detaylı Karşılaştırma

Özellik Mevcut (Device Limit) Önerilen (Concurrent)
Limit Tipi Giriş yapılabilen cihaz sayısı Eşzamanlı çalan stream sayısı
Browse/Search Sınırlı Sınırsız
Çoklu Sekme Aynı tarayıcıda sınırsız (hepsi çalar!) Sınırsız (sadece 1 çalar)
Farklı Cihaz Limit kadar (LIFO ile kick) Sınırsız giriş, sınırlı çalma
Eşzamanlı Çalma Engellenemez Engellenir
Kafe Senaryosu 3 sekme = 3 müzik, 1 abonelik 3 müzik = 3 abonelik
Kullanıcı Deneyimi Kötü (çok katı) İyi (sadece gerekli yerde kısıtlar)
Teknik Karmaşıklık Basit Orta
Backend Load Düşük (5dk polling) Orta (10s heartbeat)
Spotify Benzeri Hayır Evet

Uygulama Zorluğu Değerlendirmesi

Database
KOLAY
1 yeni tablo + 1 migration
Backend
ORTA
1 Service + 1 Controller + 4 endpoint
Frontend
ORTA
player-core.js değişikliği + heartbeat

Kolaylaştıran Faktörler

  • Mevcut DeviceService yapısı referans alınabilir
  • Session polling altyapısı zaten var (session.js)
  • SubscriptionPlan modeli esnek (device_limit pattern'i mevcut)
  • player-core.js'te play/pause hook noktaları var
  • Mevcut sistem paralel çalışabilir (soft migration)

Dikkat Edilecekler

  • Heartbeat server load'u artırabilir (10s interval)
  • HLS stream + Howler.js entegrasyonu dikkatli yapılmalı
  • Cross-tab communication race condition'ları
  • Offline/reconnect senaryoları test edilmeli

Tahmini Uygulama Süresi

45dk
Backend
Service + Controller + Migration
30dk
Frontend
Heartbeat + Play/Pause hook
20dk
Test
Multi-tab + timeout test
15dk
Admin Panel
Plan field ekleme
Toplam Tahmini Süre: ~2 Saat

Kafe Senaryosu - Önce/Sonra

Mevcut Sistemle

Kafe sahibi: 1 PC, 3 sekme
1 Sekme 1: Salon müziği → ÇALIYOR
2 Sekme 2: WC müziği → ÇALIYOR
3 Sekme 3: Depo müziği → ÇALIYOR
Sonuç: 3 müzik = 1 abonelik
Device Limit: 1 (aynı tarayıcı = 1 device)

Önerilen Sistemle

Kafe sahibi: 1 PC, 3 sekme
1 Sekme 1: Salon → Play → ÇALIYOR
2 Sekme 2: WC → Play → HATA!
"Bu abonelik zaten başka bir yerde çalıyor.
WC için ayrı abonelik satın alın."
Çözüm:
Hesap 1: Salon →
Hesap 2: WC →
3 alan = 3 abonelik = 3x gelir

Karar Verilecek Noktalar

1. LIFO Davranışı

A: Otomatik durdur (yeni stream eskiyi kapatır)
B: Hata göster (kullanıcı manuel durdursun) ÖNERİ

2. Ping Timeout

20 saniye (agresif)
30 saniye (3 ping kaçırırsa) ÖNERİ
60 saniye (toleranslı)

3. Heartbeat Interval

5 saniye (hassas, yüksek load)
10 saniye ÖNERİ
15 saniye (düşük load, geç tespit)

4. Free Plan Limiti

1 concurrent stream ÖNERİ
0 (free = stream yok)

Kabul Kriterleri (Acceptance Criteria)

Sınırsız Gözatma
Kullanıcı 10 sekmede gözatabilmeli
Multi-Device Login
Telefon + PC'de giriş yapabilmeli
Tek Playback
Sadece 1 yerde müzik çalabilmeli (limit: 1 ise)
Limit Hatası
2. yerde play → Anlaşılır limit hatası almalı
Yeni Stream
Müzik durdurulunca → Yeni stream başlatılabilmeli
Auto Cleanup
30 saniye ping gitmezse → Session otomatik silinmeli
Admin Kontrol
Admin panelden limit ayarlanabilmeli (plan bazında)
Backward Compatible
Mevcut device limit sistemi çalışmaya devam etmeli

Sonuç ve Öneri

Basit Anlatım

Concurrent Playback sistemi, mevcut Device Limit sisteminin yanına eklenerek çalışabilir. İki sistem birbirini tamamlar: Device Limit giriş sayısını, Concurrent Playback ise aktif müzik sayısını kontrol eder. Bu sayede hem güvenlik hem de iş modeli korunmuş olur.

Teknik Özet

Uygulama ~2 saat sürer ve düşük risklidir. Mevcut kod yapısı (DeviceService, session.js, player-core.js) paralel sistemi destekleyecek şekilde tasarlanmış. PlaybackSessionService yeni bir katman olarak eklenecek.

ÖNERİ: UYGULANMALI
Concurrent Playback sistemi, kafe senaryosunu çözer ve gelir artışı sağlar.