Bagaimana mencegah dua pengguna mendaftar secara bersamaan dengan nama pengguna yang sama?

11

Kami tidak dapat membuat serial pendaftaran karena ada jutaan pengguna yang mendaftar secara bersamaan. Registrasi paralel perlu terjadi.

Katakanlah database tidak mengandung nama pengguna 'user1'. Ketika dua pengguna mencoba mendaftar pada saat yang sama dengan 'user1' itu akan menerimanya. Namun nantinya akan menimbulkan masalah. Ini seharusnya tidak terjadi.

Saya mencari solusi yang logis. Bukan sesuatu yang spesifik. Hanya ide untuk menyelesaikan ini.

Addzy K
sumber
diberikan penjelasan dalam upaya Anda sebelumnya untuk memposting ini di The Workplace, pertimbangkan untuk membaca untuk Mengapa pertanyaan wawancara membuat pertanyaan Programmer.SE buruk?
nyamuk
4
Ini masalah arsitektur perangkat lunak yang sah. Bukan jenis masalah yang hanya membuat pertanyaan wawancara yang bagus dan tidak ada yang lain.
Karl Bielefeldt
7
Jutaan pengguna mendaftar sekaligus? Betulkah? Jika Anda memiliki jutaan pengguna yang mendaftar pada saat bersamaan, Anda memiliki masalah yang lebih besar - seperti menangani miliaran pengguna terdaftar. Dan mungkin uang untuk membeli server yang menanganinya.
gnasher729
2
@ AdzyzyK Ini adalah masalah hipotetis yang dihadapi di masa depan yang Anda inginkan untuk solusi logis? Cukup yakin itu di luar jangkauan di sini.
paparazzo
3
Inilah jawaban hipotetis: bayar orang lain untuk melakukannya yang sudah tahu apa yang harus dilakukan. Dengan jutaan pengguna baru / detik, Anda akan memiliki uang tunai.
whatsisname

Jawaban:

15

Katakanlah database tidak mengandung nama pengguna 'user1'. Ketika dua pengguna mencoba mendaftar pada saat yang sama dengan 'user1' itu akan menerimanya.

Mengapa itu menerimanya? Sangat mudah untuk menerapkan batasan unik, menggunakan nama pengguna sebagai kunci utama, atau cukup menjalankan kode aplikasi check-in di dalam suatu transaksi.

Anda harus benar-benar dapat menggunakan transaksi basis data untuk menggunakan basis data untuk mencegah hal ini terjadi. Jika tidak, tidak ada aplikasi yang dapat mempertahankan invarian dalam data basis data.

Dalam hal penskalaan, basis data sudah menemukan teknologi yang Anda butuhkan, seperti berbagai mode penguncian tergantung pada jenis konsistensi yang Anda butuhkan, basis data terdistribusi untuk beberapa server basis data, dll.

DeadMG
sumber
Apakah mengunci pendaftaran tidak mencegah pengguna lain mendaftar pada saat yang sama?
Addzy K
2
+1, Hanya menjalankan beberapa matematika kasar, dan bahkan Facebook hanya rata-rata beberapa pendaftaran per detik. Jadi dengan mengandalkan keterbatasan database sendiri sudah cukup.
GrandmasterB
2
@AddzyK: Penguncian hanya terjadi untuk saat singkat bahwa database harus menegakkan batasan. Ya, pengguna lain yang mendaftar secara bersamaan harus menunggu dalam antrean, tetapi menunggu itu sangat singkat, dan jarang terjadi, bahkan pada sistem terbesar.
Robert Harvey
1
@GrandmasterB Rata-rata mungkin tidak menceritakan kisah lengkapnya di sini. Saya berasumsi berdasarkan pertanyaan bahwa ini untuk menangani beban puncak yang berat - misalnya barang sensus Australia.
DeadMG
@ AdzyzyK Mungkin berhasil. Intinya, Anda bisa lolos hanya dengan mengunci sebagian tabel. Ada banyak skema untuk menangani hal ini, seperti jawaban gnasher729, tetapi saya percaya Anda harus bisa mendapatkan produk database terdistribusi yang dapat menangani ini untuk Anda. Bahkan jika Anda harus menggulung skema penguncian parsial Anda sendiri, ada banyak cara yang diketahui untuk menanganinya, seperti DHT.
DeadMG
7

Ada solusi standar untuk ini. Buat beberapa pekerja untuk melakukan registrasi. Setiap permintaan memiliki hash yang diterapkan pada nama pengguna, dan hash menentukan pekerja mana yang memproses permintaan tersebut. Dengan cara ini tidak ada cara yang memungkinkan untuk dua permintaan untuk nama pengguna yang sama dapat diproses secara bersamaan.

