Roblox DataStores ve ProfileService: Oturum Kilitleme, Veri Güvenliği ve Kalıcılık

DopaBrain Oyun Geliştirme Laboratuvarı • Güncellendi: Eylül 2026 • Okuma Süresi: 9 dk

Geliştirici Bilişsel Araçları

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:

2. ProfileService ile Session Locking Mekanizması

Yalnızca aktif sunucunun yazma hakkına sahip olmasını sağlamak:

3. Güvenli Veri Geçişi ve Şema Güncellemeleri

Eski ilerlemeleri sıfırlamadan oyuna yeni özellikler eklemek:

4. Canlı Sunucu Scripti: ProfileService Uygulaması

Güvenli veri kaydı için eksiksiz sunucu scripti:

ServerScriptService.DataManager (ProfileService)
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:

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şla

Sı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.