Ho un problema Usiamo Microservices! Ora ho 13 problemi distribuiti.
Dividere il sistema in componenti incapsulati, coesi e disaccoppiati è una buona idea. Ti consente di affrontare diversi problemi separatamente. Ma puoi farlo perfettamente in una distribuzione monolitica (vedi Fowler: Microservice Premium ). Dopotutto, questo è ciò che OOP ha insegnato per molti decenni! Se decidi di trasformare i tuoi componenti in microservizi, non ottieni alcun vantaggio architettonico. Ottieni una certa flessibilità per quanto riguarda la scelta della tecnologia e possibilmente (ma non necessariamente!) Una certa scalabilità. Ma ti è garantito un certo mal di testa derivante da (a) la natura distribuita del sistema e (b) la comunicazione tra i componenti. Scegliere i microservizi significa che hai altri problemi così urgenti che sei disposto a utilizzare i microservizi nonostante questi problemi.
Se non si è in grado di progettare un monolite suddiviso in modo pulito in componenti, non sarà possibile progettare un sistema di microservizi. In una base di codice monolitica, il dolore sarà abbastanza ovvio. Idealmente, il codice semplicemente non verrà compilato se è orribilmente rotto. Ma con i microservizi, ogni servizio può essere sviluppato separatamente, possibilmente anche in lingue diverse. Eventuali problemi nell'interazione dei componenti non diventeranno evidenti fino a quando non si integreranno i componenti e, a quel punto, è già troppo tardi per correggere l'architettura generale.
La fonte n. 1 di bug è la mancata corrispondenza dell'interfaccia. Potrebbero esserci errori evidenti come un parametro mancante, o più sottili esempi come dimenticare di controllare un codice di errore o dimenticare di controllare una condizione preliminare prima di chiamare un metodo. La tipizzazione statica rileva tali problemi il prima possibile: nel tuo IDE e nel compilatore, prima il codice viene mai eseguito. I sistemi dinamici non hanno questo lusso. Non esploderà finché non verrà eseguito quel codice difettoso.
Le implicazioni per i microservizi sono terrificanti. I microservizi sono intrinsecamente dinamici. A meno che non si passi a una lingua di descrizione del servizio formale, non è possibile verificare alcun tipo di correttezza nell'utilizzo dell'interfaccia. devi testare, testare, testare! Ma i test sono costosi e solitamente non esaustivi, il che lascia la possibilità che i problemi possano ancora esistere nella produzione. Quando questo problema diventerà evidente? Solo quando quel percorso difettoso è preso, in fase di esecuzione, in produzione. L'idea che i problemi con i pasticci porterebbero a un feedback più veloce è esilarante pericolosamente sbagliato, a meno che non ti diverta la possibilità di perdita di dati.