Veri depolarına yaptığınız istekler, kötü bağlantı veya diğer sorunlar nedeniyle başarısız olabilir. Hataları yönetmek ve bir hata kodu ile birlikte mesaj döndürmek için veri deposu işlevlerini pcall() içine sarın.
UpdateAsync() gibi başarısız bir yazma çağrısı, oyun sunucusunun başarılı bir yanıt almadığı anlamına gelir. Bu, arka uç yazımının gerçekleşmediğini garanti etmez. Bazı hata senaryolarında, son yazım durumu, önbelleksiz bir takip okuması ile doğrulanana kadar çağrıcıya bilinmeyebilir.
Hata kodu referansı
| Hata kodu | Hata adı | Hata mesajı | Notlar | |
|---|---|---|---|---|
| 101 | KeyNameEmpty | Anahtar adı boş olamaz. | Veri deposu işlevine girilen anahtarın boş bir dize olup olmadığını kontrol edin. | |
| 102 | KeyNameLimit | Anahtar adı 50 karakter limitini aşıyor. | Veri deposu işlevine girilen anahtarın uzunluğunun 50'yi aşıp aşmadığını kontrol edin. | |
| 103 | ValueNotAllowed | DataStore içinde X izin verilemez. | Kötü bir güncelleme işlevi X türünde bir değer döndürdü. | |
| 104 | CantStoreValue | DataStore içinde X saklanamaz. | Güncelleme işlevi, serileştirilemeyen X türünde bir değer döndürdü. | |
| 105 | ValueTooLarge | Serileştirilmiş değer X limitini aşıyor. | SetAsync() veya UpdateAsync() ile bir değer ayarlıyorsanız, değerin serileştirilmiş uzunluğu X boyutunu aşamaz. Verinin serileştirilmiş uzunluğunu kontrol etmek için JSONEncode() kullanın. | |
| 106 | MaxValueInvalid | MaxValue bir tamsayı olmalıdır. | GetSortedAsync() için bir maksimum değer geçiriyorsanız, bu bir tamsayı olmalıdır. | |
| 106 | MinValueInvalid | MinValue bir tamsayı olmalıdır. | GetSortedAsync() için bir minimum değer geçiriyorsanız, bu bir tamsayı olmalıdır. | |
| 106 | PageSizeGreater | PageSize önceden tanımlanmış bir aralık içinde olmalıdır. | Bir OrderedDataStore için minimum sayfa boyutu 1'dir. | |
| 106 | PageSizeLesser | PageSize önceden tanımlanmış bir aralık içinde olmalıdır. | Bir OrderedDataStore için maksimum sayfa boyutu 100'dür. | |
| 107 | MinMaxOrderInvalid | MaxValue MinValue'dan büyük veya eşit olmalıdır. | Maksimum değer, GetSortedAsync() için minimum değerden büyük veya eşit olmalıdır. | |
| 301 | GetAsyncThrottle | GetAsync isteği bırakıldı. İstek sınırlıydı ama kuyruk doluydu. | GetAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | |
| 302 | SetAsyncThrottle | SetAsync isteği bırakıldı. İstek sınırlıydı ama kuyruk doluydu. | SetAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | |
| 303 | IncreAsyncThrottle | IncrementAsync isteği bırakıldı. İstek sınırlıydı ama kuyruk doluydu. | IncrementAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | |
| 304 | UpdateAsyncThrottle | UpdateAsync isteği bırakıldı. İstek sınırlıydı ama kuyruk doluydu. | UpdateAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | |
| 304 | TransformThrottle | UpdateAsync isteği bırakıldı. İstek sınırlıydı ama kuyruk doluydu. | UpdateAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | |
| 305 | GetSortedThrottle | GetSorted isteği bırakıldı. İstek sınırlıydı ama kuyruk doluydu. | GetSortedAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | |
| 306 | RemoveAsyncThrottle | RemoveAsync isteği bırakıldı. İstek sınırlıydı ama kuyruk doluydu. | RemoveAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | |
| 401 | DataModelNoAccess | İstek başarısız oldu. DataModel deneyim kapanırken erişilemez. | DataModel başlatılmamış çünkü deneyim kapanıyor. | |
| 402 | LuaWebSrvsNoAccess | İstek başarısız oldu. LuaWebService deneyim kapanırken erişilemez. | LuaWebService başlatılmamış çünkü deneyim kapanıyor. | |
| 403 | StudioAccessToApisNotAllowed | API erişimi etkinleştirilmediği için Stüdyo'dan DataStore'a yazılamaz. | Stüdyo'da veri depolarını kullanmak için API erişimi aktif olmalıdır. | |
| 404 | InternalError | OrderedDataStore mevcut değil. | Bu isteğe bağlı OrderedDataStore bulunamadı. Bu, veri bozulmasının bir işareti olabilir. Daha sonra tekrar deneyin. | |
| 501 | InternalError | Yanıtı ayrıştırılamıyor çünkü veri bozulmuş olabilir. | Sunucu, isteğinize yanıtı ayrıştırmakta başarısız oldu. Bu, veri bozulmasının bir işareti olabilir. Daha sonra tekrar deneyin. | |
| 502 | RequestRejected | API Hizmetleri isteği hata ile reddetti X. | Roblox sunucularında işlenirken X hatası oluştu. Daha sonra tekrar deneyin. | |
| 503 | InternalError | Veri deposu isteği başarılıydı ama anahtar bulunamadı. | İstenen anahtar veri deposunda bulunamadı. Bu, veri bozulmasının bir işareti olabilir. Daha sonra tekrar deneyin. | |
| 504 | InternalError | Veri deposu isteği başarılıydı ama yanıt doğru formatta değildi. | Sunucu, isteğinize yanıtı ayrıştırmakta başarısız oldu. Bu, veri bozulmasının bir işareti olabilir. Daha sonra tekrar deneyin. | |
| 505 | InternalError | OrderedDataStore isteği başarılıydı ama yanıt doğru formatta değildi. | Sunucu, OrderedDataStore isteğinize yanıtı ayrıştırmakta başarısız oldu. Bu, veri bozulmasının bir işareti olabilir. Daha sonra tekrar deneyin. | |
| 509 | OperationNotAllowed | Veri deposu işlemleri, olası veri bozulmasını önlemek için Kişisel RCC üzerinde çalışırken engellenmiştir. | Özel RCC kanallarında veri deposu yazımları engellenmiştir. | |
| 511 | AttributeSizeTooLarge | Meta veri özniteliği boyutu X limitini aşıyor. | Serileştirilmiş meta veri boyutu X limitini aşıyor. X değeri dinamik. Boyut değişirse, değer de değişir. | |
| 512 | UserIdLimitExceeded | UserID boyutu X limitini aşıyor. | Kullanıcı tarafından sağlanan kullanıcı kimlikleri dizisinin uzunluğu X limitini aşıyor. | |
| 513 | AttributeFormatError | Öznitelik userId formatı geçersiz. | Sağlanan kullanıcı kimliği bir sayı değil. | |
| 513 | AttributeFormatError | Öznitelik meta veri formatı geçersiz. | Meta veri bir tablo değil. | |
| GetVersionAsyncThrottle | GetVersionAsync isteği bırakıldı. İstek sınırlıydı. | GetVersionAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | ||
| GetVersionAtTimeAsyncThrottle | GetVersionAtTimeAsync isteği bırakıldı. İstek sınırlıydı. | GetVersionAtTimeAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | ||
| ListDataStoresAsyncThrottle | ListDataStoresAsync isteği bırakıldı. İstek sınırlıydı. | ListDataStoresAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | ||
| ListKeysAsyncThrottle | ListKeysAsync isteği bırakıldı. İstek sınırlıydı. | ListKeysAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | ||
| ListVersionsAsyncThrottle | ListVersionsAsync isteği bırakıldı. İstek sınırlıydı. | ListVersionsAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | ||
| RemoveVersionAsyncThrottle | RemoveVersionAsync isteği bırakıldı. İstek sınırlıydı. | RemoveVersionAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | ||
| InvalidTimestamp | Zaman damgası pozitif olmalı ve gelecekte on dakikadan fazla olmamalıdır. | GetVersionAtTimeAsync() için sağlanan zaman damgası geçerli değildi. | ||
| StandardReadExperienceThrottled | StandardRead isteği deneyim limitleri tarafından sınırlıydı. | GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), veya standart bir veri deposunda UpdateAsync() okuması, StandardRead deneyim düzeyi oran limitini aştı. | ||
| StandardWriteExperienceThrottled | StandardWrite isteği deneyim limitleri tarafından sınırlıydı. | SetAsync(), IncrementAsync(), veya standart bir veri deposunda UpdateAsync() yazması, StandardWrite deneyim düzeyi oran limitini aştı. | ||
| StandardListExperienceThrottled | StandardList isteği deneyim limitleri tarafından sınırlıydı. | ListKeysAsync(), ListVersionsAsync(), veya standart veri depolarında ListDataStoresAsync() isteği, StandardList deneyim düzeyi oran limitini aştı. | ||
| StandardRemoveExperienceThrottled | StandardRemove isteği deneyim limitleri tarafından sınırlıydı. | Standart bir veri deposunda RemoveAsync() isteği, StandardRemove deneyim düzeyi oran limitini aştı. | ||
| OrderedReadExperienceThrottled | OrderedRead isteği deneyim limitleri tarafından sınırlıydı. | GetAsync(), BatchGetAsync(), veya sıralı bir veri deposunda UpdateAsync() okuması, OrderedRead deneyim düzeyi oran limitini aştı. | ||
| OrderedWriteExperienceThrottled | OrderedWrite isteği deneyim limitleri tarafından sınırlıydı. | SetAsync(), IncrementAsync(), veya sıralı bir veri deposunda UpdateAsync() yazması, OrderedWrite deneyim düzeyi oran limitini aştı. | ||
| OrderedListExperienceThrottled | OrderedList isteği deneyim limitleri tarafından sınırlıydı. | GetSortedAsync() isteği, sıralı bir veri deposunda OrderedList deneyim düzeyi oran limitini aştı. | ||
| OrderedRemoveExperienceThrottled | OrderedRemove isteği deneyim limitleri tarafından sınırlıydı. | RemoveAsync() isteği, sıralı bir veri deposunda OrderedRemove deneyim düzeyi oran limitini aştı. | ||
| StandardReadGameServerThrottled | StandardRead isteği oyun sunucusu limitleri tarafından sınırlıydı veya istek kuyruğu doluydu. | GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), veya standart bir veri deposunda UpdateAsync() okuması, StandardRead oyun sunucusu düzeyi oran limitini aştı. | ||
| StandardWriteGameServerThrottled | StandardWrite isteği oyun sunucusu limitleri tarafından sınırlıydı veya istek kuyruğu doluydu. | SetAsync(), IncrementAsync(), veya standart bir veri deposunda UpdateAsync() yazması, StandardWrite oyun sunucusu düzeyi oran limitini aştı. | ||
| StandardListGameServerThrottled | StandardList isteği oyun sunucusu limitleri tarafından sınırlıydı veya istek kuyruğu doluydu. | ListKeysAsync(), ListVersionsAsync(), veya standart veri depolarında ListDataStoresAsync() isteği, StandardList oyun sunucusu düzeyi oran limitini aştı. | ||
| StandardRemoveGameServerThrottled | StandardRemove isteği oyun sunucusu limitleri tarafından sınırlıydı veya istek kuyruğu doluydu. | Standart bir veri deposunda RemoveAsync() isteği, StandardRemove oyun sunucusu düzeyi oran limitini aştı. | ||
| OrderedReadGameServerThrottled | OrderedRead isteği oyun sunucusu limitleri tarafından sınırlıydı veya istek kuyruğu doluydu. | GetAsync(), BatchGetAsync(), veya sıralı bir veri deposunda UpdateAsync() okuması, OrderedRead oyun sunucusu düzeyi oran limitini aştı. | ||
| OrderedWriteGameServerThrottled | OrderedWrite isteği oyun sunucusu limitleri tarafından sınırlıydı veya istek kuyruğu doluydu. | SetAsync(), IncrementAsync(), veya sıralı bir veri deposunda UpdateAsync() yazması, OrderedWrite oyun sunucusu düzeyi oran limitini aştı. | ||
| OrderedListGameServerThrottled | OrderedList isteği oyun sunucusu limitleri tarafından sınırlıydı veya istek kuyruğu doluydu. | GetSortedAsync() isteği, sıralı bir veri deposunda OrderedList oyun sunucusu düzeyi oran limitini aştı. | ||
| OrderedRemoveGameServerThrottled | OrderedRemove isteği oyun sunucusu limitleri tarafından sınırlıydı veya istek kuyruğu doluydu. | RemoveAsync() isteği, sıralı bir veri deposunda OrderedRemove oyun sunucusu düzeyi oran limitini aştı. |
Sunucu hata kodları
| Hata adı | Hata mesajı | Notlar |
|---|---|---|
| DatastoreDeleted | Veri deposu silindi. | Veri deposu üzerinde bir işlem gerçekleştirilemedi çünkü veri deposu daha önce silinmişti. |
| DatastoreThrottled | İstek oranı datastore için izin verilen maksimumu aşıyor. | Tek bir veri deposuna çok fazla istek gönderildi. |
| InternalServerError | Bir iç sunucu hatası oluştu. | Roblox sunucularında ara sıra hata. Tekrar deneyin, ideal olarak üstel geri dönüş ile. |
| InvalidExclusiveStartKey | Sağlanan özel başlangıç anahtarı geçerli değil. | ListKeysAsync() gibi bir listeleme işlemi için sağlanan özel başlangıç anahtarı (imleç) geçerli değil. |
| InvalidPlace | Sağlanan yer geçersiz. | Yer için eşleşen Evren ID'si yok. Daha sonra tekrar deneyin. |
| InvalidTarget | Sağlanan hedef geçersiz. | Sıralı veri deposu anahtar adı 50 karakter limitini aşıyor. |
| InvalidUniverse | Sağlanan evren geçersiz. | Evren için eşleşen Yer ID'si yok. Daha sonra tekrar deneyin. |
| InvalidUserIds | Sağlanan kullanıcı kimlikleri geçersiz bir formata sahip. | Kullanıcı kimliklerini ayrıştırmada başarısız olundu. |
| KeyThrottled | İstek oranı anahtar için izin verilen maksimumu aşıyor. | Tek bir anahtar için izin verilen maksimum istek oranını aşıyor. |
| KeyNotFound | İstenen anahtar mevcut değil. | Anahtar mevcut değil. |
| N/A | İlerlemek için sayfa yok. | Bu hata, Pages:AdvanceToNextPageAsync()'yi son sayfada çağırdığınızda oluşur. |
| StandardReadExperienceThrottled | Standart okuma isteği oranı deneyim için izin verilen maksimumu aşıyor. | GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), veya standart bir veri deposunda UpdateAsync() okuması, StandardRead deneyim düzeyi oran limitini aştı. |
| StandardWriteExperienceThrottled | Standart yazma isteği oranı deneyim için izin verilen maksimumu aşıyor. | SetAsync(), IncrementAsync(), veya standart bir veri deposunda UpdateAsync() yazması, StandardWrite deneyim düzeyi oran limitini aştı. |
| StandardListExperienceThrottled | Standart listeleme isteği oranı deneyim için izin verilen maksimumu aşıyor. | ListKeysAsync(), ListVersionsAsync(), veya standart veri depolarında ListDataStoresAsync() isteği, StandardList deneyim düzeyi oran limitini aştı. |
| StandardRemoveExperienceThrottled | Standart kaldırma isteği oranı deneyim için izin verilen maksimumu aşıyor. | Standart bir veri deposunda RemoveAsync() isteği, StandardRemove deneyim düzeyi oran limitini aştı. |
| OrderedReadExperienceThrottled | Sıralı okuma isteği oranı deneyim için izin verilen maksimumu aşıyor. | GetAsync(), BatchGetAsync(), veya sıralı bir veri deposunda UpdateAsync() okuması, OrderedRead deneyim düzeyi oran limitini aştı. |
| OrderedWriteExperienceThrottled | Sıralı yazma isteği oranı deneyim için izin verilen maksimumu aşıyor. | SetAsync(), IncrementAsync(), veya sıralı bir veri deposunda UpdateAsync() yazması, OrderedWrite deneyim düzeyi oran limitini aştı. |
| OrderedListExperienceThrottled | Sıralı listeleme isteği oranı deneyim için izin verilen maksimumu aşıyor. | GetSortedAsync() isteği, sıralı bir veri deposunda OrderedList deneyim düzeyi oran limitini aştı. |
| OrderedRemoveExperienceThrottled | Sıralı kaldırma isteği oranı deneyim için izin verilen maksimumu aşıyor. | RemoveAsync() isteği, sıralı bir veri deposunda OrderedRemove deneyim düzeyi oran limitini aştı. |
Limitler
Veri modellerinin limitleri vardır. Bir deneyim bu limitleri aşarsa, hizmet otomatik olarak deneyimin veri deposu kullanımını sınırlayarak gelecekteki isteklerin aşağıdaki kuyruklardan birine yerleştirilmesine neden olur:
- Ayarla
- Sıralı ayarla
- Al
- Sıralı al
Bir kuyruktaki istekler, alındıkları sıraya göre işlenir. Çağrılan işlev, isteği hala kuyrukta olduğu sürece beklemeye devam eder. Eğer veri deposu anahtarı kendisi sınırlıysa, istek bir kuyruğa yerleştirilir ama geçici olarak atlanır.
Her kuyruğun 30 isteklik bir limiti vardır. Bir kuyruğun limiti aşıldığında, istekler 301-306 aralığında bir hata kodu ile başarısız olur ve isteklerin tamamen bırakıldığını gösterir.
Erişim limitleri
Veri depoları, hem deneyim hem de sunucu düzeyi limitlerine tabidir. Deneyim düzeyi limitleri, deneyim boyunca toplam eşzamanlı kullanıcı sayısına göre ölçeklenirken, sunucu düzeyi limitleri yapılandırılabilir ve yaratıcı tarafından bir araç olarak kullanılmak üzere tasarlanmıştır.
Deneyim Limitleri
Her deneyim, veri deposu türüne, istek türüne ve eşzamanlı kullanıcı sayısına bağlı olarak belirli sayıda veri deposu isteğine izin verilir. Her veri deposu türü ve istek türü için limit, listelenen tüm işlevler arasında paylaşılır.
- UpdateAsync() hem okuma hem de yazma istek bütçesinden tüketir. Tek bir çağrı her iki limiti de azaltır.
- Oyun sunucusu ve Açık Bulut bütçeyi paylaşır; Açık Bulut trafiği, deneyim içindeki kullanıma göre sınırlanabilir (ve tersine). Daha fazla rehberlik için Oran limitlerini kontrol et bölümüne bakın.
Standart veri depoları
| İstek türü | Oyun sunucusu API'si | Açık Bulut API'si | Paylaşılan limitler (dakikada istek) |
|---|---|---|---|
| Okuma | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() UpdateAsync() | Veri Deposu Girişi Al | 300 + eşzamanlıKullanıcılar × 40 |
| Yazma | SetAsync() IncrementAsync() UpdateAsync() | Veri Deposu Girişi Oluştur, Güncelle, Artır | 300 + eşzamanlıKullanıcılar × 20 |
| Listeleme | ListDataStoresAsync() ListKeysAsync() ListVersionsAsync() | Veri Depolarını Listele, Veri Deposu Girişlerini Listele, Veri Deposu Girişi Revizyonlarını Listele | 300 + eşzamanlıKullanıcılar × 2 |
| Kaldırma | RemoveAsync() | Veri Deposu Girişini Sil, Veri Deposunu Sil, Veri Deposunu Geri Yükle | 300 + eşzamanlıKullanıcılar × 40 |
Sıralı veri depoları
| İstek türü | Oyun sunucusu API'si | Açık Bulut API'si | Paylaşılan limitler (dakikada istek) |
|---|---|---|---|
| Okuma | GetAsync() BatchGetAsync() UpdateAsync() | Sıralı Veri Deposu Girişini Al | 300 + eşzamanlıKullanıcılar × 40 |
| Yazma | SetAsync() IncrementAsync() UpdateAsync() | Sıralı Veri Deposu Girişini Oluştur, Güncelle, Artır | 300 + eşzamanlıKullanıcılar × 20 |
| Listeleme | GetSortedAsync() | Sıralı Veri Deposu Girişlerini Listele | 300 + eşzamanlıKullanıcılar × 2 |
| Kaldırma | RemoveAsync() | Sıralı Veri Deposu Girişini Sil | 300 + eşzamanlıKullanıcılar × 40 |
Oran limitlerini kontrol et
Açık Bulut ve oyun sunucusu istekleri paylaşıldığı için, her birinin bütçeden ne kadar tüketebileceğini bağımsız olarak kontrol etmek önemlidir.
Oyun sunucusu
Bireysel sunucular, yukarıda açıklandığı gibi yerleşik limitlere sahiptir. Bireysel sunucuların toplam bütçeye katkısını ince ayar yapmak için SetRateLimitForRequestType() ve GetRequestBudgetForRequestType() kombinasyonunu kullanın.
Açık Bulut
Açık Bulut istekleri, harici bir oran sınırlama çözümü gerektirir. Aşağıdaki yaklaşımlardan birini öneriyoruz:
- (Basit) Her isteğin ardından kısa bir zaman aşımı ekleyin, özellikle aynı API'yi sürekli bir döngüde çağırıyorsanız. Bu zaman aşımını 60 / (istenen bütçe tüketimi dakikada) saniye olarak ayarlayın, üst sınır olarak. Bu yaklaşım, isteklerin patlama halinde gönderilmesine izin vermez.
- (Sağlam) Sızıntı kovası stratejisini kullanarak yerel bir oran sınırlayıcı uygulayın.
Aşağıdaki Node.js kod örnekleri referans uygulamaları içermektedir.
const apiKey = process.env.API_KEY;
if (!apiKey) {
throw new Error('API_KEY ortam değişkeni ayarlanmamış.');
}
const apiHeaderKey = 'x-api-key';
const universeId = '';
const dataStoreId = 'Inventory';
const baseUrl = 'https://apis.roblox.com/cloud/v2/';
// --- İşlem başına oran sınırlama yapılandırması (dakikada istek) ---
const LIST_RATE_PER_MIN = 60;
const GET_RATE_PER_MIN = 120;
const UPDATE_RATE_PER_MIN = 60;
// Her işlem için üst sınır aralığı: 60 / (dakikada istek) saniye.
const LIST_INTERVAL_MS = (60 / LIST_RATE_PER_MIN) * 1000;
const GET_INTERVAL_MS = (60 / GET_RATE_PER_MIN) * 1000;
const UPDATE_INTERVAL_MS = (60 / UPDATE_RATE_PER_MIN) * 1000;
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
// İsteği gerçekleştirir, ardından bu işlemin kendi aralığı kadar bekler.
async function throttledFetch(url, options, intervalMs) {
const response = await fetch(url, options);
await sleep(intervalMs);
return response;
}
async function listEntries(universe, dataStore) {
const listPath = `universes/${universe}/data-stores/${dataStore}/entries`;
const url = baseUrl + listPath;
const response = await throttledFetch(url, {
headers: { [apiHeaderKey]: apiKey }
}, LIST_INTERVAL_MS);
return response.json();
}
async function getEntry(path) {
const url = baseUrl + path;
const response = await throttledFetch(url, {
headers: { [apiHeaderKey]: apiKey }
}, GET_INTERVAL_MS);
return response.json();
}
async function updateEntry(path, payload) {
const url = baseUrl + path;
const response = await throttledFetch(url, {
method: 'PATCH',
headers: {
[apiHeaderKey]: apiKey,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload) // Gövde bir dize olmalıdır
}, UPDATE_INTERVAL_MS);
return response;
}
(async () => {
try {
const entries = await listEntries(universeId, dataStoreId);
for (const entry of entries.dataStoreEntries) {
const path = entry.path;
console.log(`\nİşlem yapılıyor: ${path}`);
const currentData = await getEntry(path);
currentData.value.currency += 10;
const payload = { value: currentData.value };
const updateResponse = await updateEntry(path, payload);
console.log(`Durum: ${updateResponse.status}`);
console.log(`Yanıt: ${await updateResponse.text()}`);
}
} catch (error) {
console.error('Yürütme sırasında bir hata oluştu:', error);
}
})();Sunucu limitleri
Her sunucunun, o sunucudaki oyuncu sayısına bağlı olarak her istek türü için yapılandırılabilir bir oran limiti vardır. Sunucular, ilk oluşturulduklarında bir kerelik ek istek bütçesi alırlar. Mevcut sunucunun herhangi bir zamanda yapabileceği veri deposu isteklerinin sayısını doğrulamak için GetRequestBudgetForRequestType() kullanın.
Bu limitler, yaratıcı tarafından yapılandırılabilir ve SetRateLimitForRequestType() API'si kullanılarak ayarlanabilir. Bu API'yi kullanarak, bir yaratıcı her istek türü için kendi veri deposu oran limitlerini yapılandırabilir.
Aşağıdaki varsayılan oran limitleri, API çağrılmadığında geçerlidir:
Standart veri depoları
| İstek türü | DataStoreRequestType Enum | Oyun sunucusu API'si | Dakikada istek |
|---|---|---|---|
| Okuma | StandardRead | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() UpdateAsync() | 60 + oyuncuSayısı × 40 |
| Yazma | StandardWrite | SetAsync() IncrementAsync() UpdateAsync() | 60 + oyuncuSayısı × 40 |
| Listeleme | StandardList | ListDataStoresAsync() ListKeysAsync() ListVersionsAsync() | 5 + oyuncuSayısı × 2 |
| Kaldırma | StandardRemove | RemoveAsync() | 60 + oyuncuSayısı × 40 |
| RemoveVersion (Kullanımdan kaldırıldı) | RemoveVersionAsync | RemoveVersionAsync() | 5 + oyuncuSayısı × 2 |
Sıralı veri depoları
| İstek türü | DataStoreRequestType Enum | Oyun sunucusu API'si | Dakikada istek |
|---|---|---|---|
| Okuma | OrderedRead | GetAsync() BatchGetAsync() UpdateAsync() | 60 + oyuncuSayısı × 40 |
| Yazma | OrderedWrite | SetAsync() IncrementAsync() UpdateAsync() | 30 + oyuncuSayısı × 5 |
| Listeleme | OrderedList | GetSortedAsync() | 5 + oyuncuSayısı × 2 |
| Kaldırma | OrderedRemove | RemoveAsync() | 30 + oyuncuSayısı × 5 |
Veri limitleri
Veri depoları, her giriş başına ne kadar veri kullanılabileceğini sınırlar.
Veri deposu adı, anahtar adı ve kapsam belirli bir karakter uzunluğunun altında olmalıdır. Uzunluklarını kontrol etmek için string.len() kullanın.
Veri (anahtar değeri) başlangıç türünden bağımsız olarak bir dize olarak saklanır. Verinin boyutunu, Luau verisini serileştirilmiş bir JSON tablosuna dönüştüren JSONEncode() işlevi ile kontrol edebilirsiniz.
| Bileşen | Maksimum karakter sayısı |
|---|---|
| Veri deposu adı | 50 |
| Anahtar adı | 50 |
| Kapsam | 50 |
| Veri (anahtar değeri) | 4,194,304 her anahtar için |
Meta veri limitleri
Kullanıcı tanımlı meta verilerdeki karakter sayısına sınırlamalar.
| Bileşen | Maksimum karakter sayısı |
|---|---|
| Anahtar adı | 50 |
| Değer | 250 |
| Anahtar-değer çiftleri | 300 |
Verimlilik limitleri
Anahtar başına verimlilik limitleri, Roblox sunucularında performansın optimal olmasını sağlar. Her limit, bir deneyimdeki tüm sunuculardaki her bir anahtara uygulanır ve zamanla yenilenir.
Roblox, anahtara bağlı olan kotaların son 60 saniyedeki kullanımını inceler. Kullanım, mevcut isteği de içerecek şekilde verimlilik limitinin içindeyse, istek onaylanır. Kullanım limitin üzerinde ise, istek reddedilir.
| İstek türü | Oyun sunucusu API'si | Açık Bulut API'si | Limit |
|---|---|---|---|
| Okuma | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() ListVersionsAsync() UpdateAsync() | Veri Deposu Girişi Al | 25 MB dakikada |
| Yazma | SetAsync() IncrementAsync() UpdateAsync() RemoveAsync() | Veri Deposu Girişi Oluştur, Güncelle, Artır, Kaldır | 4 MB dakikada |
Yukarıdaki verimlilik limitlerine ek olarak, Roblox verileri dahili bir şemaya dayalı olarak parçalara ayırır. Sonuç olarak, arka uç sunucusu aynı veri deposuna yüksek hacimli istekler aldığında, daha fazla sınırlama ile sonuçlanabilir. Neden ne olursa olsun, sınırlama ya DatastoreThrottled ya da KeyThrottled hataları olarak kendini gösterir; bu, verimlilik limitinin bir veri deposu veya bir anahtar için aşılıp aşılmadığına bağlıdır. Bu hata mesajları, hem sıralı hem de standart veri depoları için geçerlidir.
Depolama limitleri
Depolama kullanımını stabil ve ölçeklenebilir tutmak için, veri depoları depolama kullanımınıza bir oyun düzeyi limiti uygular.
Bu limit, her oyun için bir temel tahsisat ve ek olarak yaşam boyu kullanıcı sayısına dayalı bir ek tahsisat içerir. Bir yaşam boyu kullanıcı, oyununuza en az bir kez katılan herhangi bir kullanıcıdır.
Depolama limiti, aşağıdaki formül kullanılarak hesaplanır: Toplam en son sürüm depolama limiti = 500 MB + 1 MB × yaşam boyu kullanıcı sayısı.
Depolama kullanımı, her anahtarın en son sürümünün sıkıştırılmış boyutu kullanılarak ölçülür. Veri depoları, verilerinizi depolamadan önce otomatik olarak sıkıştırır, bu nedenle kendiniz önceden sıkıştırmaktan kaçının. Ön sıkıştırma, gereksiz CPU yükü ekler ve veri depolarının yerleşik sıkıştırmasının etkinliğini azaltabilir. Sıkıştırılmamış verileri saklayarak, Roblox'un sıkıştırma algoritmalarındaki iyileştirmelerden ve gelecekteki şemaya dayalı optimizasyonlardan otomatik olarak faydalanırsınız.
Her anahtarın yalnızca en son sürümü depolama kullanımınıza sayılır. Silinmiş anahtarlar ve geçersiz sürümler, saklama süresi boyunca sürüm API'leri aracılığıyla hala erişilebilir olsa da, depolama kullanımınıza sayılmaz. Ancak, Açık Bulut üzerinden silinen veri depoları DeleteDataStore yöntemi, kalıcı olarak kaldırılana kadar 30 günlük silme işleme süresi boyunca depolama kullanımınıza sayılmaya devam eder.