【问题标题】:PHP/Cronjob saved search scalabilityPHP/Cronjob 保存了搜索的可扩展性
【发布时间】:2009-05-29 22:36:51
【问题描述】:

当符合用户保存的搜索条件的房产上市时,我们的房地产网站会发送电子邮件通知。

我有一个在 cronjob 上运行的 PHP 脚本来处理搜索。

该系统现在拥有超过 40,000 名用户。我遇到了一个问题,我用尽了 PHP 内存大小。随着系统的增长,我可以继续增加 php.ini 中的内存大小,但希望找到一种更强大的方法来做到这一点。

是否有更可扩展的方式来实现这一点?我应该用更健壮的语言构建一些东西吗?也许是 Java 或 Python 中的线程应用程序?

【问题讨论】:

  • 怎么会是内存问题?我可以看到您会遇到性能问题,但是运行循环 40.000 次不应该真的导致 PHP 达到其内存限制。
  • 这是 PHP 的垃圾收集器 :P

标签: php cron


【解决方案1】:

在保存的搜索表中使用一些标识符来按照专用计算机的数量对任务进行分区

分而治之,将搜索重构部分分给许多机器,每台机器都运行一些任务分区。

每个脚本都可以做

SELECT * FROM saved_search_tbl WHERE ssid IN CALCRANGE(searchid, node_id)

其中 INRANGE 是一些基于工作量和机器节点号的分区逻辑。当新的搜索出现时,您可以通过分配主计算节点和辅助计算节点在机器之间实现负载平衡

一些想法,希望对你有帮助!

祝你好运

【讨论】:

  • 唯一的缺点是每 n 个新的搜索条目重构分区缓存以确保平衡。但是,如果您预计查询量会大幅增长,那么早点而不是晚点 :)
  • 您可以在 X 台机器上运行该进程,只需将进程总数除以 X,然后让每台机器每次都执行特定区域的搜索。只要机器使用相同的逻辑来划分搜索,就不会有任何遗漏的问题。您可以避免向表中添加字段,并且负载平衡通过这种方式本质上是自动的。
  • @epalla - 我同意。我有点不清楚,我更多地暗示缓存该计算并在机器数量发生变化时对其进行重构。但这仅适用于大量数字,作为旁注。此外,添加 pri/secondary 字段和“已完成”位意味着您可以在某些机器死机的情况下冗余地构建它。
猜你喜欢
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多