Ho un processo daemon, scritto in Java, che mi piacerebbe essere configurabile in fase di runtime tramite un'API basata su HTTP.
Per una serie di motivi, preferisco che l'API di amministrazione sia separata dal processo daemon stesso:
- resilienza: se l'API di amministrazione fallisce, il demone deve continuare a funzionare.
- separazione delle preoccupazioni: l'API di amministrazione e il daemon sono due componenti distinti (ma correlati) dell'intera applicazione.
- accoppiamento lento: è più semplice aggiornare uno o l'altro componente se non sono strettamente accoppiati.
Al momento, gli approcci che ho considerato includono:
- Incorporare sia il daemon che l'API di amministrazione in un'applicazione JAX-WS. Funzionerebbe, ma fallisce su tutti i punti precedenti.
- Il processo daemon espone l'API di amministrazione tramite un servizio Web incorporato (ad esempio Jetty). Questo sarebbe meglio dell'approccio precedente (il demone non dipende più da un contenitore web), ma condivide molti degli stessi problemi.
- Hanno due applicazioni separate (daemon e API), che condividono un database di configurazione comune. Ciò consentirebbe un accoppiamento lento, ma porterebbe a un'interazione imbarazzante tra i componenti (ad esempio, ogni componente che ha bisogno di interrogare il database per le modifiche apportate dall'altro).
- Avere due applicazioni separate, comunicanti tramite un'interfaccia a basso livello basata su socket o pipe. Questo è il migliore in termini di ottenere un accoppiamento libero efficiente, ma (presumibilmente) a un costo maggiore in termini di complessità del codice.
Se accettiamo che sia preferibile mantenere i due componenti liberamente accoppiati, qual è l'approccio migliore (cioè più flessibile e idiomatico) per ottenere questo in Java? C'è un'alternativa che non ho considerato?