Про очередь непонятно. С точки зрения фронтэнда это и есть асинхронность
Про очередь, как делал я. Есть скажем сервер с rest api для формирования отчетов в pdf. При запросе формирования отчета за период, формируем уникальный ключ для задачи, скажем хеш от строкового преставления даты начала и даты конца периода и кладём в redis (для примера) по этому ключу данные о задаче. При повторном запросе если такой ключ был в redis, то возвращаем то что там лежит (а именно данные о задаче и о ее статусе выполнения). Отдельно вертится процесс который из redis получает новые задачи и берет их на выполнение, помечтает их статус как в процессе выполнения и делает работу, по ошибке или успехе опять же меняет статус. Фронтенд же все это время имея идентификатор задачи периодически делает polling статуса задачи, и говорит типа задачу ещё никто не взял или она в процессе или она зафейлилась или она успешно завершилась.