Проблема
Столбец авторизации_код_значение определен как BLOB без индекса. Когда выполняется JdbcOAuth2AuthorizationService:
Код: Выделить всё
SELECT * FROM oauth2_authorization WHERE authorization_code_value = ?
- Время запроса: 1–2 секунды на каждый поиск кода авторизации
- Скачки ЦП во время пикового трафика
- Случайные ошибки таймаута авторизации
/>
Код: Выделить всё
CREATE TABLE oauth2_authorization (
id varchar(100) NOT NULL,
registered_client_id varchar(100) NOT NULL,
principal_name varchar(200) NOT NULL,
authorization_grant_type varchar(100) NOT NULL,
...
authorization_code_value blob DEFAULT NULL,
authorization_code_issued_at timestamp DEFAULT NULL,
authorization_code_expires_at timestamp DEFAULT NULL,
...
PRIMARY KEY (id)
);
Код: Выделить всё
EXPLAIN SELECT * FROM oauth2_authorization
WHERE authorization_code_value = 'xxx';
-- Result:
-- type: ALL (full table scan)
-- rows: ~600000
-- Extra: Using where
Добавление индекса на основе хеша:
Код: Выделить всё
ALTER TABLE oauth2_authorization
ADD COLUMN authorization_code_hash VARCHAR(64)
AS (SHA2(authorization_code_value, 256)) STORED,
ADD INDEX idx_authorization_code_hash (authorization_code_hash);
Код: Выделить всё
WHERE authorization_code_hash = SHA2(?, 256)
AND authorization_code_value = ?
Вопросы
- Известна ли это проблема при крупномасштабном развертывании?
- Каков рекомендуемый подход для обработки таблицы oauth2_authorization в масштаб?
- Должны ли мы внедрить механизм автоматической очистки для кодов авторизации с истекшим сроком действия?
- Будет ли мое решение с индексированием на основе хэша считаться лучшей практикой или есть лучший подход?
- Коды авторизации имеют 10 минут истечение срока действия
- Высокий объем трафика приводит к быстрому накоплению записей.
- В настоящее время стратегия очистки отсутствует — записи накапливаются бесконечно.
- Рассматриваем возможность реализации запланированного задания очистки, но сначала хотим понять лучшие практики.
Среда
- Сервер авторизации Spring: 1.x
- Spring Boot: 3.x
- База данных: MySQL 8.4 (AWS RDS)
- Записи: ~600 000 в таблице oauth2_authorization
Подробнее здесь: https://stackoverflow.com/questions/798 ... mn-without
Мобильная версия