Amazon gibi bir şirket, veritabanı katmanına erişen darboğazları nasıl önler?


29

Amazon gibi bir şirket (veya başka herhangi bir büyük e-ticaret web uygulaması), büyük ölçekli bir çevrimiçi mağaza işletiyor ve yalnızca depolarında sınırlı miktarda fiziksel ürün bulunduğunu hayal ediyorsanız, tek tıkanıklık? Tabii ki, çoğaltılmış bir dizi veritabanına ve yükü bağımsız olarak ele alan birçok sunucuya sahip olmaları gerekir. Bununla birlikte, birden fazla kullanıcıya ayrı sunucular tarafından sunuluyorsa ve her ikisi de aynı öğeyi sepetlerine eklemeye çalışırsa, bunlardan yalnızca bir tanesi kalırsa, o öğe için kalan miktar için bazı "doğruluk kaynağı" olmalıdır. Bu, en azından, tek bir ürün için ürün bilgisine erişen tüm kullanıcıların aynı veritabanını seri olarak sorgulaması gerektiği anlamına gelmez mi?

Dağınık bilgisayar kullanarak bu kadar büyük bir mağazayı nasıl çalıştırabileceğinizi ve envanter bilgilerini içeren tek bir DB üzerinde büyük bir tıkanıklık yaratamayacağınızı anlamak istiyorum.


2000'li yılların ortalarında Amazon mimarisi (hala sorunuzla alakalı): highscalability.com/amazon-architecture
Joeri Sebrechts

Bu aynı zamanda uçaklardaki koltuklarla da (ya da alışveriş sepetindeki bir öğenin orada uçuşu, kiralık arabayı, otelde konaklamayı ve geri uçuşu temsil ettiği paketlenmiş tatiller için) aynı sitelerde aynı koltukları satan birçok farklı ajansla olur. . Çözümler sayısızdır, ancak hepsi bir yerde her bir bölümün asıl statüsüne sahip bir nihai doğruluk veritabanına sahip oluyor.
RemcoGerlich

1
@RemcoGerlich: "son gerçek veri tabanı" deme şekliniz , üzerinde büyük kutsal veri tabanı olan tek bir makine düşündürüyor . Gerçekte, kritik veriler için olan şey, tüm işlemlerin aynı anda birden fazla sunucuya ulaşması ve tüm bu veritabanlarının her zaman senkronize olmasını sağlamaktır.
Arseni Mourzenko

Yanıtlar:


27

Bununla birlikte, birden fazla kullanıcıya ayrı sunucular tarafından sunuluyorsa ve her ikisi de aynı öğeyi sepetlerine eklemeye çalışırsa, bunlardan yalnızca bir tanesi kalırsa, o öğe için kalan miktar için bazı "doğruluk kaynağı" olmalıdır.

Pek sayılmaz. Bu,% 100 mükemmel bir teknik çözüm gerektiren bir sorun değildir, çünkü her iki hata durumunda da çok pahalı olmayan bir iş çözümü vardır:

  • Bir kullanıcıya yanlış bir öğenin satıldığını söylerseniz satışı kaybedersiniz. Her gün milyonlarca ürün satıyorsanız ve bu günde bir veya iki kez olabilirse, gürültüde kaybolur.
  • Bir siparişi kabul ederseniz ve işleme devam ederken öğenin tükendiğini tespit ederseniz, müşteriye sadece bunu söyleyin ve yeniden stoklama yapana veya siparişi iptal edinceye kadar onlara bekleme seçeneği verin. Hafifçe rahatsız olmuş bir müşteriniz var. Yine siparişlerin% 99,99'unun iyi çalıştığı zaman büyük bir sorun değil.

Aslında, son zamanlarda ikinci vakayı da kendim tecrübe ettim, bu yüzden varsayımsal değil: ne olduğu ve Amazon'un nasıl işlediği.

Teorik olarak çözülmesi çok zor olan bir probleminiz olduğunda sıkça uygulanan bir kavramdır (performans, optimizasyon veya her neyse): çoğu zaman gerçekten iyi çalışan bir çözümle yaşayabilir ve bazen kabul edersiniz. Başarısızlıklar, meydana geldiği zaman arızaları tespit edip ele alabildiğiniz sürece başarısız olur.



1
"Gerçekten değil" dedin ama önerdiğim şeyle aynı fikirde olduğunuzu hissediyorum. Söylediğiniz şeye benziyor, kullanıcı sadece göz attığında, kalan envantere önbelleğe alınmış bir yaklaşım veriyoruz, ancak yalnızca satın alma işlemini tamamlamaya çalıştıklarında kalan envanteri azaltmak için yazı yazıyoruz. Bu değeri içeren DB her işlemi atomik olarak yürütür ve iki kullanıcı aynı anda denerse, ikincisi için bir hata mesajı gösteririz, çünkü bu gerçekleşmesi muhtemel değildir. Böylece, sonunda "gerçeği" içeren tek bir makinede bir tam sayı var.
mattgmg1990

2
@ mattgmg1990: doğru, nihayetinde bir yerlerde "gerçeği" bilmek zorundasınız, ancak önemli fark, siparişlerin işlenmesinin bir sıra ile yapılabilmesidir; bu nedenle, eşzamanlı atomik yazma erişimine ihtiyacınız yoktur. Benim durumumda, "hata mesajı" aslında Amazon web sitesindeki siparişi tamamladıktan birkaç saat sonra geldi - bu ürünün tedarikinde sorun yaşadıklarını söyleyen bir e-posta aldım ve siparişi iptal etmeyi ya da hiçbir şey yapmamayı ve beklemeyi seçebilirim onların yerine getirmesi için. İkincisi yaptım çünkü hemen öğeye ihtiyacım yoktu ve onlar da birkaç hafta sonra teslim ettiler.
Michael Borgwardt,

