У меня есть API, notifyCustomers()
реализованный на моем пакетном сервере, который вызывается с моего сервера приложений. Он может отправлять уведомления через три канала SMS, Pu sh и по электронной почте. У меня есть отдельные вспомогательные классы для каждого из них, и все они выполняются в асинхронном режиме c.
У меня около 30 тыс. Пользователей, из которых я обычно отправляю уведомления определенному набору пользователей в диапазоне от 3 тыс. до 20к. Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я называю этот API, производительность mysql просто бросает вызов, особенно процессору. Загрузка ЦП идет на 100% за очень длительный период, около 30 минут.
Я нашел обходной путь, выполнив следующие действия, и это помогает мне контролировать ситуацию:
- Использование проекции вместо объекта домена
- Получение данных по 500 в каждом вызове
- Реализовано индексирование на основе необходимых мне критериев
- Нет вызовов базы данных из asyn c методы SMS, электронной почты и Pu sh
- Thread.sleep (10 минут) между каждой последующей операцией выборки пакетов данных <== Это грязный хак, который меня очень беспокоит </li>
Если я удаляю Thread.sleep()
, тогда все идет наперекосяк, потому что пакетный сервер просто вызывает асинхронные c методы, а затем запускает вызов db для получения следующей серии из 500 пользователей в очень быстрой последовательности, пока сервер db не перестанет отвечать.
Мне нужна помощь с тем, что я буду делать, чтобы избавиться от 5-го пункта, сохраняя контроль над ситуацией? Я использую mysql на RDS с 300 IOPS и 4 ГБ ОЗУ (db.t3.medium)