@AKLZephyr

Как параллельно отправить несколько миллионов сообщений?

Проект на laravel, postgres, redis queue.

В бд лежит 10 миллионов строк. Нужно отфильтровать их по условиям и отправить им сообщения.
Текущая реализация:
function handle() {
Users::query()->chunk(100, function($users) {
  $filterUsers = $this->filter($users);
  
  foreach ($users as $user) {
     $this->sendToUser($user, 'message');
     // помечаем в бд что отправили
  }
});
}

function filter($users) {
 // опращаемся на врешний апи за инфой по юзерам
 // фильтруем их по условиям из нашей бд
 return $filterUsers;
}

Примерно такая логика сейчас.

Обрабатывает один воркер это все - что очень долго. Как сделать чтобы к примеру 50 воркеров одновременно работали? Как они из базы будут записи брать и не конфликтовать?
  • Вопрос задан
  • 118 просмотров
Пригласить эксперта
Ответы на вопрос 1
aleksejjjj
@aleksejjjj
Webber, закидывайте в очередь нефильтрованных юзеров.
// Добавляем в очередь. Например какой-то консольной командой,
// по крону или как угодно
Users::query()->chunk(100, function($users) {
    \App\Jobs\YourJob::dispatch($users);
});

// А тут уже основная работа
class YourJob implements ShouldQueue
{
    protected $users;

    public function __construct($users)
    {
        $this->users = $users;
    }

    public function handle()
    {
        $filteredUsers = $this->filter($this->users);
  
        foreach ($filteredUsers as $user) {
             $this->sendToUser($user, 'message');
        }
    }

    protected function filter($users)
    {
        // обращаемся на врешний апи за инфой по юзерам
        // фильтруем их по условиям из нашей бд
        return $filterUsers;
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы