İki kullanıcının aynı anda aynı kullanıcı adıyla kaydolmasını nasıl önleyebilirim?


11

Aynı anda milyonlarca kullanıcı kaydolduğu için kayıtları serileştiremeyiz. Paralel kayıtların yapılması gerekir.

Diyelim ki veritabanı 'user1' kullanıcı adını içermiyor. İki kullanıcı 'user1' ile aynı anda kaydolmaya çalıştığında kabul eder. Ancak daha sonra sorunlara neden olacaktır. Bu olmamalı.

Mantıksal bir çözüm arıyorum. Belirli bir şey değil. Sadece bunu çözmek için bir fikir.



4
Bu meşru bir yazılım mimarisi problemidir. Sadece iyi bir röportaj sorusu yapan ve başka bir şey olmayan bir sorun değil.
Karl Bielefeldt

7
Milyonlarca kullanıcı aynı anda mı kaydoluyor? Gerçekten mi? Aynı anda milyonlarca kullanıcınız kayıtlıysa, milyarlarca kayıtlı kullanıcıyı idare etmek gibi daha büyük sorunlarınız var. Muhtemelen bununla ilgilenen sunucuları karşılayacak para.
gnasher729

2
@AddzyK Bu, gelecekte mantıklı bir çözüm olmasını istediğiniz varsayımsal bir sorundur? Burada kapsam dışında olduğundan eminim.
paparazzo

3
Heres varsayımsal bir cevaptır: ne yapacağını zaten bilen başka birine ödeme yap. Milyonlarca yeni kullanıcı ile saniyede nakit elde edersiniz.
whatsisname

Yanıtlar:


15

Diyelim ki veritabanı 'user1' kullanıcı adını içermiyor. İki kullanıcı 'user1' ile aynı anda kaydolmaya çalıştığında kabul eder.

Neden kabul etsin ki? Benzersiz bir kısıtlama uygulamak, kullanıcı adını birincil anahtar olarak kullanmak veya check-in uygulama kodunu bir işlem içinde çalıştırmak kolaydır.

Bunun olmasını önlemek için veritabanını kullanmak için kesinlikle bir veritabanı işlemi kullanabilmeniz gerekir. Aksi takdirde, hiçbir uygulama veritabanı verilerinde değişmezleri tutamaz.

Ölçekleme açısından, veritabanları, tam olarak ne tür bir tutarlılığa ihtiyacınız olduğuna bağlı olarak çeşitli kilitleme modları, birden çok veritabanı sunucusu için dağıtılmış veritabanları vb.


Kayıtların kilitlenmesi, diğer kullanıcıların aynı anda kayıt yapmasını engellemiyor mu?
Addzy K

2
+1, Sadece biraz kaba matematik koştu ve Facebook bile saniyede sadece birkaç kayıt ortalama. Bu nedenle veritabanının kendi kısıtlamalarına güvenmek yeterli olmalıdır.
GrandmasterB

2
@AddzyK: Kilitleme, yalnızca veritabanının kısıtlamaları zorlaması gereken kısa bir süre için gerçekleşir. Evet, aynı anda kaydolan diğer kullanıcıların sırada beklemesi gerekir, ancak bu bekleme çok kısadır ve en büyük sistemlerde bile nadiren gerçekleşir.
Robert Harvey

1
@GrandmasterB Ortalamalar burada tüm hikayeyi anlatmayabilir. Bunun, Avustralya'nın nüfus sayımı gibi ağır yükleri ele almak için olduğu sorusunu temel aldım.
DeadMG

@AddzyK Yapabilir. Esasen, masanın sadece kilitleme kısmı ile uzaklaşabilirsiniz . Gnasher729'un cevabı gibi bununla başa çıkmak için çok sayıda şema var, ancak bunu sizin için halledebilecek hazır bir dağıtılmış veritabanı ürünü alabilmeniz gerektiğine inanıyorum. Kendi kısmi kilitleme şemanızı döndürmeniz gerekse bile, DHT gibi bununla başa çıkmanın bilinen birçok yolu vardır.
DeadMG

7

Bunun standart bir çözümü var. Kayıtları yapmak için birden fazla işçi oluşturun. Her isteğin, kullanıcı adına uygulanan bir karma değeri vardır ve karma, hangi çalışanın isteği işlediğini belirler. Bu şekilde, aynı kullanıcı adı için iki talebin aynı anda işlenmesi mümkün değildir.

Bu tür talepler için, veri deposu olarak tüm veritabanı yerine risk gibi dağıtılmış bir anahtar / değer deposu düşünün.


2

Sorun mu ?

