2017-07-05 1 views
1

Nous prévoyons de migrer de l'architecture monolithique à l'architecture basée sur les micro-services. Maintenant, je suis responsable de parler d'un module en monolithe.Monolith to microservice

Monolithe existant:

1) code est couplé très serré.

2) Les API sont appelées récursivement avec différents paramètres.

3) Certains des appels avec-dans le module que je prévois d'extraire contient des appels à un système qui prend environ 9 minutes pour terminer. Malheureusement, c'est synchrone.

Points à noter:

1) Je commence avec une seule migration api qui est très important et ne fonctionne pas bien. 2) Cette api consiste en des appels parallèles à un autre système pour exécuter tas de tâches. Tous les appels sont de blocage et de temps (pensez temps de réponse avg être 5-6 min)

Déménagement à architecture Microservice: Il y a 2 approches qui me vient à l'esprit tout en déplaçant le api mentionné ci-dessus du monolithe à un microservice séparé, avec la résolution du problème de blocage des threads en raison des appels de blocage de temps.

a) se déplaçant dans les phases:

- Create a separate module 
- In this module provide an api to push events to kafka, another 
    module will in-turn process the request and push the response back 
    to kafka 
- monolith for now will call above mentioned api to push events to 
    kafka 
- New module will inturn call back the monolith when the task 
    complete (received response on a separate topic in kafka) 
- Monolith once get response for all the tasks will trigger some post 
    processing activity. 

Advantage: 
1) It will solve the problem of sync- blocking call. 

Disadvantage: 
1) Changes are required in the monolith, which could introduce some 
    bugs. 
2) No fallbacks are available for the case if bug gets introduced. 

b) Déplacer l'API à la fois à la Microservice:

  • Dans un premier temps qui partagera commune source de données avec le monolithe et résoudre le problème de blocage des appels via l'introduction de kafka entre le nouveau microservice et le module prend du temps pour traiter la demande.

    Avantage:

    1) Fallback est disponible dans monolithe

    Inconvénient:

    1) Initialement, la source de données est réparti entre les systèmes.

Quelle devrait être la meilleure approche pour faire ce genre de tâches complexes?

Répondre

2

Vous devez prendre soin de plusieurs choses.

Première

Aller à Microservice sera plus lent (90% du temps) qu'un monolithe parce que vous introduisez la latence. Donc, ne l'oubliez jamais quand vous y allez.

Deuxième

Vous demandez si elle est un bon moyen d'aller avec kafka. Je peux répondre oui dans la plupart des cas, mais vous avez mentionné qu'aujourd'hui le processus est synchrone. Si c'est pour des raisons transactionnelles, vous ne serez pas en mesure de le résoudre avec un courtier de messages, je suppose, parce que vous mettrez à jour votre système de cohérence forte à un éventuel. Je ne dis pas que c'est une mauvaise solution seulement que cela change votre flux de travail et peut avoir un impact sur certaines règles d'affaires.

En tant que solution que je propose ceci:

1 - Casser les coutures dans votre monolithe en introduisant des touches de fonction et de la composition de api à l'intérieur du monolithe (lu le livre de Sam Newman pour aider). 2 - Introduire la cohérence éventuelle à l'intérieur du monolithe pour tester si elle correspond à l'objectif. Il sera plus facile de revenir en arrière si ce n'est pas le cas.

Non, vous devez possibilité:

La deuxième étape est bien passé donc aller de l'avant et mettre le code du service dans un Microservice sur le monolithe.

La deuxième étape ne convenait pas, alors pensez à faire les choses risquées dans un service spécifique ou utilisez des transactions distribuées (attention à cette solution, il pourrait être difficile à gérer).