Performance Optimization
Cuando se aplica en un entorno de producción con millones de usuarios o permisos, puede encontrarse con una disminución del rendimiento en la aplicación de Casbin. Generalmente hay dos causas:
Tráfico de Alto Volumen
El número de solicitudes entrantes por segundo es demasiado grande, por ejemplo, 10,000 solicitudes/s para una sola instancia de Casbin. En tales casos, una sola instancia de Casbin generalmente no es suficiente para manejar todas las solicitudes. Hay dos posibles soluciones:
Usar multi-threading para habilitar múltiples instancias de Casbin, así puedes utilizar completamente todos los núcleos de la máquina. Para más detalles, ver: Multi-threading.
Desplegar instancias de Casbin en un clúster (múltiples máquinas) y usar Watcher para asegurar que todas las instancias de Casbin sean consistentes. Para más detalles, ver: Watchers.
Puedes usar ambos métodos anteriores al mismo tiempo, por ejemplo, desplegar Casbin en un clúster de 10 máquinas donde cada máquina tiene 5 hilos sirviendo simultáneamente solicitudes de aplicación de Casbin.
Alto Número de Reglas de Política
En un entorno de nube o multi-tenant, pueden ser necesarias millones de reglas de política. Cada llamada de aplicación o incluso la carga de las reglas de política al principio puede ser muy lenta. Estos casos generalmente pueden mitigarse de varias maneras:
Verifica si tu modelo o política de Casbin está bien diseñado. Un modelo y política bien escritos abstraen la lógica duplicada para cada usuario/tenant y reducen el número de reglas a un nivel muy pequeño (\< 100). Por ejemplo, puedes compartir algunas reglas predeterminadas entre todos los tenants y permitir que los usuarios personalicen sus reglas más tarde. Las reglas personalizadas pueden anular las reglas predeterminadas. Si tienes más preguntas, por favor abre un issue en GitHub en el repositorio de Casbin.
Hacer sharding para permitir que un ejecutor de Casbin solo cargue un pequeño conjunto de reglas de política. Por ejemplo, enforcer_0 puede atender de tenant_0 a tenant_99, mientras que enforcer_1 puede atender de tenant_100 a tenant_199. Para cargar solo un subconjunto de todas las reglas de política, ver: Policy Subset Loading.
Otorgar permisos a roles de RBAC en lugar de a usuarios directamente. El RBAC de Casbin se implementa mediante un árbol de herencia de roles (como una caché). Así, dado un usuario como Alice, Casbin solo toma tiempo O(1) para consultar el árbol RBAC para la relación rol-usuario y realizar la aplicación. Si tus reglas g no cambian a menudo, entonces el árbol RBAC no necesitará ser actualizado constantemente. Ver los detalles de esta discusión aquí: https://github.com/casbin/casbin/issues/681#issuecomment-763801583
Puedes probar todos los métodos anteriores al mismo tiempo.