Задача: из большой удаленной БД через API пассажира получить, отфильтровать и аккуратно засторить данные к себе. Пассажир отдает данные постранично, на одной странице 50 записей, или меньше, если предверие конца. При конце данных получаем ожидаемые теги.
Сначала решал задачу в одно потоковом режиме типа page++ эффективность такого решения примерно 23 часа. По не зависящим факторам БД может обновится раз в сутки и этот момент может повлиять на консисетность, да и вообще, если честно долго.
Написал пул из 10 воркеров, которые решают задачу, работа из 23 часов превратилась в работу от 1 до 3 часов. Суть работы пула, это просто револьвер, мастер делает page++ а свободный воркер подхватывает задачу. Найдена граница? все следующие воркеры либо узнают в процессе, доделывают и завершаться, либо при ожидании задачи тоже завершатся. Все работает нормально.
Вопрос вот какого характера: вот этот револьвер, как думаете? можно еще оптимизировать?
Второй вопрос: имеет ли смысл заморачиваться с вычислением границ, ну типа узнать сколько страниц и все такое? софт долгоиграющий, просто метрики выплевывать это фигня, а вот говорить сколько из скольких.
Спасибо!
PS: Извините если нет тут кода golang, но смею вас заверить все написано на go, поэтому примеры будут кстати.
user_test_345, сущности, это типа: подразделения, другая сущность сотрудники, структуры разные,
есть интерфейс и его контракт знает что делать, ну вы поняли, что пишет в разные сущности, но айди есть, я просто хотел подчеркнуть реализацию, спасибо, что заинтересовались.
спасибо :) очень чревато запускать 50 воркеров, я могу запуситть и несколько тысяч, какой будет результат :) Знаете вопрос больше касался к тому, что как не зная границ решения выдавать результаты типа 8 из 10 и возможно не в тему(извините) как этот пассажир работает, на 50 потоков(возможно это поведение настроено) все плохо
> Написал пул из 10 воркеров, которые решают задачу
обычно берётся число аппаратных потоков и умножается на коэффициент, который подбирается опытным путём, т.е. это скорее всего должна быть степень двойки.
devalone, горутина это не классический форк или тред, горутину обслуживает рантайм, поэтому архитектура тут практически не роляет, даже хеллоу ворлд выполняется в несколько потоков :)
ограничений пока нет, но думаю если буду слишком нагружать пассажира, могут возникнуть проблемы, к тому же планирую поделиться своим приложением с коллегами из других регионов.