Oturum açma için kullanıcı adı (kullanıcı e-postası değil) kullanılıyorsa, iki kullanıcının benzersiz bir kullanıcı adıyla kaydını bitirmesine izin verilmez.

Kullanıcı adı kimlik doğrulaması için kullanılmazsa, çiftleri tanımlamak ve işaretlemek için (örneğin zaman damgasına dayalı olarak) bazı arka plan işlemlerini kullanabilir ve kullanıcıyı bir sonraki oturum açmada kullanıcı adını değiştirmeye zorlayabilirsiniz

Evet bu bir problem

Siz sorarsanız, kullanıcı adının benzersiz bir kimlik olması gerektiğini düşünüyorum. Aşağıdaki yaklaşımlar kullanılabilir:

  1. Önce: Kayıt sürecinde, yeni kullanıcının adının kullanılabilirliğini kontrol etmesi gereken bir adım öngörün. Bunu yaparken, mevcut hesap adını geçici bir durum ve kaydın sonlandırılmasına izin verecek bir oturum kimliğiyle önceden koruyun.
  2. Aynı zamanda: gnasher729 yanıtının daha genel ve esnek bir çeşidi , kimliği benzersiz bir kayıt sunucusuna i (i = h (kullanıcı adı) modulouna atamak için basit bir karma işlevini (sembol tablolarını yönetmek için kullanılanlar gibi) kullanmak olacaktır. number_of_servers) ile sınırlı / bölümlere ayrılmış kapsamındaki benzersizliği ele alacak
  3. Sonra: Kaydın sonunda, kullanıcı tıklattığında register, alanı benzersiz olarak tanımlayabiliyorsanız isteği işlem veritabanınıza gönderin. Hata durumunda, şanssız kullanıcıya "Hata, bir sorun oluştu" mesajı gönderin ve başka bir kimlik seçmesini isteyin.
  4. Asenkron: kullanıcıyı kaydettirin. Değişmeden ve tek kayıt olduğundan emin olmak için kullanıcı kaydını hemen sonra tekrar okuyun. Bir sorun varsa, kullanıcıdan değişiklik yapmasını isteyin (çok asenkron değil) veya ona bir sorun (asenkron, ancak kullanıcı perspektifinden rahatsız edici) olduğu bir posta gönderin veya kaydolmasına izin verin ancak e-postasını isteyin (belirsizleştirmek için) ve giriş prosedürünün bir parçası olarak kullanıcı adını değiştirmeye zorlar.

1

Bir kullanıcı için benzersiz tanımlayıcı olarak düşündüğünüzü yeniden düşünün. Her kullanıcının zaten benzersiz bir e-posta adresi vardır, bu nedenle bu sorun sizin için zaten çözülmüştür. Tabii ki bu, birden fazla kullanıcının "Mike Nakis" gibi aynı adı kaydedebileceği anlamına gelir. Bunda bir problem mi var? Emin misiniz? Örneğin, facebook için bir sorun değil. "Mike Nakis" adında birden fazla facebook kullanıcısı var. Facebook giriş sayfasına bakın: "e-posta veya telefon" ve "şifre" ister.


0

Milyonlarca kullanıcı aynı anda kayıt yaptırırken, sadece bir tanesi aa ile başlayan kullanıcılar için, diğeri ab ile başlayan kullanıcılar için 26 x 26 kayıt sunucusu kullanırsınız. Sonuç olarak, her bir sunucuya aynı anda kayıt yapan yalnızca binlerce kullanıcı vardır. Hala halledemiyorsanız 26 x 26 x 26 sunucular kullanın.


5
... ve ardından ürün sahibiniz uluslararası olmak istiyor ...
Telastyn

2
Aynı ilkeler, NFKD gibi normalleştirilmiş bir formda oldukları sürece Unicode dizeleri için de geçerlidir. Ayrıca kullanıcı adını hash edebilir ve hash temelinde uygulayabilirsiniz. Ancak, bu cevap temel olarak sadece kendi dağıtılmış veritabanınızı uygulamaktır.
DeadMG

1
Yani bir ülkede aynı anda milyonlarca kullanıcı kaydı var mı? Bu durumda, gerçek bir çözüm için daha fazla ödeme yapacak kadar paraları olmalıdır.
gnasher729

Daha spesifik olarak, bu DHT'lerin nasıl yapıldığının sadece başlangıcıdır.
DeadMG

Bu, aynı anda aynı adı kaydettiren iki kullanıcının sorununu nasıl çözer - her iki ad da aynı iki karakterle başlar ve bu nedenle aynı kayıt sunucusu tarafından ele alınır?
HorusKol
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.