За последние 24 часа нас посетили 22425 программистов и 1051 робот. Сейчас ищут 609 программистов ...

Постановка большого количества заданий в очередь

Тема в разделе "Laravel", создана пользователем sowelanes, 23 окт 2020.

Метки:
  1. sowelanes

    sowelanes Активный пользователь

    С нами с:
    11 дек 2014
    Сообщения:
    101
    Симпатии:
    0
    Всем привет. Есть модель с 700к записями в базе. По каждой записи нужно провести небольшую калькуляцию и сохранить результат в другую таблицу. Пушу это все дело в очередь, которую обрабатывает Horizon. Проблема в том, что сам по себе Horizon с необходимым кол-вом воркеров делает все достаточно шустро, но конкретно сама постановка в очередь остается узким местом для такого объема данных. Выбрать такое количество записей а потом сделать foreach + dispach не подходит по понятным причинам (memory leak). Например есть вот такой вариант:
    PHP:
    1. // Выбираем только id модели, а саму модель в джобе
    2. Model::select('id')->get()->each(function ($item) {
    3.       dispatch(new Job($item->id));
    4. });
    Сама по себе итерация с помощью курсора очень шустрая, например если вместо dispatch() просто вывести точку, то на 700к записей это займет ~15 сек. Но вызов драйвера очереди 700к раз в одном процессе - out of memory.
    В данный момент пробую сделать что-то типа пагинации - разбить 700к записей на чанки, по 50к например, и работать уже с ними (с помощью нового механизма JobsBatching: https://laravel.com/docs/8.x/queues#job-batching) но пока это все дело падает в средине процесса, разбираюсь.
    Возможно кто-то сталкивался или имеет мысли по этому поводу, буду благодарен за совет.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.551
    Симпатии:
    1.754
    Ставить мелкие задания в очередь тоже из очереди