Play 框架 2.x 应用程序中作业/任务的调度/延迟

2023-12-28

在典型的 Web 应用程序中,有些事情我更愿意作为延迟的作业/任务来运行。它们往往具有以下部分或全部属性:

  • 需要很长时间(从几秒到几分钟到几个小时)。
  • 大量占用部分资源(CPU、网络、磁盘、外部API限制等)
  • 结果不是立即需要的。没有它也能完成HTTP响应。可以(甚至可能更好)推迟到晚些时候。
  • 可以(并且可能更愿意)在与 Web 服务器不同的机器上运行。这些机器可能是专用的作业/任务运行者。
  • 应运行以响应其他事件,或定期启动。

在 Scala + Play Framework 2.x 应用程序中设置、排队、安排和运行延迟作业/任务的首选方式是什么?

更多细节...

我过去使用过的模式(如果适用的话我想复制它)是:

  • 在 Web 请求的处理程序中,或在类似 cron 的调用中,将作业排队
  • 在作业运行程序中,一次重复出列并运行一项作业
  • 可能处理记录作业结果

这似乎是一个相对简单但仍然相对灵活的模式。

我过去遇到过的例子包括:

  • 更新数据库中的派生数据
  • 针对 Web 请求的分析/跟踪 API 调用
  • 删除过期的会话或其他陈旧/过时的数据库记录
  • 定期批量 ETL

在其他语言/框架中,我通常会使用作业/任务框架。示例包括:

  • Ruby + Rails 应用程序中的 Resque
  • Python + Django 应用程序中的 Celery

我找到了以下现有材料,但不幸的是,我认为它们不直接适合我的用例。

  • Play 1.x 异步作业 API https://www.playframework.com/documentation/1.2.3/jobs(+引用它的各种SO问题)。似乎已在 2.x 行中删除。没有提及替代它的内容。
  • 玩 2.x Akka 集成 https://www.playframework.com/documentation/2.0.4/ScalaAkka。看起来非常通用。我想可以使用 Akka 来实现上述目的,但如果已经存在,我不想编写作业/任务框架。此外,没有关于如何将作业运行器计算机与 Web 服务器分开的信息。
  • 这个答案 https://stackoverflow.com/a/15123249/904117。似乎对于“短到中等持续时间 IO 限制”的情况有潜在的希望,例如分析调用,但不一定适用于“CPU 限制”情况(可能不应该占用 Web 服务器上的 CPU,更喜欢发送到不同的节点)、“大量网络”情况或“多个小时”情况(可能不应该将其留在网络服务器的后台,即使它没有消耗太多资源)。
  • 这个问题以及相关问题 https://stackoverflow.com/q/9339714/904117。与上面类似,在我看来,这仅涵盖适合在同一 Web 服务器上运行的情况。

关于用例的一些进一步说明(根据评论者的要求)。我在 resque 或 celery 等方面经历过两个主要用例,我试图在这里复制它们:

  • 网站上的某些事件(大多数情况下,传入的 Web 请求会导致任务排队。)
  • 任务应该定期运行。 (大多数情况下,这被实现为:定期将要运行的任务排入队列,如上所述。)

在 resque 或 celery 的情况下,两个用例排队的任务以相同的方式进入队列,并由运行程序/工作进程以相同的方式处理。排除其他 Scala 或 Play 特定的考虑因素,这将是我对如何解决这个问题的初步猜测。

关于为什么我不相信 Akka 调度程序适合我开箱即用的用例的一些进一步说明(根据评论者的要求):

虽然毫无疑问可以使用 Akka 调度程序(用于定期作业)、akka-remote 和 akka-cluster(用于作业调用者和作业运行者之间的通信)的某种组合来构建合适的解决方案,但该方法需要一定的资源粘合代码本身几乎就是一个延迟作业框架。如果存在,我更愿意使用现有的开箱即用的解决方案,而不是重新发明轮子。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Play 框架 2.x 应用程序中作业/任务的调度/延迟 的相关文章

  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • Spark:如何使用crossJoin

    我有两个数据框 df1有 100000 行并且df2有 10000 行 我想创建一个df3这是两者的交叉连接 val df3 df1 crossJoin df2 这将产生 10 亿行 尝试在本地运行它 但似乎需要很长时间 您认为本地可以实现
  • Play框架:单属性案例类的JSON读取

    我正在尝试为包含单个属性的案例类创建隐式 JSON Reads 但收到错误 Reads Nothing 不符合预期类型 这是代码 import play api libs functional syntax import play api
  • Scala:什么是 CompactBuffer?

    我试图弄清楚 CompactBuffer 的含义 和迭代器一样吗 请解释其中的差异 根据 Spark 的文档 它是 ArrayBuffer 的替代方案 可以提供更好的性能 因为它分配的内存更少 以下是 CompactBuffer 类文档的摘
  • 如何在映射中将字符串转换为 Seq[String]

    我有一个Map String String 以及需要的第三方功能Map String Seq String 有没有一种简单的方法来转换它 以便我可以将地图传递给函数 original mapValues Seq 注意mapValues返回地
  • Slick和bonecp:org.postgresql.util.PSQLException:FATAL:抱歉,太多客户端已经错误

    当我在本地开发应用程序时 我使用以下命令启动我的 play2 应用程序sbt run 我喜欢如何更改代码 然后重新加载浏览器以查看我的更改 在大约 10 次代码更改之后 我收到 postgresql 太多连接错误 见下文 我的数据库连接使用
  • Scala Spark 包含与不包含

    我可以使用 contains 过滤 RDD 中的元组 如下所示 但是使用 不包含 来过滤 RDD 又如何呢 val rdd2 rdd1 filter x gt x 1 contains 我找不到这个的语法 假设这是可能的并且我没有使用Dat
  • 在 Spark 结构化流 2.3.0 中连接两个流时,左外连接不发出空值

    两个流上的左外连接不发出空输出 它只是等待记录添加到另一个流中 使用套接字流来测试这一点 在我们的例子中 我们想要发出具有 null 值的记录 这些记录与 id 不匹配或 且不属于时间范围条件 水印和间隔的详细信息如下 val ds1Map
  • 如何执行仅匹配正则表达式的测试?

    在 sbt 0 10 1 中 我经常使用test only缩小我的测试数量 sbt gt test only com example MySpec 但是 我想缩小范围 以便只运行名称 描述与正则表达式匹配的测试 是否有一些语法可以实现这样的
  • IntelliJ IDEA 不会从 SBT 项目加载 Lift 库

    我通过创建了一个空白项目sbt使用最基本的指南 具体来说 gt cd xyz gt sbt here we create a new project w Scala 2 8 1 gt lift is org lifty lifty 1 6
  • 在spark-kafka中使用schema将ConsumerRecord值转换为Dataframe

    我正在使用 Spark 2 0 2 和 Kafka 0 11 0 并且 我正在尝试在火花流中使用来自卡夫卡的消息 以下是代码 val topics notes val kafkaParams Map String Object bootst
  • 使用 Akka 1.3 的 actor 时,我需要注意生产者-消费者速率匹配吗?

    使用 Akka 1 3 时 我是否需要担心当生成消息的 Actor 生成消息的速度比使用消息的 Actor 的处理速度快时会发生什么 如果没有任何机制 在长时间运行的进程中 队列大小将增大以消耗所有可用内存 The doc http doc
  • Scala 中的随机列表[重复]

    这个问题在这里已经有答案了 我对 scala 中的随机播放列表有疑问 使用scala util Random 例如我有 val a cyan val b magenta val c yellow val d key val color Ra
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • 在没有匹配器的情况下如何跳过specs2中的测试?

    我正在尝试使用 scala 中的 specs2 测试一些与数据库相关的内容 目标是测试 db running 然后执行测试 我发现如果数据库关闭 我可以使用 Matcher 类中的 orSkip 问题是 我正在获取一个匹配条件的输出 作为
  • 实现只有一个居民的类型的价值

    感谢 MilesSabin 的answer https stackoverflow com a 32157259 867671我可以编写类型级别的斐波那契序列 sealed trait Digit case object Zero exte
  • 如何使用 Scala 从 Spark 更新 ORC Hive 表

    我想更新 orc 格式的 hive 表 我可以从 ambari hive 视图进行更新 但无法从 sacla spark shell 运行相同的更新语句 objHiveContext sql select from table name 能
  • 将下划线分配给变量。下划线是做什么的?

    最近我遇到了这样的代码 var myVariable variableKind 这似乎是一种分配方式null to myVariable 谁能解释一下背后的理由 在这种情况下 分配之间有什么区别 and null到一个变量 它使用默认值初始
  • 在浏览器中点击应用程序时播放框架挂起

    我正在 Play 中运行一个应用程序activator run 也许 5 次中有 3 次 它会挂起 当我去http localhost 9000 它就永远坐在那里旋转 我看到很多promise timed out错误也 我应该去哪里寻找这个
  • 数量重新分配逻辑 - 具有外部数据集的 MapGroups

    我正在研究一种复杂的逻辑 需要将数量从一个数据集重新分配到另一个数据集 在例子中我们有Owner and Invoice 我们需要从数量中减去Invoice准确地Owner匹配 在给定汽车的给定邮政编码处 减去的数量需要重新分配回同一辆车出

随机推荐

  • 如何使用反射调用java中的方法

    如何使用反射调用带参数的方法 我想指定这些参数的值 下面是使用涉及原语的反射来调用方法的简单示例 import java lang reflect public class ReflectionExample public int test
  • Android Smack 聊天客户端

    嗨 朋友们 我正在使用从以下网址下载的 Smack3 2 1 jar http www igniterealtime org downloads index jsp http www igniterealtime org downloads
  • 如何在 terraform 中使用嵌套循环

    我正在尝试使用 Terraform count 在 Azure 中创建 3 个虚拟机 每个虚拟机需要多个磁盘 有什么办法可以做到这一点吗 我尝试创建磁盘名称和大小的映射 但收到错误 无法同时使用 count 和 for each resou
  • Pickle Spark RDD 并将其读入 Python

    我正在尝试通过 pickle 来序列化 Spark RDD 并将 pickled 文件直接读入 Python a sc parallelize 1 2 3 4 5 a saveAsPickleFile test pkl 然后 我将 test
  • 类构造函数中选项对象的默认值

    我创建了一个类 我想为值设置一些默认选项 以防用户不提供任何参数 我最近使用了一个将多个参数传递给一个对象的构造函数 因为我相信当用户创建该类的新实例时 它有助于提高可读性 这是我之前的做法 module exports class Use
  • 根据 codeigniter 中的用户角色重定向到管理员和用户

    如果管理员正在登录 我希望他进入管理 仪表板 否则到用户仪表板 登录控制器如下 在用户表中 我有一列 角色 值为 1 和 2 1 代表管理员 2 代表用户 并且有单独的角色表 登录用户功能 public function login dat
  • 我可以将 MongoDB 配置为内存吗?

    我有兴趣使用一个能够实现高性能的数据库 并且预期需要集群进行大规模水平扩展 我们正在考虑使用 MongoDB 有谁知道我是否可以在内存中使用它 即在 RAM 中 出于性能原因 Tnx 截至今天 最新版本的 MongoDB 即 v3 4 在其
  • 使用OpenCV的Sobel运算计算图像梯度方向

    我正在尝试使用 OpenCV 的 Sobel 方法的结果来确定图像梯度方向 我知道这应该是一个非常简单的任务 我想我理解这个理论 但实现它比我想象的更具挑战性 我希望渐变方向在 0 360 度之间 但我的代码显示所有渐变都在 180 270
  • 如何从离开网站警报中获取文本?

    如何从离开网站警报中获取文本 我尝试使用切换到它driver switchTo alert 但我收到空白文本 I have also attached screenshot of alert 请在这方面帮助我 下面是我的代码 public
  • 既然 BluetoothAdapter.getDefaultAdapter() 已被弃用,我该使用什么?

    How do I fix the deprecation warning in this code Alternatively are there any other options for doing this val mBluetoot
  • Power BI:计算无法正常工作

    我有一个包含资源名称 资源所有者 项目名称 项目经理 工作量的表 对于每个资源所有者 我想计算借出的工作量 所有者的资源在除所有者项目之外的项目中花费的工作量 和借用的工作量 所有者的资源在除项目所有者之外的其他项目中花费的工作量 For
  • 从 Groovy 中的字符串中删除空格

    我有一个像这样的字符串 String str My name is Monda 我怎样才能实现像这样的字符串 str MynameisMonda 您可以使用replaceAll http docs groovy lang org lates
  • UITableView,如何捕捉动画结束?

    我有一个包含很多行的 UITableView 它就像一个手风琴 http docs jquery com UI Accordion http docs jquery com UI Accordion主单元有子单元 子单元也有子单元 所以这是
  • 使正则表达式准确匹配点文件

    所以我已经达到了我的正则表达式能力的极限 我这里有一个 python 正则表达式 用于将文件路径或文件 uri 与各个部分的命名捕获组相匹配 它似乎是工作文件 除了点文件 MATCH PATH re compile r P
  • 为什么 getNetworkOperator 对于 CDMA 不可靠?

    谁能说出为什么文档getNetworkOperator的函数TelephonyManager指出这可能会返回 CDMA 不可靠的结果 获取网络操作员文档 http developer android com reference androi
  • 如何检测视图元素何时在 Angular 中渲染?

    我的设置是一个带有可单击行的 Angular Material 数据表 单击一行时 其内容会内联显示在textarea进行编辑 我唯一的问题是 我尝试将输入焦点移动到显示的textarea 我尝试使用 ViewChild 但稍后会在单击处理
  • 删除分片分配过滤器

    我设置了一个分片分配过滤器 例如 PUT cluster settings transient cluster routing allocation exclude name node 1 如何删除或禁用此类设置 我尝试使用包含 但随后我设
  • 单元测试 Spring MissingServletRequestParameterException JSON 响应

    我在 Spring boot 休息控制器中有 POST 方法 如下所示 RequestMapping value post action bookmark method RequestMethod POST public ResponseB
  • 返回自定义验证器错误 Grails

    我只收到默认验证器消息 我究竟做错了什么 class Questao static hasMany alternativas Alternativa static constraints alternativas validator val
  • Play 框架 2.x 应用程序中作业/任务的调度/延迟

    在典型的 Web 应用程序中 有些事情我更愿意作为延迟的作业 任务来运行 它们往往具有以下部分或全部属性 需要很长时间 从几秒到几分钟到几个小时 大量占用部分资源 CPU 网络 磁盘 外部API限制等 结果不是立即需要的 没有它也能完成HT