@DerekElkins, özellikle dijital verilerin noktalarından kaçınılmaz olarak kusurlu olan bir gerçekliğin temsili olduğu konusu, çünkü gerçeklik her zaman sisteminizin otomatik olarak bilmediği değişiklikler yapabilir.
Michael Borgwardt

6

Kombinasyonu

  • karma
  • Kırma işlemi
  • kopya
  • dağıtım
  • yüksek başarısızlık
  • anahtar-değer depoları

Sihir yok, daha karmaşık durumlar. Aynı DNS gibi, ölçeklendirmek için de yapılmıştır.

'Gerçeğin tek versiyonu' bu tür sistemlerin bir parçasıdır. Yeni bir anahtar üretmek, sıradaki bir sonraki sayıyı oluşturmaktan daha karmaşık bir işlem haline gelir. Örneğin başka diziler var. Bu, dağıtılmış veritabanı sistemlerinin idare edebileceği karmaşıklık türüdür ve yeni nesneler hazırlarken bileşenlere ve bileşenlerden birkaç işlem yaparak, bunları başkaları için kullanılabilir hale getirerek, dizilerin gerektiğinde benzersiz olmalarını sağlayarak, bileşik anahtarlar vb. .


Bu kavramların her birini okudum, ancak sürekli takılmaya devam ettiğim kısım kalan envanterin özel senaryosudur. Yalnızca 5 kitap kaldıysa ve birden fazla sunucuda istek yapan kullanıcılar, iki kullanıcının aynı anda son kitabı alamayacağından emin olmak için kalan envanteri sorgulamanın zamanı geldiğinde her zaman tek bir veritabanı tablosuna çözüyorlar mı? Yukarıdakilerin hangi özel kullanımı, bunun tüm sistemi yavaşlatmaması ve çoğaltmanın hala birden fazla DB vakası için faydalı olması için yapmaktır?
mattgmg1990

Biraz daha ekledi. Bu formatta yer alan tüm karmaşıklığı gerçekten açıklayamıyorum, üzgünüm.
Michael Durrant,

1
Herhangi bir kitabı yalnızca bazı insanlar ilgilendirir, bu, kitabın nispeten küçük bir yüke sahip bir parça tarafından ele alınabileceği anlamına gelir.
Basilevs

6
Sanırım sistemi tanımladığınız senaryoda sadece son kopyayı başka birisinin aldığı için kullanıcıdan özür dilemelisiniz. Bunun zaman zaman meydana geldiğini hayal ediyorum.
Matthew James Briggs

1
Bahse girerim kalan 5 kitap var göstergesi daha az bilgi işlem ve daha fazla pazarlama.
mouviciel

5

'Stoktaki Son Ürün' sorununu şu şekilde çözdüm:

Tüm stok seviyelerini günlük olarak güncelleyin ve ürünleri eşik seviyelerine göre sıralı veya stok dışı kategorilerde yüksek, düşük olarak işaretleyin.

Açıkçası, sorunlu olan 'düşük stok' ürünleri

  • Yüksek stok seviyeli ürünler

Stok seviyesini kontrol etmeyin. Sadece sipariş ver

  • Stok seviyesi düşük ürünler

'Son kalan son!' Sayfasını gezerken kullanıcıyı uyar. ödemeye gittiklerinde, stok seviyesini kontrol edip azaltın. Stokta yoksa, Ürün durumunu güncelleyin.

Bu şekilde, yalnızca 'düşük stok' ürünler için veritabanına çarptınız ve bunu yalnızca müşteri satın alma sürecinden oldukça uzaktayken yapıyorsunuz. Maliyet, bazı müşterilerin alımlarını tamamlayamayacak olmalarıdır.

Ancak, çoğu durumda 'stokta yok' sadece başka bir teslimat beklediğiniz anlamına gelir, bu nedenle siparişi yine de kabul etmek ve belki de sadece bir uyarı açmak veya teslimat seçeneklerini kısıtlamak istediğiniz anlamına gelir. Yani bu müşteriler kaybolmadı.

Satışlar gibi yüksek yükleme sürelerinde, stok kontrolünü kapatıp müşterilere daha sonra e-posta ile gönderebilirsiniz, 'Üzgünüz X’ten çıktığımız için Y’yi ister misiniz?'

Temel olarak, herhangi bir e-ticaret platformunun amacı asla veritabanından okunmaz. Her zaman önbelleğe alınmış sayfalar sun ve her şeyi müşteri tarafında yap.


2

Bu videoda, Martin Fowler NoSQL veritabanlarını tartışıyor:

https://www.youtube.com/watch?v=qI_g07C_Q5I

Önemli noktalardan biri (orada bir yerde), Amazon gibi yerlerin, gerçekten uygun olup olmadığını "kesin" olarak kontrol etmeden siparişlerini kabul ederek insanların% 99'unu mutlu etmeyi tercih etmesi ve çok küçük bir yüzdeyi tahriş etmesi; "üzgünüm, biri seni yenerse gibi görünüyor" demek için.

Söyleyeceğiniz, tarif ettiğiniz senaryo için gerçek bir işlem yoktur, sadece Amazon'un son başarılı envanter okumasına dayanan şüpheden faydalanması ve eşzamanlı bir işlem - oopsie arasında kayması durumunda faydalanacağı anlamına gelir.

(btw, NoSQL'i merak ediyorsanız harika bir video)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.