Eventos: recebendo e lidando com eventos
Eventos: recebendo e lidando com eventos
Introdução
Algumas interações no VTEX IO podem gerar eventos e estes podem ser utilizados como gatilhos para ações, como a atividade presente neste passo. Por enquanto, utilizaremos os eventos disparados pela app events-example.
Eventos no VTEX IO
Em apps do VTEX IO, eventos podem ser disparados e utilizados como gatilhos para ações. Por exemplo, uma app que escuta por pedidos e ativa um gatilho de email de confirmação. É importante ressaltar que eventos são dependentes da conta e do workspace, o que significa que são apenas visíveis pela conta e pelo workspace de onde foram disparados. Ou seja, eventos disparados no seu workspace pessoal de desenvolvimento serão apenas escutados por apps que estão linkadas no mesmo workspace.
Vamos começar?
Ouvindo eventos na aplicação
-
Em primeiro lugar, vamos começar com o disparo de eventos sendo feito através da app
events-example. Esta app irá disparar um evento a cada X segundos. Após rodar o comandovtex linkno diretório deevents-example, clique na rota de healthcheck disponível e uma mensagem "ok" deve aparecer no navegador:
Este acesso à rota de healthcheck cria um contexto de cache que é necessário para que o VTEX IO dispare eventos. Sem isso, a app
events-examplenão será capaz de disparar eventos que sua app irá ouvir. -
Agora, precisamos adicionar o handler de eventos na declaração de
Service, que é responsável por definir o que a app vai fazer enquanto estiver ouvindo os eventos que podem chegar. Para fazer isso, no arquivo/node/index.ts, incremente a declaração deService://node/index/ts + const THREE_SECONDS_MS = 3 * 1000 + const CONCURRENCY = 10 export default new Service<Clients, State, ParamsContext>({ clients: { implementation: Clients, options: { default: { retries: 2, timeout: 10000, }, + events: { + exponentialTimeoutCoefficient: 2, + exponentialBackoffCoefficient: 2, + initialBackoffDelay: 50, + retries: 1, + timeout: THREE_SECONDS_MS, + concurrency: CONCURRENCY, + }, + }, + }, })Passando por cada uma das configurações, temos o seguinte:
Campo Tipo Descrição exponentialTimeoutCoefficientseconds fator exponencial em que timeouté incrementado a cada tentativaexponentialBackoffCoefficientseconds fator exponencial em que o backoff delayserá incrementado a cada tentativainitialBackoffDelayseconds tempo que a app irá esperar até a próxima tentativa retries- quantidade máxima de tentativas da app timeoutseconds timeout até ser considerado como uma tentativa mal sucedida concurrency- quantidade de processos simultâneos que o evento é capaz de ter Ao adicionar esse código ao
Service, estamos adicionando aoClientdeServicea capacidade de lidar com eventos. Neste ponto, não estamos utilizando ainda os clientes em si ao lidar com eventos.Por enquanto, vamos apenas criar um log de recebimento de eventos. Para criar este handler, vá ao arquivo
liveUsersUpdate.ts, que se encontra na pasta/node/evente faça as seguintes alterações://node/event/liveUsersUpdate.ts export async function updateLiveUsers() { console.log('EVENT HANDLER: received event') } -
Após adicionar o bloco de código mencionado anteriormente, precisamos declarar em
Service, a referência para esta função. No arquivo/node/index.ts, adicione o seguinte código:... + import { updateLiveUsers } from './event/liveUsersUpdate' ... export default new Service<Clients, State, ParamsContext>({ ... + events: { + liveUsersUpdate: updateLiveUsers, + }, }) -
Também é necessário modificar o arquivo
service.json. De forma a ouvir os eventos que são enviados, precisamos declarar isto para darmos a app de serviço que estamos desenvolvendo esta capacidade. É possível fazer isso através das seguintes alterações no arquivoservice.json://node/service.json { "memory": 128, "ttl": 10, "timeout": 10, "minReplicas": 2, "maxReplicas": 10, "workers": 4, + "events": { + "liveUsersUpdate": { + "sender": "vtex.events-example", + "keys": ["send-event"] + } }, ... }Note que fazemos esta declaração ao utilizar o resolver de eventos, definir a referência para a app que efetivamente dispara os eventos (declarada como
sender) e, por fim, adicionar a referência à key do evento (declarada comokeys). -
Por fim, rode o comando
vtex linke espere que os eventos sejam disparados através da appevents-example. Quando escutados, o log deve aparece no terminal, como na imagem abaixo:
Está com dúvidas?
Veja o gabarito para esta etapa ou acompanhe nosso office hours
Ajude-nos a fazer este conteúdo melhor!
Os cursos do VTEX IO são de código aberto. Se você perceber algum problema, pode abrir um pull request!
Faça uma contribuição
Updated 6 months ago
