Pular para o conteúdo principal

Performance Optimization

Quando aplicado em um ambiente de produção com milhões de usuários ou permissões, você pode encontrar uma degradação de desempenho na aplicação do Casbin. Há geralmente duas causas:

Tráfego de Alto Volume

O número de solicitações recebidas por segundo é muito grande, por exemplo, 10.000 solicitações/s para uma única instância do Casbin. Nesses casos, uma única instância do Casbin geralmente não é suficiente para lidar com todas as solicitações. Há duas possíveis soluções:

  1. Use multithreading para habilitar múltiplas instâncias do Casbin, assim você pode utilizar totalmente todos os núcleos da máquina. Para mais detalhes, veja: Multi-threading.

  2. Implante instâncias do Casbin em um cluster (múltiplas máquinas) e use Watcher para garantir que todas as instâncias do Casbin estejam consistentes. Para mais detalhes, veja: Watchers.

nota

Você pode usar ambos os métodos acima ao mesmo tempo, por exemplo, implantar o Casbin em um cluster de 10 máquinas onde cada máquina tem 5 threads servindo simultaneamente as solicitações de aplicação do Casbin.

Alto Número de Regras de Política

Em um ambiente de nuvem ou multi-tenant, podem ser necessárias milhões de regras de política. Cada chamada de aplicação ou até mesmo o carregamento das regras de política no tempo inicial pode ser muito lento. Esses casos geralmente podem ser mitigados de várias maneiras:

  1. Verifique se o seu modelo ou política do Casbin está bem projetado. Um modelo e política bem escritos abstraem a lógica duplicada para cada usuário/tenant e reduzem o número de regras para um nível muito pequeno (\< 100). Por exemplo, você pode compartilhar algumas regras padrão entre todos os tenants e permitir que os usuários personalizem suas regras mais tarde. Regras personalizadas podem substituir as regras padrão. Se você tiver mais perguntas, por favor, abra uma issue no GitHub no repositório do Casbin.

  2. Faça sharding para permitir que um executor do Casbin carregue apenas um pequeno conjunto de regras de política. Por exemplo, o executor_0 pode atender do tenant_0 ao tenant_99, enquanto o executor_1 pode atender do tenant_100 ao tenant_199. Para carregar apenas um subconjunto de todas as regras de política, veja: Policy Subset Loading.

  3. Conceda permissões a papéis RBAC em vez de diretamente aos usuários. A implementação do RBAC do Casbin é feita por uma árvore de herança de papéis (como um cache). Assim, dado um usuário como Alice, o Casbin leva apenas tempo O(1) para consultar a árvore RBAC para a relação usuário-papel e realizar a aplicação. Se suas regras g não mudam frequentemente, então a árvore RBAC não precisará ser constantemente atualizada. Veja os detalhes desta discussão aqui: https://github.com/casbin/casbin/issues/681#issuecomment-763801583

nota

Você pode tentar todos os métodos acima ao mesmo tempo.