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.
|
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 .
. , “” - .
3 4 .
. , . Trigger Hook . Trigger Hook , . , , , , , , , Trigger Hook.
. , , , . , “ email ” “ YouTube”, Trigger Hook “ ”. , Trigger Hook “ ”. , , , , “ ”. 5 6 .
. - . , , . , , (, ) -. , . - - “ ”?
7 , , -, , . , - -. - . RabbitMq direct.
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
. , . , Trigger Hook . id ( ) trigger hook ( ). .
Trigger Hook
-. Docker . Kubernetes. minikube. .
Message service - ( 11), API email . .
:
.
.
PHP, Symfony 5.
. API Nginx. - supervisor RabbitMQ. .
8 .
Message Dashboard - Message service ( 12).
Mailer . . , .
Trigger service - . GRPC , AMQP ().
Monitoring - , . 14 . Grafana InfluxDB. .
Espero que você ache o aplicativo e o artigo úteis! Siga meu github , siga o projeto , coloque asteriscos). Obrigado!