4 - aceitar rapidamente as tarefas de entrada,
5 - devolver o resultado da tarefa mediante solicitação
6 - se não houver resultado, devolver o estado correspondente
/*
Processador - um serviço que realiza uma operação longa e intensiva em recursos. Já está implementado
Os erros que devolve estão exclusivamente relacionados com dados de entrada incorretos, são estáveis e re-solicitá-los é inútil
*/
type Processor interface {
Process([]byte) ([]byte, error)
}
/*
Assumimos que temos um gerador de identificadores únicos (por exemplo, UUID).
O gerador garante que não haverá colisões
*/
type ID string
// func NewID() ID
/*
O agendador aceita tarefas dos clientes, enfileira-as e inicia o processamento.
Garante que não mais do que 'threads' métodos de processamento estão a ser executados simultaneamente
Permite verificar o estado da tarefa e obter o resultado
não bloqueia os métodos públicos de processamento
*/
type Scheduler struct {
processor Processor
}
func NewScheduler(
prc Processor,
threads int,
) *Scheduler {
// lógica de inicialização
return &Scheduler{
processor: prc,
}
}
func (s *Scheduler) Queue(request []byte) ID {
// implementar
return ""
}