vitya_brodov
@vitya_brodov
Java dev

Как оптимизировать задачу?

Всем привет!

Задача: Необходимо достать из бд всех клиентов и проверить их на стороннем сервисе на наличие долга. Если есть долг, то отправить письмо клиенту.

Что сделано: кроном каждые 6 часов выдергиваю всех клиентов из бд и прогоняю их по одному на стороннем сервисе.

Проблема: На каждый запрос сторонний сервис отвечает 2 секунды, для обработки ~50к клиентов занимает 25 часов.

Вопрос: Была ли аналогичная проблема в вашей карьере?
Если да то прошу подсказать, Как можно это все оптимизировать с учетом что клиентская база каждый день может расти?

P.s Используемые технологии: Spring Data jpa + Postgresql
  • Вопрос задан
  • 200 просмотров
Пригласить эксперта
Ответы на вопрос 5
Lorien_Elf
@Lorien_Elf
Keep calm and drop database
Я сварщик ненастоящий, но вижу два пути:
- Отсылать на сервер данные массивом, а не поштучно.
- Отправлять штучные запросы параллельно.

Оба решения требуют чтения доков на этот сервис или разговора с местными инженерами. Так как первый может не поддерживаться, а второй может вас забанить за спам :)
Ответ написан
Комментировать
gbg
@gbg
Любые ответы на любые вопросы
В данном случае вопрос технически никак не "оптимизируем". Нужно общаться со сторонним сервисом на предмет пакетной обработки данных у них.
Ответ написан
GigaLORDex
@GigaLORDex
Бизнес-Системный аналитик
Я бы еще уточнил по бизнес-процессу, а действительно ли надо каждые 6 часов дергать всех клиентов и запрашивать по ним, как вариант, можно пойти таким путем:
- Первично дергаем всех клиентов (50к) и проверяем на долг.
- Далее каждые 6 часов запросом дергаем только тех клиентов, по которым были взаиморасчеты. (ведь в базе могут быть клиенты, с которым взаиморасчеты уже 5 лет никто не вёл, они исторически там лежат, зачем по ним каждый раз запрашивать)
Ответ написан
Комментировать
@PiloTeZ
...
Можно попробовать вынести в очередь (RabbitMQ например, обрабатывать каждого клиента отдельной задачей в очереди) и выполнять задачи несколькими воркерами, то есть параллельно. Единственное, важно что бы вас не забанил сторонний сервис и вы не положили его нагрузкой. Что бы регулировать нагрузку, нужно менять количество воркеров обрабатывающих поступающие задачи
Ответ написан
Комментировать
azerphoenix
@azerphoenix Куратор тега Spring
Java Software Engineer
Может быть есть смысл подключить spring batch или spring quartz? И обрабатывать параллельно
Ответ написан
Ваш ответ на вопрос

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

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