Spring Framework @ Asyn c метод + MySql снижение производительности - проблема масштабируемости - PullRequest
0 голосов
/ 22 марта 2020

У меня есть API, notifyCustomers() реализованный на моем пакетном сервере, который вызывается с моего сервера приложений. Он может отправлять уведомления через три канала SMS, Pu sh и по электронной почте. У меня есть отдельные вспомогательные классы для каждого из них, и все они выполняются в асинхронном режиме c.

У меня около 30 тыс. Пользователей, из которых я обычно отправляю уведомления определенному набору пользователей в диапазоне от 3 тыс. до 20к. Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я называю этот API, производительность mysql просто бросает вызов, особенно процессору. Загрузка ЦП идет на 100% за очень длительный период, около 30 минут.

Я нашел обходной путь, выполнив следующие действия, и это помогает мне контролировать ситуацию:

  1. Использование проекции вместо объекта домена
  2. Получение данных по 500 в каждом вызове
  3. Реализовано индексирование на основе необходимых мне критериев
  4. Нет вызовов базы данных из asyn c методы SMS, электронной почты и Pu sh
  5. Thread.sleep (10 минут) между каждой последующей операцией выборки пакетов данных <== Это грязный хак, который меня очень беспокоит </li>

Если я удаляю Thread.sleep(), тогда все идет наперекосяк, потому что пакетный сервер просто вызывает асинхронные c методы, а затем запускает вызов db для получения следующей серии из 500 пользователей в очень быстрой последовательности, пока сервер db не перестанет отвечать.

Мне нужна помощь с тем, что я буду делать, чтобы избавиться от 5-го пункта, сохраняя контроль над ситуацией? Я использую mysql на RDS с 300 IOPS и 4 ГБ ОЗУ (db.t3.medium)

...