jjzjj

php - 用于大规模任务调度的可扩展作业队列系统

coder 2024-04-08 原文

关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

1年前关闭。




Improve this question




场景:

TL; DR - 我需要一个队列系统来根据 future 的时间戳而不是插入的顺序来触发作业

我有一个条目的 MySQL 数据库,其中详细说明了需要执行的特定事件(主要包括一系列算术计算和数据库插入/更新),这些事件以基于时间戳的精确顺序排列。条目插入的时间与事件将“执行”的时间没有相关性,而是由外部因素决定的。该表还包含第二列毫秒,用于提高计时精度。

该表是作业“队列”的一部分,其中包含设置为在 future 几秒到几天之间执行的条目,并且每秒可能添加多达数千个条目。队列需要不断地解析(每秒?)——也许通过选择在这一秒内过期的所有时间戳并按毫秒排序,然后执行条目详细说明的每个事件。

问题

目前,后端完全用 PHP 编写在带有 MySQL(即标准 LAMP 架构)的 apache 服务器上。现在,我能想到的实现我所指定的唯一方法是编写一个自定义的 PHP 作业队列脚本来进行解析和执行,每秒使用 this method 循环一次。 .据我所知,没有其他作业系统可以根据指定的时间戳/毫秒而不是进入时间对作业进行排队。

然而,即使在纸面上,这种方法在 CPU 方面听起来也相当不可行——我必须每秒执行一次巨大的 MySQL 查询,并为检索到的每一行执行某种函数,它有可能运行超过一秒的执行时间,这将开始引入延迟到解析时间并弄乱循环脚本。

我当然试图创建一个解决方案,如果系统上的流量很大,该解决方案将是可扩展的,但该解决方案失败了,因为随着条目数量的增加,它将继续落后。

问题

我更愿意坚持标准的 LAMP 架构,但是有没有其他技术可以很好地集成到堆栈中,以便更好地处理我在这里尝试做的事情?

是否有另一种方法可以完全在指定的 future 日期准确触发事件,而无需对不断的队列检查进行困惑的摆弄?

如果以上选项都不适合,是否有更好的方法在后台循环 PHP 脚本?在最坏的情况下,我可以接受很长的执行时间并将任务分配给多个“ worker ”。

更新

RabbitMQ 是一个很好的建议,但不幸的是,它不会在任务“到期”后立即执行——它必须首先通过队列并等待前面尚未到期的任何任务。到期时间在几秒到几天之间的范围很广,每次添加新事件时都需要以某种方式对队列进行排序,因此到期时间在队列中始终是有序的。据我所知,这在 RabbitMQ 中是不可能的,而且听起来效率也不高。是否有替代方案或程序性修复?

最佳答案

有时,使方钉适合圆孔需要花费太多精力。虽然使用 MySQL 创建队列可能很有效,但扩展起来要困难得多。我建议这可能是 RabbitMQ 的机会.

基本上,您将设置一个消息队列,您可以将事件放入其中。然后,您将拥有一个“扇出”架构,您的工作人员处理每个队列。每个工作人员都会监听队列并检查是否需要处理特定事件。我想象的是 "Work Queues" 的组合和 "Routing" Rabbit 中可用的技术将以可扩展且可靠的方式实现您的需求。

我会设想一个系统,它的工作原理是这样的:

  • 产生工作人员来监听队列,使用路由键来修剪他们收到的消息数量
  • 每个工作人员检查消息以查看是否要立即执行
  • 如果要执行该消息,则执行它并确认——否则,重新调度该消息以供将来处理。有一些simple techniques可用于此。

  • 随着您需要更大的规模,您可以添加更多的 worker 。当您最终关闭队列服务器时,RabbitMQ 非常健壮且易于集群。还有其他基于云的排队系统,例如Iron.IOStormMQ

    关于php - 用于大规模任务调度的可扩展作业队列系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22786074/

    有关php - 用于大规模任务调度的可扩展作业队列系统的更多相关文章

    1. ruby - 其他文件中的 Rake 任务 - 2

      我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

    2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

      大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

    3. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

      我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

    4. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

      如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

    5. Ruby Sinatra 配置用于生产和开发 - 2

      我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

    6. ruby - inverse_of 是否适用于 has_many? - 2

      当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

    7. c - mkmf 在编译 C 扩展时忽略子文件夹中的文件 - 2

      我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。

    8. ruby-on-rails - Rake 任务仅调用一次时执行两次 - 2

      我写了一个非常简单的rake任务来尝试找到这个问题的根源。namespace:foodotaskbar::environmentdoputs'RUNNING'endend当在控制台中执行rakefoo:bar时,输出为:RUNNINGRUNNING当我执行任何rake任务时会发生这种情况。有没有人遇到过这样的事情?编辑上面的rake任务就是写在那个.rake文件中的所有内容。这是当前正在使用的Rakefile。requireFile.expand_path('../config/application',__FILE__)OurApp::Application.load_tasks这里

    9. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

      我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

    10. ruby-on-rails - 在所有延迟的作业之前 Hook - 2

      是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述

    随机推荐