Orta7 dakikalık okuma

DynamoDB Sınırları ve Kotaları, Canlı Servise Karşı Doğrulandı

DynamoDB sınırları nelerdir?

Bir item 400 KB'ta sınırlanır, bir partition anahtarı 2.048 bayt'ta ve bir sort anahtarı 1.024 bayt'ta. Bir batch write 25 item alır, bir batch get 100 anahtar, bir transaction 100 eylem. Bir tablo 20 global ve 5 local secondary index alır. Bu sayfadaki sayıların her biri, isteği Amazon DynamoDB'ye göndererek ve geri geleni okuyarak belirlendi.

Bu sayılar nasıl belirlendi

AWS kotalarını kanıt olmadan yayımlar ve bu normalde sorun değildir — ta ki bir sayı bir tasarım kararı için yük taşıyıcı hale gelene ve onun 400.000 bayt mı yoksa 409.600 mü anlamına geldiğini, öznitelik adlarınızı sayıp saymadığını ve onu aştığınızda servisin tam olarak ne söylediğini bilmek isteyene kadar.

Bu yüzden onları yokladık. Aşağıdaki ilk tablodaki her sınır için, belgelenen değerin tam üzerine oturacak bir istek kuruldu ve us-east-1'deki canlı servise gönderildi; ardından onun bir birim ötesinde ikinci bir istek. İlki kabul edilmeli, ikincisi reddedilmelidir — kenarı bulan şey belgelere güvenmek değil bu çifttir. Son sütundaki ret mesajı servisin kendi cümlesidir, birebir yakalanmış ve hiç yeniden yazılmamıştır.

Dört satır yalnızca ret tarafından belirlenebildi. Bunlar, kabul tarafı yirmi index'li bir tablo kurup her birinin etkin olmasını beklemek anlamına gelecek CreateTable sınırları — sayıyı ret zaten doğrudan söylüyor. Nasıl belirlendi sütunu hangisinin hangisi olduğunu söylüyor; süs değil.

Doğrulanmış sınırlar

SınırDeğerNasıl belirlendiAştığınızda servisin döndürdüğü
Maksimum item boyutu409.600 bayt409.600'de kabul edildi, 409.601'de reddedildiValidationException: Item size has exceeded the maximum allowed size
Maksimum partition anahtarı değeri2.048 bayt2.048'de kabul edildi, 2.049'da reddedildiValidationException: One or more parameter values were invalid: Size of hashkey has exceeded the maximum size limit of2048 bytes
Maksimum sort anahtarı değeri1.024 bayt1.024'te kabul edildi, 1.025'te reddedildiValidationException: One or more parameter values were invalid: Aggregated size of all range keys has exceeded the size limit of 1024 bytes
Maksimum iç içe geçme derinliği32 düzey32'de kabul edildi, 33'te reddedildiValidationException: 1 validation error detected: Nesting Levels have exceeded supported limits: Attributes in the item have nested levels beyond supported limit
Maksimum ifade uzunluğu4.096 bayt4.096'da kabul edildi, 4.097'de reddedildiValidationException: 1 validation error detected: Invalid ConditionExpression: Expression size has exceeded the maximum allowed size;
BatchWriteItem başına maksimum item25 item25'te kabul edildi, 26'da reddedildiValidationException: 1 validation error detected: Value '<your request>' at 'requestItems' failed to satisfy constraint: Map value must satisfy constraint: [Member must have length less than or equal to 25, Member must have length greater than or equal to 1]
BatchGetItem başına maksimum anahtar100 item100'de kabul edildi, 101'de reddedildiValidationException: 1 validation error detected: Value at 'RequestItems.<table-name>.member.Keys' failed to satisfy constraint: Member must have length less than or equal to 100
TransactWriteItems başına maksimum eylem100 item100'de kabul edildi, 101'de reddedildiValidationException: 1 validation error detected: Value '<your request>' at 'transactItems' failed to satisfy constraint: Member must have length less than or equal to 100
Tablo başına global secondary index20Yalnızca retValidationException: One or more parameter values were invalid: GlobalSecondaryIndex count exceeds the per-table limit of 20
Tablo başına local secondary index5Yalnızca retValidationException: One or more parameter values were invalid: Number of LocalSecondaryIndexes exceeds per-table limit of 5
Index başına projeksiyonlanan non-key öznitelik20Yalnızca retValidationException: 1 validation error detected: Value '<your request>' at 'globalSecondaryIndexes.1.member.projection.nonKeyAttributes' failed to satisfy constraint: Member must have length less than or equal to 20
Tablo başına projeksiyonlanan non-key öznitelik100Yalnızca retValidationException: One or more parameter values were invalid: Number of projected attributes in all indexes exceeds limit of 100, number of projected attributes:120

