Skip to main content

QueueProcessor

Esse serviço é responsável por executar tarefas "com hora pra acontecer". Se algo deve acontecer "à meia noite", ou "de 10 em 10 minutos" ou qualquer outra regra que envolva horários, esse é o serviço que assume a responsabilidade.

O queueprocessor faz essa administração de duas formas diferentes:

  1. administração de serviços long-running;
  2. checagem periódica de serviços a serem executados.

Os serviços long-running são registrados através de um evento (EventHandler) memory_queue_jobs_longrunning. Cada serviço vai ser detalhado em um article específico.

Os serviços "periódicos" têm várias possíveis origens (até Accelero 2.16.0 são dois --- é uma QueueCollection), explicadas mais adiante. Cada handler é um QueueHandler, cuja responsabilidade é gerenciar algum tipo de fila de "coisas a serem executadas em algum momento".

QueueHandler - dbcache​

Esse handler é o mais simples: de tempos em tempos é feito um scan na tabela queue do banco de dados. São buscados itens cujo campo queSleepUntil seja menor que a data atual. Por padrão, esse scan é feito de minuto em minuto.

QueueHandler - memorycache​

Funciona igual o handler dbcache, mas os itens ficam totalmente em memória RAM. Todos os itens desse queue devem ser registrados através de um evento memory_queue_jobs_enqueue (vide exemplos).

QueueHandler - quando usar dbcache e quando usar memorycache​

Em geral, o dbcache deve ser usado pra coisas realmente dinâmicas e esporádicas (quando acontecer um evento XYZ, algo tem que ser executado daqui 5 minutos).

Já o memorycache geralmente deve ser usado pra coisas que vão ser executadas periodicamente "sem necessidade de provocação" (de 10 em 10 minutos tem que fazer XYZ).

QueueHandler vs LongRunning​

Todos os serviços LongRunning poderiam ser convertidos para usar QueueHandlers, e vice-versa. A determinação de qual a melhor estratégia é a seguinte:

  • serviços LongRunning são executados de forma independente, um não interfere no outro;
  • serviços QueueHandler são executados de forma síncrona, então a execução de "um" depende da finalização do "outro";
  • serviços QueueHandler do tipo dbcache podem ser visualizados (e manipulados) no banco de dados; os outros ficam "mais escondidos";
  • subir um serviço LongRunning "custa mais caro", pois fica um serviço em execução o tempo todo;

Em geral, serviços críticos (keepalive, por exemplo) ou cuja execução é demorada (limpeza de banco de dados, por exemplo) devem ser executados como LongRunning pra garantir que não interfiram (nem sofram interferência) com outros serviços.

Serviços menos importantes ou muito esporádicos e cuja execução é rápida (dar um "ping" no bot do telegram a cada hora, por exemplo) podem ser mantidos dentro de um QueueHandler.