4 - aceptar rápidamente las tareas entrantes,
5 - devolver el resultado de la tarea bajo petición
6 - si no hay resultado, devolver el estado correspondiente
/*
Procesador - un servicio que realiza una operación larga y que consume muchos recursos. Ya está implementado
Los errores que devuelve están relacionados exclusivamente con datos de entrada incorrectos, son estables y no tiene sentido volver a solicitarlos
*/
type Processor interface {
Process([]byte) ([]byte, error)
}
/*
Suponemos que tenemos un generador de identificadores únicos (por ejemplo, UUID).
El generador garantiza que no habrá colisiones
*/
type ID string
// func NewID() ID
/*
El programador acepta tareas de los clientes, las encola y las inicia en procesamiento.
Asegura que no se ejecuten más de 'threads' métodos de procesamiento simultáneamente
Permite verificar el estado de la tarea y obtener el resultado
no bloquea sus métodos públicos para el procesamiento
*/
type Scheduler struct {
processor Processor
}
func NewScheduler(
prc Processor,
threads int,
) *Scheduler {
// lógica de inicialización pendiente
return &Scheduler{
processor: prc,
}
}
func (s *Scheduler) Queue(request []byte) ID {
// implementar
return ""
}