Come impedire a due utenti di registrarsi nello stesso istante con lo stesso nome utente?

11

Non possiamo serializzare le registrazioni in quanto ci sono milioni di utenti che si registrano contemporaneamente. Le registrazioni parallele devono avvenire.

Supponiamo che il database non contenga il nome utente 'utente1'. Quando due utenti tentano di registrarsi nello stesso momento con 'user1' lo accetterà. Ma in seguito causerà problemi. Questo non dovrebbe accadere.

Sto cercando una soluzione logica. Non qualcosa di specifico. Solo un'idea per risolvere questo.

    
posta Addzy K 29.08.2016 - 19:30
fonte

5 risposte

15

Let's say the database doesn't contain username 'user1'. When two users try to register at the same moment with 'user1' it'll accept it.

Perché dovrebbe accettarlo? È semplice applicare un vincolo univoco, utilizzare il nome utente come chiave primaria o semplicemente eseguire il codice del codice di controllo all'interno di una transazione.

Dovresti assolutamente essere in grado di utilizzare una transazione di database per utilizzare il database per evitare che ciò si verifichi. Altrimenti, nessuna applicazione sarebbe in grado di mantenere invarianti nei dati del database.

In termini di ridimensionamento, i database hanno già inventato le tecnologie di cui hai bisogno, come varie modalità di blocco a seconda esattamente di quale tipo di consistenza hai bisogno, database distribuiti per più server di database, ecc.

    
risposta data 29.08.2016 - 20:37
fonte
7

C'è una soluzione standard a questo. Crea più lavoratori per fare le registrazioni. Ogni richiesta ha un hash applicato al nome utente e l'hash determina quale lavoratore elabora la richiesta. In questo modo non è possibile che due richieste per lo stesso nome utente possano essere elaborate contemporaneamente.

Per questo tipo di volume di richieste, considera un archivio di valori a chiave distribuita come il rischio invece di un intero database come archivio dati.

    
risposta data 29.08.2016 - 23:35
fonte
2

È un problema?

Lasciare che due utenti finiscano la registrazione con un nome utente non univoco non è accettabile se il nome utente (e non l'e-mail dell'utente) viene utilizzato per il login.

Se il nome utente non viene utilizzato per l'autenticazione, è possibile utilizzare un processo in background per identificare e contrassegnare i doppi (ad esempio in base al timestamp) e forzare l'utente a cambiare il suo nome utente all'accesso successivo

Sì, è un problema

Come stai chiedendo, suppongo che il nome utente debba essere un ID univoco. Gli approcci seguenti potrebbero essere utilizzati:

  1. Prima: nel processo di registrazione, prevedere un passaggio in cui il nuovo utente deve verificare la disponibilità del proprio nome. In tal caso, preregistrare il nome dell'account disponibile con uno stato temporaneo e un id di sessione che consentirà di completare la registrazione.
  2. Stessa ora: una variante più generica e flessibile della gnasher729 risposta, sarebbe da utilizzare una semplice funzione di hash (come quelli usati per gestire le tabelle dei simboli), per assegnare l'id a un server di registrazione univoco i (i = h (username) modulo number_of_servers) che gestirà l'unicità sul suo ambito limitato / segmentato
  3. Dopo: al termine della registrazione, quando l'utente fa clic su register invia la richiesta al database transazionale, se è possibile definire il campo come univoco. In caso di errore, invia l'utente sfortunato "oops, c'era un problema" e chiedigli di scegliere un altro ID.
  4. Asincrono: registra l'utente. Rileggi il record dell'utente subito dopo per assicurarti che sia immutato e il singolo. Se si tratta di un problema, chiedi all'utente di cambiare (non in modo asincrono), o di mandargli una mail che ci sia un problema (asincrono, ma fastidioso dal punto di vista dell'utente), o lasciarlo registrare ma chiedergli la sua email (in modo ambiguo) costringerlo a cambiare nome utente come parte della procedura di accesso.
risposta data 29.08.2016 - 21:10
fonte
1

Riconsiderare ciò che si pensa come l'identificatore univoco per un utente. Ogni utente ha già un indirizzo email univoco, quindi il problema è già stato risolto per te. Ovviamente, questo significa che più utenti potranno registrare lo stesso nome, come "Mike Nakis". C'è un problema con quello? Sei sicuro? Ad esempio, non è un problema per Facebook. Esistono più utenti di Facebook chiamati "Mike Nakis". Guarda la pagina di accesso di Facebook: richiede "email o telefono" e "password".

    
risposta data 29.08.2016 - 21:02
fonte
0

Con milioni di utenti che si registrano allo stesso livello, si utilizzano solo server di registrazione 26 x 26, uno per utenti che iniziano con aa, uno per utenti che iniziano con ab e così via. Di conseguenza, ci sono solo migliaia di utenti che si registrano su ciascun server nello stesso momento. Se ancora non riesci a gestirlo, usa 26 x 26 x 26 server.

    
risposta data 29.08.2016 - 20:29
fonte

Leggi altre domande sui tag