跳转至主要内容

Performance Optimization

当在拥有数百万用户或权限的生产环境中应用时,您可能会遇到Casbin执行性能下降的问题。 通常有两个原因:

高流量

每秒进入的请求数量过大,例如,单个Casbin实例每秒10000个请求。 在这种情况下,单个Casbin实例通常无法处理所有请求。 有两种可能的解决方案:

  1. 使用多线程启用多个Casbin实例,这样您可以充分利用机器中的所有核心。 更多详情,请参见:多线程

  2. 将Casbin实例部署到集群(多台机器)并使用Watcher确保所有Casbin实例的一致性。 更多详情,请参见:观察者

备注

您可以同时使用上述两种方法,例如,将Casbin部署到一个10台机器的集群,每台机器有5个线程同时服务于Casbin执行请求。

策略规则数量高

在云环境或多租户环境中,可能需要数百万条策略规则。 每次执行调用甚至在初始时间加载策略规则都可能非常慢。 这种情况通常可以通过几种方式缓解:

  1. 检查您的Casbin模型或策略是否设计得当。 一个编写良好的模型和策略可以将每个用户/租户的重复逻辑抽象出来,并将规则数量减少到非常小的级别(\< 100)。 例如,您可以在所有租户之间共享一些默认规则,并允许用户稍后自定义他们的规则。 定制的规则可以覆盖默认规则。 如果您有任何进一步的问题,请在Casbin仓库上开一个GitHub问题。

  2. 进行分片,让Casbin执行器只加载一小部分策略规则。 例如,执行器_0可以服务于租户_0到租户_99,而执行器_1可以服务于租户_100到租户_199。 要加载所有策略规则的子集,请参见:策略子集加载

  3. 将权限授予RBAC角色,而不是直接授予用户。 Casbin的RBAC是通过角色继承树(作为缓存)实现的。 所以,对于像Alice这样的用户,Casbin只需要O(1)的时间就可以查询RBAC树的角色-用户关系并执行。 如果你的g规则不经常改变,那么RBAC树就不需要不断更新。 查看此讨论的详细信息:https://github.com/casbin/casbin/issues/681#issuecomment-763801583

备注

你可以同时尝试上述所有方法。