Untuk volume permintaan seperti ini, pertimbangkan penyimpanan nilai kunci terdistribusi seperti risiko alih-alih semua basis data sebagai penyimpanan data.

Michael Shaw
sumber
2

Apakah ini masalah?

Membiarkan dua pengguna menyelesaikan pendaftaran mereka dengan nama pengguna yang tidak unik tidak dapat diterima jika nama pengguna (dan bukan email pengguna) digunakan untuk login.

Jika nama pengguna tidak digunakan untuk otentikasi, Anda dapat menggunakan menggunakan beberapa proses latar belakang untuk mengidentifikasi dan menandai ganda (misalnya berdasarkan cap waktu) dan memaksa pengguna untuk mengubah nama pengguna pada masuk berikutnya

Ya itu masalah

Saat Anda bertanya, saya menduga bahwa nama pengguna tersebut seharusnya merupakan id unik. Pendekatan berikut dapat digunakan:

  1. Sebelum: Dalam proses pendaftaran, lihat langkah di mana pengguna baru harus memeriksa ketersediaan namanya. Saat melakukannya, pertahankan nama akun yang tersedia dengan status sementara dan id sesi yang memungkinkan penyelesaian pendaftaran.
  2. Waktu yang sama: Varian yang lebih umum dan fleksibel dari balasan gnasher729 , akan menggunakan fungsi hash sederhana (seperti yang digunakan untuk mengelola tabel simbol), untuk menetapkan id ke server pendaftaran unik, i (i = h (nama pengguna) modulo number_of_servers) yang akan menangani keunikan pada lingkup terbatas / tersegmentasi
  3. Setelah: Di akhir pendaftaran, ketika pengguna mengklik registerkirim permintaan ke database transaksional Anda, jika Anda dapat mendefinisikan bidang sebagai unik. Setelah kesalahan, kirim pesan "oops, ada masalah" kepada pengguna yang tidak beruntung dan minta dia untuk memilih id lain.
  4. Asinkron: daftarkan pengguna. Baca kembali catatan pengguna setelahnya untuk memastikannya tidak berubah dan satu pun. Jika itu masalah, mintalah pengguna untuk mengubah (tidak terlalu sinkron), atau mengiriminya surat bahwa ada masalah (tidak sinkron, tetapi mengganggu dari perspektif pengguna), atau biarkan dia mendaftar tetapi minta dia untuk surelnya (untuk disambiguasi) dan memaksanya untuk mengubah nama pengguna sebagai bagian dari prosedur login.
Christophe
sumber
1

Pertimbangkan kembali apa yang Anda anggap sebagai pengidentifikasi unik bagi pengguna. Setiap pengguna sudah memiliki alamat email yang unik, sehingga masalah tersebut telah dipecahkan untuk Anda. Tentu saja, ini berarti bahwa banyak pengguna akan dapat mendaftarkan nama yang sama, seperti "Mike Nakis". Apakah ada masalah dengan itu? Apakah kamu yakin Itu bukan masalah untuk facebook, misalnya. Ada beberapa pengguna facebook yang disebut "Mike Nakis". Lihatlah halaman login facebook: ia meminta "email atau telepon" dan "kata sandi".

Mike Nakis
sumber
0

Dengan jutaan pengguna yang mendaftar pada saat yang sama, Anda hanya menggunakan server pendaftaran 26 x 26, satu untuk pengguna yang dimulai dengan aa, satu untuk pengguna yang mulai dengan ab dan seterusnya. Akibatnya, hanya ada ribuan pengguna yang mendaftar di setiap server secara bersamaan. Jika Anda masih tidak bisa mengatasinya, gunakan server 26 x 26 x 26.

gnasher729
sumber
5
... dan kemudian pemilik produk Anda ingin go internasional ...
Telastyn
2
Prinsip yang sama berlaku untuk string Unicode selama mereka dalam bentuk normal, seperti NFKD. Anda juga bisa meng-hash nama pengguna dan menerapkannya berdasarkan hash. Namun, jawaban ini pada dasarnya hanya mengimplementasikan database terdistribusi Anda sendiri.
DeadMG
1
Maksud Anda, mereka memiliki jutaan pengguna yang mendaftar secara bersamaan di satu negara ? Dalam hal ini mereka harus memiliki cukup uang untuk membayar lebih untuk solusi nyata.
gnasher729
Lebih khusus lagi, ini hanya awal dari bagaimana DHT dilakukan.
DeadMG
bagaimana cara mengatasi masalah dua pengguna yang mendaftarkan nama yang sama pada saat yang sama - kedua nama akan mulai dengan dua karakter yang sama dan ditangani oleh server pendaftaran yang sama?
HorusKol