Come scegliere gli ID articoli sequenziali ed evitare uno scontro

6

Ad esempio, stavo utilizzando un host di immagini popolare e tutte le mie immagini hanno un ID a cui è possibile accedere. Se volessi che questo ID fosse sequenziale e non casuale, quale sarebbe il modo migliore per assicurarti che due immagini caricate nello stesso momento non vengano assegnate allo stesso ID da processi / server diversi.

Il modo migliore che posso pensare è che i processi diversi riservano un blocco, ad esempio uno potrebbe riservare 1-1000 e il successivo potrebbe riservare il 1001-2000, quindi gli ID non si scontreranno mai.

Qual è la migliore soluzione a questo problema e come è solitamente risolto. Sembra che la maggior parte dei siti utilizzi un ID casuale. C'è una ragione per questo?

    
posta Qwertie 01.03.2016 - 10:26
fonte

3 risposte

6

La soluzione che hai descritto si chiama Hi / Lo ed è uno dei modi per risolvere questo.

Il motivo per cui alcuni siti usano ancora numeri casuali sono pochi:

Con Hi / Lo, hai ancora bisogno di un'autorità centrale per mantenere la traccia dei blocchi. Questo potrebbe essere problematico, perché i requisiti di stabilità sono enormi per tale sistema.

Relativamente al precedente, con numeri casuali usati, i sistemi che li generano non devono fare affidamento su sistemi specifici, rendendoli più portabili.

Il secondo motivo è che non si tratta di un errore critico se due elementi hanno lo stesso ID. Molto probabilmente risulta che all'utente viene mostrato un errore se vengono generati due ID identici. Ma se lo spazio casuale è abbastanza grande, il sole finirà il carburante molto prima di te avere una buona possibilità di generare due numeri uguali . Questa possibilità è ancora più bassa con alcune generazioni GUID che garantiscono l'unicità del singolo sistema. Quindi generare lo stesso numero due volte sarebbe un problema solo in alcuni casi estremi.

    
risposta data 01.03.2016 - 10:46
fonte
2

Se hai davvero bisogno di ID sequenziali, puoi eseguire un servizio centrale che fornisce gli ID su richiesta. Supponendo che tu sia felice di avere buchi nella tua sequenza, questo può essere un servizio molto semplice, molto veloce, in esecuzione su socket udp e l'allocazione di blocchi di ID per ridurre la larghezza di banda della memoria. Lo svantaggio principale di questo è che se il servizio fallisce, perderai la possibilità di creare nuovi oggetti, quindi sarà necessario qualche tipo di failover rapido, il che aumenterà la complessità.

Tuttavia, mi pongo domande come @ 5gon12eder quali sono i vantaggi che otterrai da questo.

    
risposta data 01.03.2016 - 11:04
fonte
0

Il problema del coordinamento è che il coordinatore ha enormi requisiti di disponibilità / coerenza / latenza.

Quindi esaminiamo 4 soluzioni semplici:

  • Un generatore di sequenze singole
  • La soluzione Hi / Lo, con un singolo generatore Hi
  • La soluzione Hi / Lo, dove Hi è l'ID del nodo (immutabile)
  • La soluzione casuale, in cui viene generato un ID casuale

Nelle prime due soluzioni, hai un singolo generatore e sarà necessario essere disponibile e coerente. Nella prima soluzione dovrà anche rispondere rapidamente, mentre nel secondo se prevedi in anticipo , non deve essere altrettanto veloce.

Nella terza soluzione, il singolo generatore deve essere coerente, ma è necessario solo quando si crea un nuovo nodo / processo / thread e le sue prestazioni non hanno alcun impatto.

Nella quarta soluzione, non esiste un singolo generatore.

Si noti che è possibile ripristinare Hi / Lo mediante partizionamento di Lo. Ad esempio, uno schema semplice è:

  • Genera Hi come un timestamp monotono con sufficiente accuratezza (monotonic significa che se il timestamp non è ancora avanzato, puoi ancora fare un balzo di +1 per generarne uno nuovo)
  • Genera Lo dalla soluzione (3), preferibilmente o (2)

In questo modo, puoi principalmente ordinare gli ID generati da entità diverse in una linea temporale globale.

    
risposta data 01.03.2016 - 16:15
fonte

Leggi altre domande sui tag