Applicazione Web Java in cluster con database condiviso. Come negoziare un'istanza per fare aggiornamenti? Come segnalare le istanze di aggiornamenti? [duplicare]

0

Ho un'applicazione Web Java, in esecuzione in un cluster di server applicazioni Tomcat e un database SQL / JDBC condiviso. I dati del database sono memorizzati nella memoria in ogni istanza dell'app Web.

La mia applicazione web deve aggiornare periodicamente il database con i dati del bollettino meteorologico da un'origine esterna alla mia applicazione Web (ad esempio un thread in background raccoglie e scrive periodicamente un intero gruppo di righe di dati in una tabella nel database utilizzando SQL). Solo una istanza della mia applicazione Web nel cluster dovrebbe eseguire questa operazione e quindi rendere le altre istanze consapevoli del fatto che i dati nel database sono stati modificati in modo che possano svuotare le loro cache e iniziare a utilizzare i dati aggiornati dal database. La propagazione dell'aggiornamento al database non deve essere in tempo reale.

Qual è la migliore pratica per raggiungere questo obiettivo? Come negoziare, quale nodo sarà quello per eseguire gli aggiornamenti? Quali tecnologie JEE posso usare? Voglio evitare semplicemente il polling per le modifiche nel database.

    
posta Twilite 25.11.2014 - 18:39
fonte

2 risposte

1

L'uso di un broker di messaggistica sembra lo strumento migliore per informare le altre applicazioni che dovrebbero aggiornare piuttosto che il polling (il che va davvero bene).

link

Il blocco della tabella del database per la scrittura è ciò che si desidera impedire le condizioni della gara.

    
risposta data 26.11.2014 - 11:54
fonte
2

Abbiamo anche un ambiente cluster. Utilizziamo Hazelcast per tali lavori. Con Hazelcast puoi incorporare il codice per l'aggiornamento all'interno di una " sezione di Hazelcast-Lock " . Non è la mia soluzione preferita, ma questo è il modo in cui viene fatto nella nostra applicazione (e forse si adatta alle tue esigenze con i noccioli).

Scelgo una soluzione più piccola e più semplice: Scriverò un piccolo servizio (buzzword-alarm: micro -) utilizzando Spring Boot .

Il suo unico compito è aggiornare i dati. Non interferisce con la tua applicazione. E quando ha finito il suo lavoro, potrebbe notificare l'applicazione (se necessario). E la parte migliore: non è necessario negoziare tra le istanze .

I vantaggi di un piccolo servizio sono:

  • separazione delle preoccupazioni. Un servizio separato che fa solo una cosa (e lo fa bene).

  • viene eseguito indipendentemente da altre parti dell'applicazione.

  • Gli errori
  • sono ovviamente limitati a questo servizio

  • facile da (non distribuire)

Vantaggi di Spring Boot:

Altri framework, che potrebbero essere interessanti per tale compito sono Dropwizard o Vert.x . Non ho provato né, ma forse dai un'occhiata.

P.S .:

Data from the database is cached in memory in each instance of the web app

Non farlo. Esistono soluzioni migliori come memcached o redis

    
risposta data 26.11.2014 - 13:03
fonte

Leggi altre domande sui tag