Ho una webapp java piuttosto pesante che serve migliaia di richieste/sec e utilizza un DB Postgresql master che si replica su un database secondario (di sola lettura) utilizzando la replica streaming (asincrona).Lettura/scrittura suddivisione Hibernate
Quindi, separo la richiesta da primaria a secondaria (sola lettura) utilizzando URL per evitare chiamate di sola lettura al database primario di bug considerando che il tempo di replica è minimo.
NOTA: Io uso una sessionFactory con un RoutingDataSource fornito da molla che guarda in alto db da utilizzare in base un tasto. Sono interessato alla multitenancy perché sto utilizzando ibernazione 4.3.4 che lo supporta.
Ho due domande:
- non penso splitting sulla base degli URL è efficiente come posso muovere solo il 10% del traffico intorno significa che non ci sono molti di sola lettura URL . Quale approccio dovrei prendere in considerazione?
- Potrebbe essere, in qualche modo, sulla base degli URL che raggiungo un certo livello di distribuzione tra i due nodi ma cosa farei con i miei lavori al quarzo (che hanno anche JVM separata)? Quale approccio pragmatico dovrei assumere ?
So che potrei non ottenere una risposta perfetta qui in quanto questo è davvero ampio, ma voglio solo la tua opinione per il contesto.
Dudes ho nel mio team:
- Spring4
- Hibernate4
- Quartz2.2
- Java7/Tomcat7
Si prega di prendere interesse. Grazie in anticipo.
Avrei due unità di persistenza: una per sola lettura e una per lettura-scrittura, lavoro. La sola lettura potrebbe indicare un PgBouncer che esegue il backup su più repliche di PostgreSQL. Quindi sceglierei quale utilizzare in base al particolare metodo richiamato sui miei oggetti di astrazione di accesso ai dati e altri contesti pertinenti. Bisogna pensare molto attentamente alla coerenza logica se si fa questo, ed evitare cicli di lettura/modifica/scrittura. –
** Il tracciamento utente ** è un'area che può essere ottimizzata, se non già eseguita: separazione nelle tabelle R/O + R + W, cache di sessione, scritta. ** Le tabelle di archiviazione ** che ricevono solo nuovi record, ma i record sono immutabili, possono essere divisi in R/O e R + W, eventualmente con trigger DB. –