Ortam: Amazon DynamoDB, canlı servis, us-east-1, 2026-08-27'de AWS SDK for JavaScript v3 ile yoklandı.

Yoklamaların ortaya çıkardıkları

400 KB, 409.600 bayt demektir ve öznitelik adlarınızı da sayar. Tam olarak 409.600 baytta ölçülen bir item kabul edildi; 409.601 reddedildi. Ölçüm, her öznitelik adının artı her değerin UTF-8 uzunluğunu sayıyor — bu, item boyutu hesaplayıcımızın uyguladığı aynı hesaplama; yoklama, payload'unu tam olarak o kütüphaneyle kuruyor, bu yüzden ikisi bir iddiayla değil kurgu gereği uyuşuyor. Bu sınırın ardındaki daha derin modelleme sorununun kendi kılavuzu var: DynamoDB item boyutu sınırı.

Herkesin alıntıladığı projected-attributes sınırı yanlış olanı. AWS Quotas sayfası tek bir rakam belgeliyor — "up to 100 attributes combined for all of a table's local and global secondary indexes" — ve index başına bir üst sınırdan hiç söz etmiyor. Bir tane var ve o 20. 21 non-key öznitelik tek bir index'e projeksiyonlayan bir CreateTable, tablo başına toplam 100'e daha yakından bile geçmeden reddediliyor. 20 belgeleniyor, ama yalnızca API Referansının Projection sayfasında, bir dizi-üyesi kısıtı olarak: "Maximum number of 20 items". Bir index'i yalnızca Quotas sayfasına göre planlarsanız, API, Quotas sayfasının sorunsuz dediği bir şemayı reddeder. Her iki sayı da yukarıdaki tabloda, her biri kendini kanıtlayan retle birlikte.

Mesajlardan ikisi AWS'nin kendi yazım hatalarını içeriyor, burada sessizce düzeltilmek yerine olduğu gibi yeniden üretildi — maximum size limit of2048 bytes bir boşluk eksik, ve number of projected attributes:120 bir boşluk daha eksik. Bu string'ler için logları grep'liyorsanız, doğru okunana değil servisin gönderdiğine göre grep'leyin.

Sort anahtarları toplu ölçülür. Sort anahtarı reddi "the sort key" değil "Aggregated size of all range keys" diyor, çünkü aynı 1.024 baytlık bütçe hem tablonun sort anahtarını hem de item'ın düştüğü her local secondary index'in sort anahtarını kapsıyor.

Hiçbir şey fırlatmayan 1 MB'lık sayfa

Yukarıdaki her sınır, sizi reddederek kendini duyurur. Query ve Scan sayfa sınırı öyle değil. Onu aştığınızda DynamoDB kısa bir sayfa ve bir LastEvaluatedKey döndürür, hiç hata ve hiç uyarı olmadan — bu yüzden "Scan'im tablonun yalnızca bir kısmını döndürdü" bu kadar yaygın bir sürpriz, ve bu yüzden sayfalama isteğe bağlı değil.

Bu aynı zamanda alıntılanacak bir hata mesajı olmadığı anlamına da geliyor, bu yüzden kışkırtmak yerine ölçüldü:

Item başına 1.000 baytta, bir sayfa 1.029 item tuttu ve bir LastEvaluatedKey döndürdü — 1.029.000 bayt item verisi, 1.030. item bir sonraki istek için bırakıldı. Item başına 5.000 baytta, bir sayfa 208 item tuttu ve bir LastEvaluatedKey döndürdü — 1.040.000 bayt item verisi, 209. item bir sonraki istek için bırakıldı.

Sayfaların hiçbiri 1 MiB item verisi tutmadı — ilki yaklaşık 19.576 bayt eksik kaldı. Yani sayfa bütçesi, item başına item'ın kendi baytlarından daha fazlasını hesaba katıyor.

