Hiçbir şey bir Roblox oyununun puanını ve gelirini oyuncu verisi kaybından daha hızlı yok edemez. Sunucular çöktüğünde veya oyuncular hızla sunucu değiştirdiğinde, dikkatsiz `SetAsync` kullanımı envanterlerin tamamen silinmesine yol açar.
2026 yılında profesyonel oyun geliştirme sağlam veri kalıcılığı gerektirir. Bu rehber, Session Locking mekanizmasını, `UpdateAsync` kullanmanın önemini ve ProfileService ile veri kaybının nasıl tamamen önlendiğini açıklar.
1. Veri Kaybının Nedenleri: Race Condition ve Sunucu Değişimi
Dağıtık sunucuların envanterleri nasıl istemeden sildiği:
- Sunucular Arası Race Condition: Oyuncu Sunucu A'dan ayrılıp hemen Sunucu B'ye girdiğinde, eski veri yenisinin üzerine yazılabilir.
- Yönetilmeyen Ağ Hataları:
pcallkullanılmadığında HTTP 500 hataları scripti durdurur ve kayıt yapılmaz. - Kota Aşımı: Dakika başına yazma sınırı aşıldığında istekler sessizce iptal edilir.
2. ProfileService ile Session Locking Mekanizması
Yalnızca aktif sunucunun yazma hakkına sahip olmasını sağlamak:
- Aktif Oturum Sahipliği: Sunucu A, kendi JobId değerini profile yazarak kilidi aktif eder.
- Çift Giriş Koruması: Sunucu B, kilit açılana kadar bekler veya oyuncuyu güvenle ayırır.
- Otomatik Kayıt: ProfileService verileri her 30 saniyede bir arka planda kaydeder.
3. Güvenli Veri Geçişi ve Şema Güncellemeleri
Eski ilerlemeleri sıfırlamadan oyuna yeni özellikler eklemek:
- Varsayılan Şablon: Tüm değişkenleri içeren sabit bir şablon tanımlayın.
- Reconcile Deseni:
Profile:Reconcile()mevcut verileri bozmadan yeni anahtarları ekler. - Sürüm Kontrolü: Kapsamlı envanter yenilemelerinde
DataVersionkullanın.
4. Canlı Sunucu Scripti: ProfileService Uygulaması
Güvenli veri kaydı için eksiksiz sunucu scripti:
local Players = game:GetService("Players")
local ProfileService = require(script.ProfileService)
local ProfileTemplate = {
Coins = 100,
Gems = 0,
Inventory = {},
LogInTimes = 0,
}
local ProfileStore = ProfileService.GetProfileStore(
"PlayerData_v1.0",
ProfileTemplate
)
local Profiles = {}
local function OnPlayerAdded(player)
local profile = ProfileStore:LoadProfileAsync("Player_" .. player.UserId)
if profile ~= nil then
profile:AddUserId(player.UserId)
profile:Reconcile()
profile:ListenToRelease(function()
Profiles[player] = nil
player:Kick("Oturum baska sunucuda acildi. Lutfen tekrar baglanin.")
end)
if player:IsDescendantOf(Players) == true then
Profiles[player] = profile
else
profile:Release()
end
else
player:Kick("Kayit verisi yuklenemedi.")
end
end
local function OnPlayerRemoving(player)
local profile = Profiles[player]
if profile ~= nil then
profile:Release()
end
end
Players.PlayerAdded:Connect(OnPlayerAdded)
Players.PlayerRemoving:Connect(OnPlayerRemoving)
Veriyi oturum kilidiyle yükler, yeni şema alanlarını Reconcile ile ekler ve oyuncu çıktığında kilidi düzgünce serbest bırakır.
5. Performans ve Çökme Koruması
Canlı oyunlar için en iyi uygulamalar:
- BindToClose Kullanımı:
game:BindToClosesunucu kapanırken verileri kaydetmek için 30 saniyeye kadar süre tanır. - Studio'da Mock DataStore: Bulut kotasını harcamadan test yapmak için
ProfileStore.Mockkullanın. - Veri Sıkıştırma: Büyük envanterleri 4MB sınırının altında tutmak için sıkıştırın.
Sistem Mimarisi ve Mantıksal Düşüncenizi Ölçün
Veri kalıcılığı kurmak derin analitik odaklanma gerektirir. Ücretsiz testlerimizle bilişsel yapınızı keşfedin.
Ücretsiz Beyin Tipi Testine BaşlaSıkça Sorulan Sorular (Roblox DataStores & ProfileService)
SetAsync neden risklidir?
SetAsync mevcut veriyi kontrol etmeden üzerine yazar. Hızlı sunucu değişimlerinde eski veri yenisini silebilir.
Oturum Kilitleme (Session Locking) nedir?
Dijital bir asma kilit gibidir: Yalnızca oyuncunun aktif olduğu sunucu kayıt yapabilir, böylece eşya çoğaltma ve veri kaybı önlenir.
2026'da anahtar başına veri sınırı nedir?
Anahtar başına 4 MB (4.194.304 karakter) sınır vardır, bu da binlerce eşya için fazlasıyla yeterlidir.
Sunucu çökerse ProfileService verileri korur mu?
Evet. game:BindToClose ile entegre çalışarak sunucu kapanmadan önce tüm profilleri kaydetmeye çalışır.