您如何处理生产应用程序中的更换/添加/删除模因节点?由于每个客户需要在一个和同一Web服务器上运行,因此我将拥有许多被克隆和自定义的应用程序,因此我猜想有一天会更改某些节点。

以下是备受纪念的方式:

$m = new Memcached();

$servers = array(
    array('mem1.domain.com', 11211, 33),
    array('mem2.domain.com', 11211, 67)
);
$m->addServers($servers);

我的最初想法是使$服务器数组从数据库中填充,也可以缓存,但基于文件,每天完成一次或其他内容,并可以选择强制使用$ $的函数的下一个运行的更新addservers调用。但是,我猜想这可能会增加一些额外的开销,因为磁盘的存储空间很慢。

你怎么看?

有帮助吗?

解决方案

在来源中定义类似的东西总是更好的。当然,你可以使用 parse_ini_file() 或类似的内容来读取配置文件。确实,它属于来源。但是,如果在INI文件中定义,则没有太多的安全问题,例如代码注入等,而不是在PHP中定义您的条目。

由于可能有一些应用程序可能正在读取相同的INI文件,因此您可以将其放在所有应用程序都可以访问的公共位置(例如,使用组权限)。实际上,不是真的建议这样做。

其他提示

使用配置文件 - 无论是来自PARSE_INI_FILE还是其他其他配置解析方案。如果您担心解析时间,则可以将这些配置放在PHP INI加载路径中 http://brian.moonspot.net/using-ini-files-for-php-application-settings - 这可以预先使用您需要的所有VAR,但是您需要重新启动Apache来加载任何更改。

一旦读取文件足够的读数(只要您在计算机上没有太多敲击),配置文件无论如何都会在内存映射的缓存中,因此它将非常快。您可以使用快速加载的PHP序列化表单来优化,甚至通过使用APC用户缓存进一步优化。

最后,使用最新的memcache客户端库 - 他们现在使用一致的哈希算法,它将有助于添加/删除单个服务器。

根据您的要求,如果您希望立即对其进行更新(活动模式),则我会使用一份列表,该列表在某些TTL(被动模式)或某种侦听器模式(Active Mode)之后支持自动驱动器。只要在必要时可以到达且TTL足够大(正如您在评论中提到的),只要您保留主要源(属性文件,数据库等)的位置(属性文件,数据库等)就不重要。

对于被动方法,您可以使用其他一些本地缓存库来支持TTL(例如Java中的EHCACHE),通过将您的服务器列表放入缓存中,以在某些已知键下。例如,对于主动方法,Java具有 java.util.EventListener. 。自从我在PHP中做任何事情以来,(Un)幸运的是,这是多年的,因此无法就此提供建议。

我强烈建议不要将配置数据放入代码中。在我生活的世界上,硬编码是一种严重的罪。

您可能还想看看 last.fm如何使用一致的哈希算法 为了能够将服务器添加到/从内置的池中添加/删除服务器,而不会导致所有键的完整重新映射。

就我而言,这里的主要关注点是如何缓存配置,以使其在更改时主要是最新的。

好吧,这里最好的选择显然是将其存储在数据库中,并每15秒钟从数据库中刷新。在应用程序上承担重大负载,一旦15秒就可以查询DB根本不会更改任何内容。从DB本身加载数据非常快,因为您只需要几个字段。

可能在这里工作的另一个选项 - 使用一个单独的备忘录:)认真地说,只需缓存从那里的db加载的配置,然后清除配置更新中的缓存键即可。

总结:任何基于时间的到期计划都可以正常工作。最简单的解决方案 - 自行维护(存储最后刷新时间,并在每个函数调用中检查它);更高级 - 使用诸如Memcached之类的东西。

更新: :db是最佳的解决方案,因为它的缩放非常好:您不必在每个配置更新中复制20个服务器上的配置。

  • 使用类似的服务定位器 - https://www.consul.io/. 。添加或删除服务,消费者从实时领事中获取服务信息。
  • 如果领事使管理新软件的管理更多开销,请在集中式配置中移动信息。在更新上重新加载配置或触发更新事件。消费者聆听事件并更新信息。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top