Tarefas diferidas na arquitetura de microsserviço

Freqüentemente, em projetos, há a necessidade de realizar tarefas pendentes, como enviar e-mails, push e outras tarefas específicas inerentes à área de domínio de sua aplicação. As dificuldades começam quando um crontab regular não é mais suficiente, quando o processamento em lote não é adequado e quando cada unidade de uma tarefa tem seu próprio tempo de execução ou é atribuída dinamicamente.





Para resolver este problema, outra solução foi criada chamada Trigger Hook . Um diagrama esquemático do trabalho é mostrado na Figura 1. O diagrama mostra o que acontece com as tarefas durante todo o seu ciclo de vida. Uma mudança na cor significa uma mudança no status da tarefa.





Figura 1 - Diagrama esquemático do gatilho
Figura 1 - Diagrama esquemático do gatilho





uma tarefa cujo tempo de lançamento não chegará em breve









uma tarefa cujo tempo de lançamento está chegando









tarefa cuja hora de início chegou









trabalho processado









status de trabalho não confirmado no banco de dados









comando deletar





Ciclo de vida da tarefa:





  • Quando uma tarefa é criada, ela vai para o banco de dados (bloco quadrado) (vermelho e amarelo).





  • ( ), ( ->). ().





  • , ( ->). .





  • , ( ->->). , .





.





API

Id UUIDv4. , . id . UNIX.





:





task := &domain.Task{
	Id: 	    id,
	ExecTime: time,
}
triggerHook.Create(task)
      
      



:





triggerHook.Delete(task.Id)
      
      



:





for {
	result := triggerHook.Consume()
	if err != send(result.Task()) {
		result.Rollback()
	}
	result.Confirm()
}
      
      



, , . , . . .





, - . , , . . Trigger Hook - .





, , . . . Trigger Hook, , - . .





, . , . , , . . , . .





, , - .





.





:





  • AWS EC2 Ubuntu 20





  • t2.micro





  • 1 vCPUs 2.5 GHz





  • 1 GiB RAM





:





  • AWS RDS MySQL 8.0





  • db.t3.micro





  • 2 vCPUs





  • 1 GiB RAM





  • Network: 2085 Mbps













(/)













1 11





1396





100000









52





1920





100000





( )





498





200668





100000





( )





2





49905





100000





Trigger Hook time-series . . .





. : 





  • -





  • ,  









InfluxDB+Grafana





Trigger Hook -

- , , . Trigger Hook -, . , (, ) ( ) , .





, 2 . - , , RabbitMQ. - , , HTTP. ( ), . , . , - , . , Push .





. , “” - .





Figura 2 - Esquema de comunicação por meio de canal assíncrono
2 -

3  4 .





Figura 3 - O processo de criação de uma entidade com execução diferida
3 -
Figura 4 - Executando uma atribuição de entidade
4 -

. , . Trigger Hook . Trigger Hook , . , , , , , , , Trigger Hook.





. , , , . , “ email ” “ YouTube”, Trigger Hook “ ”. , Trigger Hook “ ”. , , , , “ ”. 5 6 .





Figura 5 - Criação de um trabalho usando uma camada intermediária
5 -
Figura 6 - Processando um evento usando uma camada intermediária
6 -

. - . , , . , , (, ) -. , . - - “ ”?





Figura 7 - Gerenciador de tarefas em um m / s com Trigger Hook
7 - / Trigger Hook

7 , , -, , . , - -. - . RabbitMq direct.





Figura 8 - Gerenciador de tarefas como parte do cliente m / s
8 - /

8 , - . - - Trigger Hook -.





, . , , , PHP + MySQL. PHP , Nginx , , MySQL PHP . MySQL , PHP , .





, . . Trigger Hook . , . , , 5 . , Trigger Hook . . API delete. , . .





, Trigger Hook . . , Trigger Hook , , Trigger Hook - , , .





9 . Trigger Hook , ( ). Trigger Hook . , -  hash map , , Redis, -:





task_id:instance_host
      
      



Figura 9 - Esquema de escala horizontal
9 -

. , . , Trigger Hook . id ( ) trigger hook ( ). .





Trigger Hook

-. Docker . Kubernetes. minikube. .





Figura 10 - Diagrama simplificado da interação dos microsserviços
10 - -

Message service - ( 11), API email . .





:













  • PHP, Symfony 5.





  • . API Nginx. - supervisor RabbitMQ. .





  • 8 .





Figura 11 - Serviço de mensagens
11 - Message service

Message Dashboard - Message service ( 12).





Figura 12 - Interface do aplicativo de demonstração
12 - -

Mailer . . , .





Trigger service - . GRPC , AMQP ().





Figura 13 - Serviço de gatilho
13 - Trigger service

Monitoring - , . 14 . Grafana InfluxDB. .





Figura 14 - Métricas técnicas Trigger Hook
14 - Trigger Hook

Espero que você ache o aplicativo e o artigo úteis! Siga meu github , siga o projeto , coloque asteriscos). Obrigado!








All Articles