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:
- administração de serviços long-running;
- 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.