8

Sto cercando di avvolgere la mia testa attorno allo Hystrix e dopo aver letto i loro documenti, ho ancora una domanda sui suoi schemi di utilizzo.Hystrix Execution Patterns

Per uno, non capisco il caso uso per quando a usare il loro Asynchronous esecuzione contro la loro reattiva esecuzione. L'unica differenza che posso vedere è che l'esecuzione asincrona è sempre non bloccante, mentre Reactive può essere bloccante o non bloccante. Quindi suppongo che la mia vera domanda sia:

  • Qual è la differenza tra Sincrono e Blocco Esecuzione reattiva ?; e
  • Qual è la differenza tra l'esecuzione reattiva asincrona e non bloccante?

risposta

20

Supponiamo di aver impacchettato due chiamate di servizio A e B come HystrixCommand. Ora hai tre opzioni:

utilizzare .execute(): chiamata sincrona pura. Chiami il metodo e continua il tuo programma una volta che il risultato è arrivato. Il tempo di esecuzione totale del programma è la somma di entrambe le chiamate. Il flusso principale del tuo programma è molto lineare.

utilizzare .queue(): ricevere immediatamente Future per entrambi i comandi. Entrambe le chiamate di servizio vengono eseguite in parallelo. Quindi utilizzare .get() per recuperare i risultati. Queste chiamate con blocco fino a quando il risultato è lì. Il tempo di esecuzione totale è più veloce di prima: il tempo di esecuzione sarà la durata della chiamata di servizio più lunga. Usalo quando vuoi unire i risultati dei due servizi. Il flusso principale del tuo programma è ancora lineare, sebbene entrambe le chiamate siano eseguite in parallelo.

utilizzare .subscribe(): ricevere immediatamente Observable per entrambi i comandi. Entrambe le chiamate di servizio vengono eseguite in parallelo. Quindi utilizzare .subscribe() per registrare una richiamata per agire sul risultato una volta disponibile. Questo è molto utile se non vuoi combinare i risultati e vuoi reagire in modo indipendente sui risultati dei servizi A e B una volta arrivati. Il flusso principale del programma non è lineare, ma reattivo: il flusso del programma continuerà all'interno del callback per ciascun comando.

Spero che aiuti.

+0

Puoi spiegare la proprietà maxQueueSize https://github.com/Netflix/Hystrix/wiki/Configuration#ThreadPool. La mia comprensione dal doc è quando si specifica questa proprietà, la coda utilizzata per passare dal thread chiamante a uno dei thread nel pool di thread Hystrix avrà la dimensione di maxQueueSize? In tal caso, se si specifica questo valore abbastanza grande, dovrei mai ricevere RejectedExecutionException? – timpham