2012-01-30 9 views
5

Non creerei mai abbastanza entità per esaurire lo spazio degli indirizzi a 63 bit, ma dico che ho usato allocateIdRange per allocare l'id 9223372036854775807 (che è quasi 2^63). Questo tipo di entità è appena rotto per nuove entità automaticamente inserite?Cosa posso aspettarmi quando finisco gli ID su AppEngine?

Ho provato questo in un'app di prova. Sembra che alcuni frammenti di auto-IDer possano continuare a produrre id validi, ma altri frammenti danno solo un DatastoreFailureException. Il tasso di successo è di circa il 30%. Salirà mai?

Questa è davvero una domanda seria perché, nella mia ingenuità, ho creato alcuni ID piuttosto grandi. Ho ancora diverse trilioni di entità da percorrere prima di arrivare a questo limite, ma ho notato che gli ID possono saltare di milioni tra entità, e io inserisco nuove entità al ritmo di circa un milione all'anno. Quindi ... ho paura di raggiungere questo limite.

+0

È possibile utilizzare ID incrementale e non dovrebbe essere un problema –

+0

Grazie per la risposta. Come posso usare l'ID incrementale? Nei miei test, l'allocazione predefinita che appengine smette di funzionare. –

+3

Fintanto che non crei altri ID enormi, penso che starai bene. Credo che gli intervalli tra gli ID provengano da reimpostazioni nei contatori locali utilizzati per allocare gli ID. Puoi immaginare come funziona: vari frammenti del datastore utilizzano l'equivalente interno di allocate_ids per richiedere ad es. 100 id e poi consegnarli a nuove entità; se un frammento viene ucciso, qualsiasi ID non distribuito è sempre riservato. Io sto generando nuovi ID a un tasso di un milione all'anno penserei che la maggior parte dei frammenti debba distribuire molti id prima che muoiano. È possibile campionare gli ID per un mese e prevedere la velocità. –

risposta

2

Con un'applicazione di test ho prenotato un gruppo di ID molto alti con allocateIdRange. All'inizio, circa la metà dei miei tentativi di mettere nuove entità è riuscita. Ora, no le nuove entità possono essere inserite con un ID vuoto - un numero DatastoreFailureException viene generato ogni volta. Presumo che ciò sia dovuto al fatto che l'implementazione degli allocatori chiave non tiene traccia degli spazi vuoti nelle chiavi, ma tiene solo traccia dell'ID più elevato fornito finora.

Non vedo alcun modo per reimpostare il contatore per questo tipo, quindi penso che l'unica soluzione sarebbe quella di scegliere un nuovo nome Kind.

Lezione: non utilizzare ID ovunque vicino a 2^63!

Problemi correlati