Farklı item boyutlarındaki iki yoklama bunu netleştirmeye yetiyor. Bir sayfayı item × (item baytı + item başına overhead) ≤ bütçe olarak ele alırsak, yalnızca 7 tam-bayt overhead her iki ölçümle de tutarlı ve bunlardan tam olarak biri bütçeyi yuvarlak bir ikili megabayta oturtuyor: item başına 19 baytlık bir overhead, bütçe 1.048.551 ile 1.048.971 bayt arasında — 1.048.576'yı içeren bir aralık. DynamoDB'nin "1 MB"ı, kendi kotalar sayfasının belirttiği gibi ikilidir ve item baytları artı item başına overhead için harcanır. Bunun item başına kabaca 19 baytı için bütçe ayırın.

Yoklamadığımız kotalar

Aşağıdaki sınırlar AWS'ye atıfla verilmiştir, ölçülmemiştir. Bunlar hesap düzeyi kotalardır: çoğu istek üzerine ayarlanabilir ve onlara ulaşmak, saatlik faturalanan throughput sağlamak, binlerce tablo oluşturmak ya da bir yıllık rezerve kapasiteye taahhüt vermek anlamına gelir. Bunların hiçbiri bir yoklama değil, bu yüzden hiçbiri öyle sunulmuyor. Her satırın kaynağı AWS'nin Quotas in Amazon DynamoDB sayfasıdır.

KotaVarsayılan değerAyarlanabilirNeden yoklamadık
Bölge başına hesap başına tablo2.500Evet2.501.'in başarısız olmasını izlemek için 2.500 tablo oluşturmak, birinin geri sarması gereken bir hesap bırakır.
Tablo başına provisioned throughput40.000 RCU ve 40.000 WCUEvet40.000 birim provision etmek, tek bir istek yapılsın ya da yapılmasın saatlik faturalanır.
Hesap başına provisioned throughput80.000 RCU ve 80.000 WCUEvetAynı sebep, iki kat — ve hesap genelinde bir ayarı değiştirir.
Tablo başına on-demand throughput40.000 RRU ve 40.000 WRUEvetOna ulaşmak, saniyede 40.000 isteği sürdürmek demektir — bu, faturalı bir yük testidir.
Hesap başına etkin rezerve kapasite1.000.000 kapasite birimiEvetRezerve kapasite bir yoklama değil, bir yıllık satın alma taahhüdüdür.
Tablo boyutuPratik bir sınır yokAWS, tabloların item ve bayt açısından sınırsız olduğunu belirtiyor; bulunacak bir kenar yok.

Etrafında tasarım yapmanız gereken sınırlar

Bunların çoğuna asla ulaşmayacaksınız. Gerçek tasarımları şekillendiren birkaçı:

  • Item başına 400 KB, bir kota değil bir modelleme kısıtıdır. Ona yaklaşan bir item genellikle gömülü bir liste olarak depolanmış sınırsız bir bire-çok ilişkidir. Bkz. item boyutu sınırı.
  • 1 MB'lık sayfa, yazdığınız her Query ve Scan'i yönetir. LastEvaluatedKey'i yok sayan kod, verileriniz bir sayfayı aştığı gün sessizce yanlıştır.
  • Batch write başına 25 item ve batch get başına 100, toplu yükleme döngülerinizi şekillendirir. Bkz. batch işlemleri.
  • Transaction başına 100 eylem, insanların DynamoDB'yi ilişkisel gibi davranmaya zorlarken çarptığı sınırdır. Bkz. transaction'lar.
  • 20 GSI, 5 LSI, 100 projeksiyonlanan öznitelik, erişim deseni tasarımını throughput kotalarından çok daha sık kısıtlar ve LSI sayısı tablo oluşturulduğu anda sabitlenir. Bkz. index projeksiyonları ve GSI ve LSI.

Yukarıda alıntılanan retlerin çoğunun, her birini üreten istekle birlikte DynamoDB hataları altında kendi sayfası da var. Dört CreateTable reddinin yok — onlar bu sayfa için yakalandı.

Tek bir item'ı yazmadan 400 KB sınırına karşı kontrol etmek için item boyutu hesaplayıcısı tarayıcınızda çalışır. Kendi tablolarınızdaki item'lara bakmak için DynoTable bir masaüstü DynamoDB istemcisidir.

Güncellendi