April 9, 2019

Обновление Платформы с исправлением критической ошибки

Коллеги, добрый день!

Многие из вас знают историю, произошедшую на проекте по приему заявок на квартиры в EXPO-городке - во время массовой подачи заявок система их обработки не справилась с нагрузкой.

Техническое расследование показало, что проблемы были, в том числе, и в Платформе ARTA Synergy. Одна из причин была связана с настройками пула хранилища: для пула Cassandra было установлено максимальное количество соединений меньше, чем для mysql. Из-за такой конфигурации под большой нагрузкой (свыше 100 запросов в секунду) подсистема Хранилища не справлялась с нагрузкой, и начинали копиться необработанные запросы.

При этом в пике - на второй минуте после запуска приема заявок - к данной подсистеме было зарегистрировано 966 запросов в секунду.

Со стороны ДРП не были заранее предоставлены четкие инструкции о том, как корректно нужно настраивать такой пул.

Мы выпустили обновление Платформы, версия trunk.4.0-r1~190402.111035 (hamming). В этой версии мы исправили способ настройки пула к Cassandra, чтобы избежать утечки соединений под большой нагрузкой.

Хранилище Cassandra, используемое для высоконагруженных стендов, ранее использовало собственную настройку количества соединений к БД. По умолчанию в этой настройке было установлено значение 100. Однако когда для пула storageDS (mysql) устанавливалось значение больше, чем для Cassandra, возникала проблема доступа к Хранилищу. Для корректной работы необходимо было указывать одинаковое число соединений в настройках и mysql, и Cassandra.

Мы исправили эту проблему таким образом: теперь настройки пула Cassandra будут получаться из настроек пула storageDS.

Если в течение timeout не удастся получить соединение, в логи будет писаться ошибка с подсказкой:

java.lang.Exception: Unable get session from Cassandra within timeout 30000 ms. 
 Please check max-pool-size of java:/StorageDS
    at kz.arta.cassandra.pool.CassandraSessionPool.getSession(CassandraSessionPool.java:195)
    at kz.arta.jcr.bd.cassandra.CassandraConnectionManager.getSession(CassandraConnectionManager.java:39) [ArtaJCR.jar:]

Значение timeout также указывается в настройках пула storageDS:

<timeout> <blocking-timeout-millis>30000</blocking-timeout-millis></timeout>

По умолчанию используется timeout 30 секунд.

Кроме того, было выявлено, что процедура генерации нового значения счетчика под нагрузкой отрабатывала некорректно и надолго занимала соединение с БД. Мы оптимизировали эту процедуру: теперь она выполняется в отдельной короткой транзакции.

Благодарим команду Байтерек за совместную работу! Благодаря им удалось быстро локализовать проблему.

Настоятельно рекомендуется обновить все боевые стенды у клиентов.