Перейти к основному контенту

Performance Optimization

При применении в производственной среде с миллионами пользователей или разрешений вы можете столкнуться с снижением производительности при применении Casbin. Обычно есть две причины:

Высокий объем трафика

Количество входящих запросов в секунду слишком велико, например, 10 000 запросов/с для одного экземпляра Casbin. В таких случаях одного экземпляра Casbin обычно недостаточно для обработки всех запросов. Есть два возможных решения:

  1. Используйте многопоточность, чтобы включить несколько экземпляров Casbin, чтобы вы могли полностью использовать все ядра в машине. Для получения дополнительной информации см.: Многопоточность.

  2. Разверните экземпляры Casbin на кластер (несколько машин) и используйте Watcher, чтобы гарантировать согласованность всех экземпляров Casbin. Для получения дополнительной информации см.: Наблюдатели.

заметка

Вы можете использовать оба вышеуказанных метода одновременно, например, развернуть Casbin на кластер из 10 машин, где каждая машина имеет 5 потоков, одновременно обслуживающих запросы на применение Casbin.

Большое количество правил политики

В облачной или многопользовательской среде может потребоваться миллионы правил политики. Каждый вызов применения или даже загрузка правил политики в начальное время может быть очень медленной. Такие случаи обычно можно смягчить несколькими способами:

  1. Проверьте, хорошо ли спроектирована ваша модель Casbin или политика. Хорошо написанная модель и политика абстрагируют дублированную логику для каждого пользователя/арендатора и сокращают количество правил до очень небольшого уровня (\< 100). Например, вы можете поделиться некоторыми стандартными правилами между всеми арендаторами и позволить пользователям настраивать свои правила позже. Настроенные правила могут переопределить стандартные правила. Если у вас есть дополнительные вопросы, откройте вопрос на GitHub в репозитории Casbin.

  2. Сделайте шардирование, чтобы Casbin enforcer загружал только небольшой набор правил политики. Например, enforcer_0 может обслуживать tenant_0 до tenant_99, в то время как enforcer_1 может обслуживать tenant_100 до tenant_199. Чтобы загрузить только подмножество всех правил политики, см.: Загрузка подмножества политики.

  3. Предоставьте разрешения ролям RBAC, а не напрямую пользователям. RBAC Casbin реализован с помощью дерева наследования ролей (в качестве кэша). Таким образом, для пользователя, например, Alice, Casbin занимает всего O(1) времени для запроса дерева RBAC о связи роль-пользователь и выполнения применения. Если ваши правила g не меняются часто, то дерево RBAC не нужно постоянно обновлять. См. подробности этого обсуждения здесь: https://github.com/casbin/casbin/issues/681#issuecomment-763801583

заметка

Вы можете попробовать все вышеуказанные методы одновременно.