170 похожих чатов

Всем привет. Обрисую ситуацию - есть фронт узел FE и

2 BE-узла, оба - на Spring Boot.
BE1 - вполне стандартен и через Spring Data (JPA/Hibernate) сохраняет записи в конкретную таблицу (или множество таблиц) в Postgres.
Работает через ORM.
BE2 - своей БД не имеет, связывается с внешней (от 3ьей стороны) БД Оракл с доступом на чтение и забирает те данные, которые ему прикажет фронт. Но ORM здесь нет, есть Dynamic MyBatis (работа на уровне recordset), поскольку есть требование в рантайме формировать нужный SQL запрос динамически (динамическими являются не только параметры, но и таблицы к которым обращаются - этакий генератор запросов там внутри) а-ля select table1.attribute1, table2.attribute2, .... From table1, table2, .... WHERE param1, param2, ... (подозреваю что не используется prepared statement из-за такой универсальности генератора запросов). BE-узлы друг друга по РЕСТ не видят, FE видит оба BE-узла.
FE отправляет запрос в BE2, он конвертируется из JSON-вида в SQL-вид этим самым генератором, отправляется в Оракл, возвращается результат отдается опять фронту. Фронт получив эту пачку данных отдает ее на сохранение в BE1, где она успешно сохраняется. Пачка даных (страница) составляет по дефолту 100 записей, далее процесс повторяется с новым запросом но уже с заказом следующей пачки данных.
Все это время FE показывается прогресс-бар пользователю сколько он пачек по 100 записей успел перегнать из BE2 в BE1.

Второй этап - сохранение в BE1 - занимает чуть менее секунды на отработку пачки из 100 записей (вполне константен) если судить по веб-консоли запроса. В оптимизации пока не нуждается.
Первый этап - выборка из BE2 - по замерам сильно зависит от выбираемых параметров фильтрации в генераторе запросов (это логично, поскольку зависит от того идексируемые ли атрибуты запрашиваются в параметрах фильтрации или неиндексируемые) растягивается от полсекунды до 7-8 секунд на пачку, но однако намного сильнее зависит от того какой суммарный объем записей нужно перегнать из BE2 в BE1 (от необходимого числа итераций по 100 записей).

По замерам - в минуту успевает перегнать 1500 записей (те 15 пачек по 100), усреднённое это 25 записей в сек (это суммарно оба этапа).
Если объемы данных большие (скажем 5 млн записей) - с учетом этой скорости - это 55 часов.


1) вопрос - не меняя архитектуры, есть ли способы ускорить второй этап?
- Вижу только такой - провести исследование на предмет оптимального размера пачки (скажем не 100, а 500 или 1000 записей за страницу) с целью снижения числа итераций.
- Потенциально еще - переделать как-то генератор запросов в сторону prepared statements, пожертвовав универсальностью (при возможности). Что-то еще?

2) если архитектуру таки позволят менять в перспективе - какие тогда есть варианты?
Например убрать взаимодействие FE - BE2 и заставить эти итерации по сигналу от FE делегировать на BE1 полностью, чтобы FE лишь заказывал загрузку данных, а их накапливание делалось в BE1, но тогда FE не сможет показывать прогресс по пачкам по ходу загрузки автоматом (только если не будет специально запрашивать этот прогресс с BE1).

Интересуют именно программные варианты к оптимизации (а не наращивание железа/добавление узлов).
Поделитесь своим опытом или идеями, пожалуйста. Заранее спасибо.

5 ответов

10 просмотров

Если объемы данных большие (скажем 5 млн записей) - с учетом этой скорости - это 55 часов.... Привет. Каких результатов хотите добиться? Может от этого пойти? Какая цель оптимизации?

Вы пытаетесь в базе сделать поиск. Поэтому она тормозит. Поэтому берите поисковый движок и делайте поиск там где для него всё и делается. А фронт в перегонке данных никак не должен участвовать. Отчет о прогрессе делается элементарно записью текущего состояния операции в какое-нибудь хранилище, за которым клиент приходит раз в секунду.

Делать параллельно сразу несколько запросов к be2 не пробовали? Чтобы в каждом параллельном запросе приходила одна из пачек.

Valery-TL Автор вопроса
Etki
Вы пытаетесь в базе сделать поиск. Поэтому она тор...

Про фронт понял, вполне доходчиво. А насчёт солр и иже с ними пока не думали. В любом случае этот подход потребует много времени и определенного плана. Спс за идею.

Valery-TL Автор вопроса
Evgenii Eliseev
Делать параллельно сразу несколько запросов к be2 ...

Несколько Аякс запросов? Или с фронта один а на бе2 несколько потоков? Можно да, но думаю это упрется в конечном итоге в количество сессий выделяемых из пула для сторонней бд. А учитывая то что такую процедуру могут запрашивать несколько пользователей одновременно мне кажется будет больше минусов чем плюсов.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта