0

问题(简而言之)是:

我们目前的解决方案太慢了。

  1. Symfony 安全组件在每次页面浏览时重新加载用户。
  2. 用户是从我们自己的 UserProvider 加载的,它访问一个缓慢的外部 API。

我们想到的第一个想法是:

我们可以在本地数据库或内存缓存中缓存来自外部 API 的信息。

我的问题:

  1. 是否有任何捆绑包可以帮助我们实现这一目标?
  2. 我们应该在我们自己的 UserProvider 中处理所有的缓存吗?
  3. 将需要缓存的用户放入一个学说实体并使用链提供程序首先从学说加载它们可能是一个更好的主意吗?在这种情况下,我们如何处理用户对象的有限生命周期?
  4. 不缓存任何东西,而只是编写我们的提供者刷新函数,以便它只在最后一次重新加载发生得太久时才重新加载用户怎么样?

关于如何有效地做到这一点的任何其他想法?

干杯,

丁满

4

1 回答 1

0

缓存和链式提供程序都不是“完美”的解决方案,因为您必须实现在外部提供程序发生更改(例如更改密码)时使用户无效的逻辑。如果我理解正确,这将需要您经常检查 API。似乎您必须以一种或另一种方式在性能和频繁检查更新之间做出妥协。

话虽这么说,我假设您已经有一个自定义用户提供程序,它通过 API 读取用户,并且我认为添加缓存作为依赖项或者可能在您的 UserProvider 旁边创建第二个 CacheApiUserProvider 没有任何问题,因此您可以切换当您的缓存后端遇到问题时,它们之间。我认为不需要额外的捆绑包,但您可能想要寻找缓存捆绑包。

我看不出您在 (3) 中提出的链式提供程序对您有何帮助,因为您只会有相同的限制,即经常检查外部提供程序中的更改,就像使用缓存一样。如果我必须选择,我会使用 CachedProvider,因为它几乎是你想要做的,一个更复杂的链提供者只会隐藏你想要解决的问题并混淆未来的维护者(简而言之:保持很简单)。

根据 API 提供的内容,您可能能够在后台运行一个工作程序,它会自动从 API 获取新用户和对现有用户的更改并将它们移动到(本地)数据库,但在这种情况下,我不会打扰设置建立一个链接的提供程序,并且只依赖数据库是最新的。

于 2013-10-22T14:33:21.637 回答