【问题标题】:What is the most efficient way to record JSON data per second每秒记录JSON数据的最有效方法是什么
【发布时间】:2018-02-11 06:43:49
【问题描述】:

原因

我一直在构建一个从多个 JSON 源中提取数据的系统。被提取的数据不断变化,我正在通过 PHP 脚本记录对 SQL 数据库的更改。 10 次中有 9 次数据不同,因此需要记录。

需要每秒钟检查一次 JSON。我已经成功地每分钟使用一个 cron 任务和一个循环 60 次以上的 PHP 函数。

我现在遇到的问题是,我想要检查的 JSON 源越多,PHP 文件运行的速度就越慢,这意味着下一个 cron get 在前一个完成之前触发。这一切都开始让人觉得太不稳定和老套了。


问题

假设 PHP 脚本已经是最高效的,还能做什么?

  • 我应该使用多个 cron 任务吗?
  • 是否应该使用 PHP 以外的其他东西?
  • cron 任务甚至适合这类问题吗?

非常感谢任何经验、最佳做法或只是计划旧的帮助。


概述

我正在监控正在进行的比赛,并记录每位车手以及车手完成的每一圈。只有在车手越过起跑线/终点线时才会记录圈数,我不知道比赛何时可能会或可能不会进行,或者车手何时越过终点线。因此,我一直在检查每一秒是否有新数据要记录。

可能正在进行比赛的每个场地都有一个单独的 URL,用于接收 JSON 数据。我添加到系统中以监控脚本运行速度越慢的场所越多。

我目前有 19 个场地,脚本大约需要 12 秒才能完成。因为我每分钟都在运行一个 cron 作业,并且每秒循环一次脚本。我假设我每秒至少运行 12 个脚本。对我来说,这似乎不是最有效的方法。当然,当我只检查一个单一的场地时,它就很有吸引力。

【问题讨论】:

  • 看看使用队列,每个worker处理一个API。
  • 诚然,我对 cron 队列的了解非常少,但是,如果 cron 任务正在等待另一个任务完成,那么肯定存在丢失数据的风险吗?
  • 我建议远离 cron 并使用像 rabbitmq、gearman、beantalked 这样的队列系统。与工人和经纪人有关的事情,您可以通过cron或其他方式为工人放置触发任务。
  • 哦,对不起,我完全想念你的建议!这听起来确实是一种更有效的方法。感谢您的回复。
  • 如果使用无限循环会怎样? while(true){ // pull from source } 。这样,当一个拉完成后,下一个就会来

标签: php mysql sql json cron


【解决方案1】:

您的操作有一个循环。是的。

  1. 通过阅读$starttime = time(); 的时间来开始您的流程。
  2. 将时间加上 60 秒来计算下一个计划时间。 $nexttime = $starttime + 60;
  3. 做你必须做的操作(阅读一堆 json 提要)
  4. 计算一分钟还剩多少时间$timeleft = $nexttime - time();
  5. 睡到下一个预定时间if ($timeleft > 0) sleep ($timeleft);
  6. 设置$starttime = $nexttime
  7. 跳回第 2 步。

很明显,如果 $timeleft 一直是负数,那么您的测量结果就跟不上。如果$timeleft总是否定的,你会越来越落后。

每分钟使用cron 可能是一种浪费,因为它需要资源来启动一个新进程并让它运行。您可能希望让您的进程永远运行,并使用一个 shell 脚本来监控它并在它崩溃时重新启动它。

这一切都很明显。不太明显的是,您应该在测量周期中每分钟跟踪您的个人$timeleft 值。如果它们每天都在变化,您应该跟踪一整天。如果它们每周变化,您应该跟踪一周。

那么您应该查看$timeleft 的最差(最小)值。如果您的第 95 个百分位小于大约 15 秒,则您的资源即将耗尽,您需要采取行动。您需要 15 秒的余量,这样您的系统才不会超载。

如果您的系统对数据的延迟采样零容忍,您应该查看$timeleft 的单个最差值,而不是第 95 个百分位数。你应该给自己一个比 15 秒更大的余量。

所谓的硬实时系统为每个操作分配一个时隙,如果操作超过时隙就会崩溃。在您的情况下,时隙为 60 秒,操作正在读取一定数量的提要。崩溃非常严重,但必须进行测量。

最简单的操作是开始运行多个工作进程。为每个过程提供一些提要。 php 运行单线程,因此多个进程可能会有所帮助,至少在你达到三个或四个之前。

然后您需要添加另一台计算机,并将您的提要分配给这些多台计算机上的工作进程。

解析 JSON 比 php 更快的语言环境可能会有所帮助,但前提是解析 JSON 所需的时间比等待它到达所需的时间更重要。

【讨论】:

  • 这是一篇很棒的文章。谢谢你。我已经遵循了一个与此非常相似的循环,但是你所说的加入了更多的点。我再看看能不能重构得更好。
猜你喜欢
  • 2012-03-26
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
相关资源
最近更新 更多