Domanda

Devo replicare una sequenza / contatore su un cluster di otto nodi. Ciò significa che ogni richiesta http riceve il valore successivo nella sequenza chiamando qualcosa come getNextIntAndIncrement (), in cui lo stato della sequenza è sincronizzato su tutti i server. Per chiarire, questo deve esistere nell'ambito dell'applicazione / globale, non della sessione. So che sembra un'idea terribile e porterà senza dubbio a colli di bottiglia, ma questo è il requisito.

La mia domanda è: qual è la soluzione migliore? Ho esaminato i bean di sessione con stato, ma sembrano progettati per un solo client. Ho considerato una sequenza di database. Ho anche osservato il clustering di terracotta; hanno una demo di sequenza http://www.terracotta.org/web / display / orgsite / Recipe? recipe = sequencer Tuttavia, vorrei evitare soluzioni di terze parti se esiste una soluzione J2EE. Sto usando Weblogic 8.1.

È stato utile?

Soluzione

Alcuni distributori Java EE hanno soluzioni cache in sospeso (ad es. WebSphere's Object Grid) e hai già identificato offerte di terze parti ma non credo che esista uno standard portatile.

Cosa c'è che non va nella soluzione DB? È chiaro che sarà necessario il blocco, quindi perché non lasciarlo al DB. La mia ipotesi è che se hai davvero bisogno di veri valori incrementali, nessun valore perso ecc. Allora le relazioni transazionali con altri valori del database saranno importanti, quindi usa il DB.

Se riesci a rilassare la necessità di valori sequenetici assoluti (es. permetti spazi vuoti) allora puoi dividere gruppi di numeri e quindi ridurre notevolmente la contesa. Se hai davvero bisogno di valori sequenziali, senza spazi vuoti, stai acquistando la necessità di un certo grado di blocco tra le istanze: non puoi consentire un secondo "thread" per ottenere un nuovo numero progressivo fino a quando "commetti" l'uso di quello attuale. Se puoi permetterti di perdere il numero di sequenza dispari, allora fai molto meglio. Oppure, se puoi schemi di numerazione indipendenti tra istanze, ti trovi in ??posizioni molto migliori. Ad esempio, nome dei server a, b, c ... con ID a001, a002, b001, c001, c002 ecc.

Altri suggerimenti

Penso che una sequenza di database probabilmente ti darebbe il risultato più deterministico, specialmente se usi transazioni altamente serializzate per richiederlo.

Tuttavia, metterei seriamente in dubbio la validità di fare qualcosa del genere, ma sono solo i miei 2 centesimi.

Hai weblogic nei tag per questa domanda - Weblogic consente i cluster singleton. per esempio. un'istanza per cluster con supporto per il failover.

Questo dovrebbe soddisfare i tuoi requisiti:

http: // e-docs .bea.com / WLS / docs100 / javadocs / weblogic / cluster / Singleton / SingletonService.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top