DynamoDB'de Singleton Öğeler
tek öğe, sabit, sabit kodlanmış bir anahtara sahip tek bir satırdır. tüm uygulamanız için belirtin; kullanıcı veya sipariş başına bir kayıt değil, bir kayıt, nokta. Özellik bayrakları, bir yapılandırma blobu, genel bir kapatma anahtarı: ilişkisel bir uygulamanın tek satırlık ayarlar tablosunda tutacağı türden bir şey.
SQL'den geldiğinizde id = 1 ve SELECT * FROM config içeren config tablosuna ulaşırsınız. DynamoDB'da aynı şeyi sabit kodlanmış bir bölümle yaparsınız
tuşu — ve o tuşu her zaman bildiğiniz için onu GetItem ile okursunuz,
Query veya Scan.
DynamoDB'de singleton öğe nedir?
Tekil öğe, kullanıcı veya sipariş başına bir kayıt yerine, uygulamanızın tamamı için genel durumu (özellik işaretleri, bir yapılandırma blobu, sistem çapında bir sürüm) tutan sabit, sabit kodlu bir anahtar altında depolanan tek bir DynamoDB satırıdır. Anahtarı her zaman bildiğiniz için onu GetItem ile okur ve artı koşul ifadeleriyle güncellersiniz.
- Tekil, sabit anahtarı olan bir öğedir.
PK/SKkodunu sabit olarak kodlarsınız. Kullanıcı veya sipariş kimliğini şablon olarak kullanmak yerine kodunuzda (örn.CONFIG#GLOBAL) kullanın. GetItemile okuyun, aslaScanile okuyun. Her zaman anahtarın tamamını bilirsiniz, bu nedenle nokta okumanın sabit ve öngörülebilir bir maliyeti vardır (küçük bir öğe için en fazla 1 RCU) — filtre yok, masa yürüyüşü yok.- Tanımı gereği 'dir. Her istek aynı bölüme dokunabilir, bu yüzden onu önbelleğe alın ve öğeyi küçük tutun; Bunu bir yazma darboğazı haline getirmeyin.
- Oku-değiştir-yaz değil, güncelleme + koşul ifadeleriyle güvenli bir şekilde değiştirin uygulamanızda — kayıp güncelleme yarışının yaşandığı yer burasıdır.
Deseni tanı
Veriler herhangi bir varlığın kapsamına alınmadığında küresel durumunuz vardır. Birkaçı şunu söylüyor:
- Herkes için aynı olan bir bayrak (
signup_enabled = false). - Uygulamanızın önyükleme sırasında okuduğu bir dizi ayarlanabilir öğe (hız sınırları, varsayılan kotalar).
- Satır başına değil, tüm sistem için bir sayaç veya sürüm numarası.
Bir senya, kiracıya veya siparişe kapsamı belirlenen herhangi bir şey tekil değildir; bu bir o varlığın kimliğiyle anahtarlanan sıradan öğe. Singleton, kalan küreseldir yaşayacak başka yeri olmayan dilim.
Ona sabit bir anahtar ver
Bütün model tek bir karara bağlı: Anahtar bir şablon değil, gerçek bir metindir. Aşırı yüklenmiş tek bir tablodaki genel özellik bayrakları öğesi için sabit bir tane seçin önek ve sabit bir değer:
| PK | SK | attributes |
|---|---|---|
| SETTINGS#APP | FLAGS#V1 | signup_enabled, maintenance_mode, ai_search_enabled |
PK = "SETTINGS#APP" ve SK = "FLAGS#V1" koda eklenir. hayır
kullanıcı kimliği, kiracı kimliği yok — uygulama her seferinde tam olarak bu öğeyi ister.
Önemli olan bu öngörülebilirliktir: bilinen bir anahtar GetItem ve GetItem'tür.
en ucuz, en tutarlı okuma DynamoDB teklifidir.
V1 son eki kasıtlıdır. Bayrak şeması daha sonra şekil değiştirirse şunu yazarsınız:
Canlı olanı değiştirmek yerine FLAGS#V2 öğesini seçin ve okuyucuları ters çevirin.
yer. Tekil anahtarın sürümlendirilmesi sana temiz bir geçiş dikişi sağlar.
GetItem ile oku
Anahtar tam olarak bilindiğinden, bir tekil öğe için asla Query ve asla Scan yapmazsınız.
Scan tüm tabloyu okur ve istemci tarafını filtreler; klasik
Scan footgun — ve doğrudan adresleyebileceğiniz tek bir
satırı getirmek için saçma bir aşırıya kaçmadır.
SETTINGS#APP / FLAGS#V1'ya karşı GetItem, bayrakları tek seferde döndürür
güçlü veya sonuçta tutarlı bir okuma. Talep üzerine us-east-1, AWS faturalar
≤ 4 KB bir öğenin GetItem'i 0,5 RCU sonuçta tutarlı veya 1 RCU olarak
son derece tutarlı
(AWS okuma/yazma kapasitesi belgeleri).
Singleton'ı küçük tutun ve bu maliyet sonsuza kadar aynı kalır; yapılandırmayı şişirir
ikinci bir 4 KB bloğa eklenmesi, faturalanan okuma miktarını iki katına çıkarır.
Okuma yolu basittir: uygulama başlatılır veya bir istek gelir, sen sabit olursunuz anahtarı, sonucu önbelleğe alırsınız. Akış:
Sabit anahtar, genel aramayı yerleşik varsayılan yolla tek noktadan okumaya dönüştürür.
no dalına dikkat edin: eksik bir singleton sizi asla çökertmeyecektir. Varsayılan olarak
güvenli değer (özellik kapalı, bakım açık) yani ilk dağıtımda boşluk veya kötü
anahtar kapalı, açık değil.
Yarış olmadan güncelle
Tuzak, uygulamanızda okuma-değiştirme-yazma ile bir singleton'u güncelliyor: sen
Bayrakları GetItem, hafızadaki birini çevirin, ardından PutItem her şeyi geri alın.
Eş zamanlı iki yazar hem eski yazıyı okuyor, hem de ikinci yazar eski yazıyı kapatıyor.
ilk değişiklik. Güncellemeyi kaybettim.
İki DynamoDB özellik, uygulama tarafı kilitleme olmadan yarışı bitirir:
- bir özelliği sunucu tarafında değiştirip gerisini bırakın el değmemiş. Tüm öğeyi yeniden düzenlemeye gerek yok.
- yalnızca öğe hala görünüyorsa yazmanın başarılı olmasını sağlayın
beklediğiniz gibi, eski bir yazma işlemi reddedilir
ConditionalCheckFailedException(AWS koşul ifadesi belgeleri).
Bir bayrağı ters çevirmek için, yalnızca o özelliği SET ile hedefleyin ve onu bir bayrakla koruyun.
sürüm artışı, böylece eşzamanlı yazarlar birbirlerini ezemez:
# UpdateItem
Key PK=SETTINGS#APP SK=FLAGS#V1
UpdateExpression SET signup_enabled = :on, schema_version = :next
ConditionExpression schema_version = :currentİki yazıcı yarışırsa, ikincinin schema_version = :current kontrolü başarısız olur ve
taze değere karşı yeniden dener. Bunu koda bağlamadan önce
DynamoDB Expression Builder'da adları, değerleri ve
tam bu ifade şeklini iskeletleyebilirsin. Operatörlere daha derin bir bakış için
güncelleme ifadesi deyimleri kılavuzuna bak.
Sıcak anahtara dikkat
Singleton, doğası gereği bir kısayol tuşu'dur; uygulamanızın her bölümü okuyabilir aynı bölüm. Önbelleğe alırsanız okumalar için sorun olmaz, ancak gerçek olan budur desen riski.
- Agresif bir şekilde önbelleğe alın. İşaretleri işlem başına bir kez (veya N saniyede bir) okuyun; her istek üzerine. Singleton'un değeri not edilmesi en ucuz şeydir.
- Bunu sıcak bir yazma noktası haline getirmeyin. Yönetici tarafından günde birkaç kez değiştirilen bir işaret hiçbir şey değil. Her istekte artırdığınız tekil, bölümleme verimidir darboğaz - bu bir karşı sorun, tek bir sorun değil.
- Küçük tutun. 4 KB'lık bloklar halinde öğe boyutuna sahip maliyet ölçeklerini okuyun. Şişkin bir Config blob, her önyüklemeyi olması gerekenden daha pahalı hale getirir.
Gerçekten yüksek yazmalı bir global sayaca ihtiyacınız varsa, singleton yanlıştır Şekil — onu N öğeye bölün ve okunduğunda toplayın. Bu farklı bir model.
Singleton vs varlık başına öğe
Satır basitçe verinin kapsamının ne olduğu ile ilgilidir.
| Tekil öğe | Varlık başına öğe | |
|---|---|---|
| Anahtar | Sabit kodlanmış sabit (SETTINGS#APP) | Kimlikle şablonlanmıştır (USER#42) |
| Kaç | Tam olarak bir | Kullanıcı / sipariş / kiracı başına bir adet |
| Tipik okuma | Bilinen tuşta GetItem | GetItem veya Query kuruluşa göre |
| Kapsam | Başvurunun tamamı | Tek bir varlık |
| Şunun için kullanın | Genel işaretler, yapılandırma, sistem sürümü | Kimlik başına profiller, siparişler, her şey |
Kendinizi aynı türden iki singleton isterken bulursanız, singleton - varlık başına bir öğeniz var ve varlık, unuttuğunuz şeydir anahtarla (örneğin kiracı başına yapılandırma).
Tuzaklar ve sonraki adımlar
- Bunun için
Scanyapmayın. Anahtarı biliyorsunuz; doğrudan hitap edin. - Okuma-değiştirme-yazma. Güncelleme + koşul ifadelerini kullanın.
- Sessizce kaybolmasına izin vermeyin. Önbellek kaybı durumunda varsayılan olarak güvenli değeri kullanın.
- Yüksek frekanslı yazma işlemleriyle aşırı yüklemeyin. Bu parçalanmış bir sayaç işidir.
Singleton bir evde rahatça yaşıyor single-table design — bu yalnızca bir öğe daha varlık satırlarınızın yanında sabit bir anahtarla koleksiyon.
Try DynoTable tablonuza göz atmak için tekli satırı bulun sabit tuşa basın ve yazma yolunu oluştururken bayrakları elle düzenleyin.