Performance Optimization
При применении в производственной среде с миллионами пользователей или разрешений вы можете столкнуться с снижением производительности при применении Casbin. Обычно есть две причины:
Высокий объем трафика
Количество входящих запросов в секунду слишком велико, например, 10 000 запросов/с для одного экземпляра Casbin. В таких случаях одного экземпляра Casbin обычно недостаточно для обработки всех запросов. Есть два возможных решения:
Используйте многопоточность, чтобы включить несколько экземпляров Casbin, чтобы вы могли полностью использовать все ядра в машине. Для получения дополнительной информации см.: Многопоточность.
Разверните экземпляры Casbin на кластер (несколько машин) и используйте Watcher, чтобы гарантировать согласованность всех экземпляров Casbin. Для получения дополнительной информации см.: Наблюдатели.
Вы можете использовать оба вышеуказанных метода одновременно, например, развернуть Casbin на кластер из 10 машин, где каждая машина имеет 5 потоков, одновременно обслуживающих запросы на применение Casbin.
Большое количество правил политики
В облачной или многопользовательской среде может потребоваться миллионы правил политики. Каждый вызов применения или даже загрузка правил политики в начальное время может быть очень медленной. Такие случаи обычно можно смягчить несколькими способами:
Проверьте, хорошо ли спроектирована ваша модель Casbin или политика. Хорошо написанная модель и политика абстрагируют дублированную логику для каждого пользователя/арендатора и сокращают количество правил до очень небольшого уровня (\< 100). Например, вы можете поделиться некоторыми стандартными правилами между всеми арендаторами и позволить пользователям настраивать свои правила позже. Настроенные правила могут переопределить стандартные правила. Если у вас есть дополнительные вопросы, откройте вопрос на GitHub в репозитории Casbin.
Сделайте шардирование, чтобы Casbin enforcer загружал только небольшой набор правил политики. Например, enforcer_0 может обслуживать tenant_0 до tenant_99, в то время как enforcer_1 может обслуживать tenant_100 до tenant_199. Чтобы загрузить только подмножество всех правил политики, см.: Загрузка подмножества политики.
Предоставьте разрешения ролям RBAC, а не напрямую пользователям. RBAC Casbin реализован с помощью дерева наследования ролей (в качестве кэша). Таким образом, для пользователя, например, Alice, Casbin занимает всего O(1) времени для запроса дерева RBAC о связи роль-пользователь и выполнения применения. Если ваши правила g не меняются часто, то дерево RBAC не нужно постоянно обновлять. См. подробности этого обсуждения здесь: https://github.com/casbin/casbin/issues/681#issuecomment-763801583
Вы можете попробовать все вышеуказанные методы одновременно.