Veri depolarına yaptığınız istekler, kötü bağlantı veya diğer sorunlar nedeniyle başarısız olabilir. Hataları ele almak ve hata kodu ile birlikte mesajlar döndürmek için veri deposu işlevlerini pcall() içine sarın.
UpdateAsync() gibi bir yazma çağrısının başarısız olması, oyun sunucusunun başarılı bir yanıt almadığını gösterir. Ancak bu, arka uç yazımının gerçekleşmediğini garanti etmez. Bazı başarısızlık senaryolarında, nihai yazım durumu, takip eden bir okuma ile doğrulanana kadar arayan kişi için bilinmez olabilir.
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 50 karakter uzunluğunu aşıp aşmadığını kontrol edin. | |
| 103 | ValueNotAllowed | X'ye veri deposunda izin verilemez. | Kötü bir güncelleme işlevi, X türünde bir değer döndürdü. | |
| 104 | CantStoreValue | X'yi veri deposunda depolayamıyorum. | Güncelleme işlevi, seri hale getirilemeyen X türünde bir değer döndürdü. | |
| 105 | ValueTooLarge | Seri hale getirilmiş değer X limitini aşıyor. | SetAsync() veya UpdateAsync() ile bir değer ayarlıyorsanız, değerinin seri halinin boyutu X'yi aşamaz. Verinin seri halinin 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çiyorsanız, bu bir tamsayı olmalıdır. | |
| 106 | MinValueInvalid | MinValue bir tamsayı olmalıdır. | GetSortedAsync() için bir minimum değer geçiyorsanı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 ona eşit olmalıdır. | Maksimum değer, GetSortedAsync() için minimum değerden büyük veya ona eşit olmak zorundadır. | |
| 301 | GetAsyncThrottle | GetAsync isteği reddedildi. İstek sınırlandırıldı ama kuyruk doluydu. | GetAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | |
| 302 | SetAsyncThrottle | SetAsync isteği reddedildi. İstek sınırlandırıldı ama kuyruk doluydu. | SetAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | |
| 303 | IncreAsyncThrottle | IncrementAsync isteği reddedildi. İstek sınırlandırıldı ama kuyruk doluydu. | IncrementAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | |
| 304 | UpdateAsyncThrottle | UpdateAsync isteği reddedildi. İstek sınırlandırıldı ama kuyruk doluydu. | UpdateAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | |
| 304 | TransformThrottle | UpdateAsync isteği reddedildi. İstek sınırlandırıldı ama kuyruk doluydu. | UpdateAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | |
| 305 | GetSortedThrottle | GetSorted isteği reddedildi. İstek sınırlandırıldı ama kuyruk doluydu. | GetSortedAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | |
| 306 | RemoveAsyncThrottle | RemoveAsync isteği reddedildi. İstek sınırlandırıldı 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 kapatılırken erişilemez. | DataModel, deneyim kapatıldığı için başlatılmamıştır. | |
| 402 | LuaWebSrvsNoAccess | İstek başarısız oldu. LuaWebService, deneyim kapatılırken erişilemez. | LuaWebService, deneyim kapatıldığı için başlatılmamıştır. | |
| 403 | StudioAccessToApisNotAllowed | API erişimi etkinleştirilmediği için Stüdyodan DataStore'a yazılamaz. | Stüdyoda veri depolarını kullanabilmek için API erişimi etkin olmalıdır. | |
| 404 | InternalError | OrderedDataStore mevcut değil. | Bu istekle ilişkili olan OrderedDataStore bulunamadı. Bu, veri bozulmasının bir işareti olabilir. Daha sonra tekrar deneyin. | |
| 501 | InternalError | Yanıtı ayrıştırmak mümkün olmadı çünkü veri bozulmuş olabilir. | Sunucu, isteğinize yanıtı ayrıştıramadı. Bu, veri bozulmasının bir işareti olabilir. Daha sonra tekrar deneyin. | |
| 502 | RequestRejected | API Hizmetleri, isteği X hatası ile reddetti. | Roblox sunucularında işleme sırasında X hatası oluştu. Daha sonra tekrar deneyin. | |
| 503 | InternalError | Veri deposu isteği başarılıydı ancak 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ı ancak yanıt doğru şekilde formatlanmamıştı. | Sunucu, isteğinize yanıtı ayrıştıramadı. Bu, veri bozulmasının bir işareti olabilir. Daha sonra tekrar deneyin. | |
| 505 | InternalError | OrderedDataStore isteği başarılıydı ancak yanıt doğru şekilde formatlanmamıştı. | Sunucu, OrderedDataStore isteğinize yanıtı ayrıştıramadı. Bu, veri bozulmasının bir işareti olabilir. Daha sonra tekrar deneyin. | |
| 509 | OperationNotAllowed | Kişisel RCC'de çalışırken veri deposu işlemleri engellenmiştir, olası veri bozulmasını önlemek için. | Özel RCC kanallarında veri deposu yazımları engellenmiştir. | |
| 511 | AttributeSizeTooLarge | Meta veri özniteliği boyutu X limitini aşıyor. | Sıralı meta veri boyutu, X limitini aşıyor. Değer X dinamik olarak değişir. Boyut değiştiğinde, değer de değişir. | |
| 512 | UserIdLimitExceeded | UserID boyutu X limitini aşıyor. | Kullanıcıdan sağlanan kullanıcı kimlikleri dizisinin uzunluğu X limitini aşıyor. | |
| 513 | AttributeFormatError | Anahtar userId formatı geçersiz. | Sağlanan kullanıcı kimliği bir sayı değil. | |
| 513 | AttributeFormatError | Anahtar meta veri formatı geçersiz. | Meta veri bir tablo değil. | |
| GetVersionAsyncThrottle | GetVersionAsync isteği reddedildi. İstek sınırlandırıldı. | GetVersionAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | ||
| GetVersionAtTimeAsyncThrottle | GetVersionAtTimeAsync isteği reddedildi. İstek sınırlandırıldı. | GetVersionAtTimeAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | ||
| ListDataStoresAsyncThrottle | ListDataStoresAsync isteği reddedildi. İstek sınırlandırıldı. | ListDataStoresAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | ||
| ListKeysAsyncThrottle | ListKeysAsync isteği reddedildi. İstek sınırlandırıldı. | ListKeysAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | ||
| ListVersionsAsyncThrottle | ListVersionsAsync isteği reddedildi. İstek sınırlandırıldı. | ListVersionsAsync() isteği maksimum kuyruk boyutunu aştı ve Roblox mevcut verimlilikte istekleri işleyemiyor. | ||
| RemoveVersionAsyncThrottle | RemoveVersionAsync isteği reddedildi. İstek sınırlandırıldı. | 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 nedeniyle sınırlandırıldı. | Bir GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), veya standart bir veri deposunda UpdateAsync() okuma isteği, StandardRead deneyim düzeyindeki oran limitini aştı. | ||
| StandardWriteExperienceThrottled | StandardWrite isteği deneyim limitleri nedeniyle sınırlandırıldı. | Bir SetAsync(), IncrementAsync(), veya standart bir veri deposunda UpdateAsync() yazma isteği, StandardWrite deneyim düzeyindeki oran limitini aştı. | ||
| StandardListExperienceThrottled | StandardList isteği deneyim limitleri nedeniyle sınırlandırıldı. | Bir ListKeysAsync(), ListVersionsAsync(), veya standart veri depolarında ListDataStoresAsync() isteği, StandardList deneyim düzeyindeki oran limitini aştı. | ||
| StandardRemoveExperienceThrottled | StandardRemove isteği deneyim limitleri nedeniyle sınırlandırıldı. | Bir RemoveAsync() isteği standart bir veri deposunda StandardRemove deneyim düzeyindeki oran limitini aştı. | ||
| OrderedReadExperienceThrottled | OrderedRead isteği deneyim limitleri nedeniyle sınırlandırıldı. | Bir GetAsync() isteği veya bir sıralı veri deposunda UpdateAsync() okuma isteği, OrderedRead deneyim düzeyindeki oran limitini aştı. | ||
| OrderedWriteExperienceThrottled | OrderedWrite isteği deneyim limitleri nedeniyle sınırlandırıldı. | Bir SetAsync(), IncrementAsync(), veya bir sıralı veri deposunda UpdateAsync() yazma isteği, OrderedWrite deneyim düzeyindeki oran limitini aştı. | ||
| OrderedListExperienceThrottled | OrderedList isteği deneyim limitleri nedeniyle sınırlandırıldı. | Bir GetSortedAsync() isteği bir sıralı veri deposunda OrderedList deneyim düzeyindeki oran limitini aştı. | ||
| OrderedRemoveExperienceThrottled | OrderedRemove isteği deneyim limitleri nedeniyle sınırlandırıldı. | Bir RemoveAsync() isteği bir sıralı veri deposunda OrderedRemove deneyim düzeyindeki oran limitini aştı. | ||
| StandardReadGameServerThrottled | StandardRead isteği oyun sunucusu limitleri nedeniyle sınırlandırıldı veya istek kuyruğu doluydu. | Bir GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), veya standart bir veri deposunda UpdateAsync() okuma isteği, StandardRead oyun sunucusu düzeyindeki oran limitini aştı. | ||
| StandardWriteGameServerThrottled | StandardWrite isteği oyun sunucusu limitleri nedeniyle sınırlandırıldı veya istek kuyruğu doluydu. | Bir SetAsync(), IncrementAsync(), veya standart bir veri deposunda UpdateAsync() yazma isteği, StandardWrite oyun sunucusu düzeyindeki oran limitini aştı. | ||
| StandardListGameServerThrottled | StandardList isteği oyun sunucusu limitleri nedeniyle sınırlandırıldı veya istek kuyruğu doluydu. | Bir ListKeysAsync(), ListVersionsAsync(), veya ListDataStoresAsync() isteği standart veri depolarında StandardList oyun sunucusu düzeyindeki oran limitini aştı. | ||
| StandardRemoveGameServerThrottled | StandardRemove isteği oyun sunucusu limitleri nedeniyle sınırlandırıldı veya istek kuyruğu doluydu. | Bir RemoveAsync() isteği standart bir veri deposunda StandardRemove oyun sunucusu düzeyindeki oran limitini aştı. | ||
| OrderedReadGameServerThrottled | OrderedRead isteği oyun sunucusu limitleri nedeniyle sınırlandırıldı veya istek kuyruğu doluydu. | Bir GetAsync() isteği veya bir sıralı veri deposunda UpdateAsync() okuma isteği OrderedRead oyun sunucusu düzeyindeki oran limitini aştı. | ||
| OrderedWriteGameServerThrottled | OrderedWrite isteği oyun sunucusu limitleri nedeniyle sınırlandırıldı veya istek kuyruğu doluydu. | Bir SetAsync(), IncrementAsync(), veya bir sıralı veri deposunda UpdateAsync() yazma isteği OrderedWrite oyun sunucusu düzeyindeki oran limitini aştı. | ||
| OrderedListGameServerThrottled | OrderedList isteği oyun sunucusu limitleri nedeniyle sınırlandırıldı veya istek kuyruğu doluydu. | Bir GetSortedAsync() isteği bir sıralı veri deposunda OrderedList oyun sunucusu düzeyindeki oran limitini aştı. | ||
| OrderedRemoveGameServerThrottled | OrderedRemove isteği oyun sunucusu limitleri nedeniyle sınırlandırıldı veya istek kuyruğu doluydu. | Bir RemoveAsync() isteği bir sıralı veri deposunda OrderedRemove oyun sunucusu düzeyindeki 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ı veri deposu 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 meydana gelen hata. Tekrar deneyin, tercihen eksponansiyel geri dönüş ile. |
| InvalidExclusiveStartKey | Sağlanan özel başlangıç anahtarı geçerli değil. | Bir listeleme işlemi gibi 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 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 yok. Daha sonra tekrar deneyin. |
| InvalidUserIds | Sağlanan kullanıcı kimliklerinin geçersiz formatı var. | Kullanıcı kimliklerini ayrıştırmada başarısız olundu. |
| KeyThrottled | İstek oranı anahtar için izin verilen maksimumu aşıyor. | İstek oranı, 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 hiçbir sayfa yok. | Bu hata, Pages:AdvanceToNextPageAsync()'i son sayfada çağırdığınızda oluşur. |
| StandardReadExperienceThrottled | Standart okuma isteği oranı deneyim için izin verilen maksimumu aşıyor. | Bir GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), veya standart bir veri deposunda UpdateAsync() okuma isteği, StandardRead deneyim düzeyindeki oran limitini aştı. |
| StandardWriteExperienceThrottled | Standart yazma isteği oranı deneyim için izin verilen maksimumu aşıyor. | Bir SetAsync(), IncrementAsync(), veya standart bir veri deposunda UpdateAsync() yazma isteği, StandardWrite deneyim düzeyindeki oran limitini aştı. |
| StandardListExperienceThrottled | Standart liste isteği oranı deneyim için izin verilen maksimumu aşıyor. | Bir ListKeysAsync(), ListVersionsAsync(), veya standart veri depolarında ListDataStoresAsync() isteği, StandardList deneyim düzeyindeki oran limitini aştı. |
| StandardRemoveExperienceThrottled | Standart kaldırma isteği oranı deneyim için izin verilen maksimumu aşıyor. | Bir RemoveAsync() isteği standart bir veri deposunda StandardRemove deneyim düzeyindeki oran limitini aştı. |
| OrderedReadExperienceThrottled | Sıralı okuma isteği oranı deneyim için izin verilen maksimumu aşıyor. | Bir GetAsync() isteği veya bir sıralı veri deposunda UpdateAsync() okuma isteği, OrderedRead deneyim düzeyindeki oran limitini aştı. |
| OrderedWriteExperienceThrottled | Sıralı yazma isteği oranı deneyim için izin verilen maksimumu aşıyor. | Bir SetAsync(), IncrementAsync(), veya bir sıralı veri deposunda UpdateAsync() yazma isteği, OrderedWrite deneyim düzeyindeki oran limitini aştı. |
| OrderedListExperienceThrottled | Sıralı liste isteği oranı deneyim için izin verilen maksimumu aşıyor. | Bir GetSortedAsync() isteği bir sıralı veri deposunda OrderedList deneyim düzeyindeki oran limitini aştı. |
| OrderedRemoveExperienceThrottled | Sıralı kaldırma isteği oranı deneyim için izin verilen maksimumu aşıyor. | Bir RemoveAsync() isteği bir sıralı veri deposunda OrderedRemove deneyim düzeyindeki oran limitini aştı. |
Sınırlamalar
Veri modellerinin sınırlamaları vardır. Eğer bir deneyim bu sınırlamaları aşarsa, hizmet otomatik olarak deneyimin veri deposu kullanımını sınırlandırır ve gelecek 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ırada işlenir. Çağrılan işlev, isteği hâlâ sırada kaldığı sürece beklemeye devam eder. Eğer veri deposu anahtarı kendisi sınırlıysa, istek bir kuyruğa yerleştirilir ancak 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 reddedildiğini gösterir.
Erişim limitleri
Veri depoları hem deneyim hem de sunucu seviyesinde sınırlamalara tabidir. Deneyim düzeyi sınırlamaları, tüm eşzamanlı kullanıcı sayısına göre ölçeklenirken, sunucu düzeyi sınırlamaları yapılandırılabilir ve içerik üreticisi tarafından bir araç olarak kullanılmak amacıyla oluşturulmuştur.
Deneyim Sınırlamaları
Her deneyim, veri deposu türüne, istek türüne ve eşzamanlı kullanıcı sayısına dayanarak 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çelerinden tüketir. Tek bir çağrı her iki limiti de azaltır.
- Oyun sunucusu ve Açık Bulut paylaşır bir bütçe; Açık Bulut trafiği, deneyim içi kullanım tarafından sınırlandırılabilir (ve tersi). Daha fazla bilgi için Kontrol oran limitleri kısmına bakın.
Standart veri depoları
| İstek türü | Oyun sunucusu API'si | Açık Bulut API'si | Paylaşılan limitler (dakikada istek sayısı) |
|---|---|---|---|
| Okuma | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() UpdateAsync() | Veri Deposu Girişini Al | 300 + eşzamanlıKullanıcılar × 40 |
| Yazma | SetAsync() IncrementAsync() UpdateAsync() | Veri Deposu Girişini 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 sayısı) |
|---|---|---|---|
| Okuma | GetAsync() UpdateAsync() | Sıralı Veri Deposu Girişini Al | 300 + eşzamanlıKullanıcılar × 40 |
| Yazma | SetAsync() IncrementAsync() UpdateAsync() | Veri Girişi 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 |
Kontrol oran limitleri
Çünkü Açık Bulut ve oyun sunucusu istekleri paylaşıldığından, her birinin bütçeden ne kadar tüketebileceğini bağımsız olarak kontrol etmek önemlidir.
Oyun sunucusu
Bireysel sunucuların yukarıda açıklandığı gibi yerleşik limitleri vardır. SetRateLimitForRequestType() ve GetRequestBudgetForRequestType() kombinasyonunu kullanarak bireysel sunucuların toplam bütçeye katkılarını ayrıntılı bir şekilde kontrol edebilirsiniz.
Açık Bulut
Açık Bulut istekleri için harici bir oran sınırlama çözümü gerekir. Aşağıdaki yöntemlerden birini öneririz:
- (Basit) Her isteğin ardından kısa bir zaman aşımı ekleyin, özellikle de aynı API'yi sürekli bir döngüde çağırıyorsanız. Bu zaman aşımını 60 / (istek başına istenen bütçe tüketimi) saniye olarak ayarlayın ve üst sınır olarak belirleyin. Bu yaklaşım, isteklerin patlama halinde gönderilmesine izin vermez.
- (Sağlam) Sızıntılı bucket stratejisi 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: 60 / (istek sayısı/dakika) 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 dönüş yapmadan önce bu işlemin kendi aralığını 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İşleme alını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 dayanan her istek türü için yapılandırılabilir bir oran sınırı vardır. Sunucular ilk kez oluşturulduğunda, ek bir istek bütçesi için bir kezlik başlangıç patlaması alırlar. GetRequestBudgetForRequestType() kullanarak, mevcut sunucunun her zaman ne kadar veri deposu isteği yapabileceğini doğrulayabilirsiniz.
Bu limitler, içerik üreticisi tarafından yapılandırılabilir olup, SetRateLimitForRequestType() API'si aracılığıyla kullanılmaktadır. Bu API'yi kullanarak, bir içerik üreticisi 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ığı takdirde geçerlidir:
Standart veri depoları
| İstek türü | DataStoreRequestType Enum | Oyun sunucusu API'si | Dakikadaki istek sayısı |
|---|---|---|---|
| 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 (Eski) | RemoveVersionAsync | RemoveVersionAsync() | 5 + oyuncuSayısı × 2 |
Sıralı veri depoları
| İstek türü | DataStoreRequestType Enum | Oyun sunucusu API'si | Dakikadaki istek sayısı |
|---|---|---|---|
| Okuma | OrderedRead | GetAsync() 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ılacağını sınırlamaktadır.
Veri deposu adı, anahtar adı ve kapsam belirli bir karakter uzunluğu altında olmalıdır. Uzunluklarını kontrol etmek için string.len() kullanın.
Veri (anahtar değeri) aynı zamanda başlangıçta ne olursa olsun bir dize olarak saklanır. Verinin boyutunu, Luau verilerini seri hale getirilmiş bir JSON tablosuna dönüştüren JSONEncode() fonksiyonu 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ı kısıtlamaları.
| Bileşen | Maksimum karakter sayısı |
|---|---|
| Anahtar adı | 50 |
| Değer | 250 |
| Anahtar-değer çiftleri | 300 |
Üretim limitleri
Anahtar başına üretim limitleri, Roblox sunucularında performansın optimum olmasını sağlar. Her limit, belirli bir deneyim süresince tüm sunuculardaki her bir anahtara uygulanır ve zamanla yenilenir.
Roblox, son 60 saniye boyunca anahtarla ilişkili kota kullanımını inceler. Eğer kullanım, mevcut isteği de içerecek şekilde, üretim limiti içinde ise, istek onaylanır. Eğer kullanım limiti aşarsa, istek reddedilir.
| İstek türü | Oyun sunucusu API'si | Açık Bulut API'si | Limit |
|---|---|---|---|
| Okuma | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() ListVersionsAsync() UpdateAsync() | Veri Deposu Girişini Al | 25 MB/dakika |
| Yazma | SetAsync() IncrementAsync() UpdateAsync() RemoveAsync() | Veri Deposu Girişini Oluştur, Güncelle, Artır, Kaldır | 4 MB/dakika |
Yukarıdaki üretim limitlerinin yanı sıra, Roblox verileri, içsel bir şemaya dayanarak partitionlara ayırır. Bu nedenle, arka uç sunucusu aynı veri deposuna yüksek hacimli istekler aldığında, daha fazla sınırlandırma ile sonuçlanabilir. Bunun nedeni ne olursa olsun, sınırlama, ya DatastoreThrottled ya da KeyThrottled hataları olarak ortaya çıkar, bu da üretim limitinin ya tek bir veri deposu ya da bir anahtar için aşıldığını gösterir. Bu hata mesajları, hem sıralı hem de standart veri deposuna uygulanır.
Depolama limitleri
Depolamanın istikrarlı ve ölçeklenebilir olmasını sağlamak için veri depoları, sizin depolama kullanımızda bir oyun düzeyi limiti kullanır.
Bu limit, her oyun için bir temel tahsis ve ek olarak yaşam boyu kullanıcı sayısına dayanan bir ek tahsis içerir. Yaşam boyu kullanıcı, oyununuza en az bir kez katılan herhangi bir kullanıcıdır.
Depolama limiti aşağıdaki formülle 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 kendinizin önceden sıkıştırmaktan kaçınmalısınız. Ön sıkıştırma, gereksiz CPU yükü ekler ve veri depolarının yerleşik sıkıştırmasının etkisini azaltabilir. Sıkıştırılmamış verileri saklayarak, Roblox'un sıkıştırma algoritmalarındaki iyileşmelerden ve gelecekteki şemaya dayalı optimizasyonlardan otomatik olarak faydalanırsınız.
Her anahtarın yalnızca en son sürümü depolama kullanımızı sayılır. Silinen anahtarlar ve kapsamlı sürümler, hala tutma süresi boyunca sürüm API'leri aracılığıyla erişilebilir olsa da, depolama kullanımınıza dahil edilmez. Ancak, Açık Bulut üzerinden silinen veri depoları, DeleteDataStore yöntemi ile 30 günlük silme işlem süresi boyunca depolama kullanımızı saymaya devam eder.