在 Google App Engine 上使用任务队列时如何确定任务的优先级?

2024-03-10

我正在尝试解决以下问题:

  1. 我有一系列想要执行的“任务”
  2. 我有固定数量的工作人员来执行这些工作人员(因为它们使用 urlfetch 调用外部 API,并且对此 API 的并行调用数量有限)
  3. 我希望这些“任务”能够“尽快”执行(即最小延迟)
  4. 这些任务是较大任务的一部分,可以根据原始任务的大小进行分类(即,小型原始任务可能生成 1 到 100 个任务,中型任务可能生成 100 到 1000 个任务,大型​​任务可能生成超过 1000 个任务)。

棘手的部分:我想高效地完成所有这些(即最小延迟并使用尽可能多的并行 API 调用 - 不超过限制),但同时尝试防止从“生成大量任务” “大”原始任务延迟“小”原始任务生成的任务。

换句话说:我希望为每个任务分配一个“优先级”,其中“小”任务具有更高的优先级,从而防止“大”任务导致饥饿。

一些搜索似乎并没有表明任何预制的东西可用,所以我想出了以下内容:

  • 创建三个推送队列:tasks-small, tasks-medium, tasks-large
  • 为每个请求设置最大并发请求数,使总数达到并发 API 调用的最大数量(例如,如果并发 API 调用的最大数量为 200,我可以设置tasks-small有一个max_concurrent_requests of 30, tasks-medium 60 and tasks-large 100)
  • 排队任务时,检查编号。每个队列中待处理的任务(使用类似 QueueStatistics 类的东西),并且,如果其他队列未 100% 使用,则将任务排入其中,否则只需将任务排入具有相应大小的队列中。

例如,如果我们有任务T1这是一个小任务的一部分,首先检查是否tasks-small有空闲的“槽”并将其排在那里。否则检查tasks-medium and tasks-large。如果它们都没有空闲插槽,则将其排队tasks-small无论如何,它将在处理之前添加的任务之后进行处理(注意:这不是最佳选择,因为如果“槽”在其他队列上释放,它们仍然不会处理来自tasks-small queue)

另一种选择是使用 PULL 队列,并让一个中央“协调器”根据优先级从该队列中拉取并分派它们,但这似乎会增加一点延迟。

然而,这似乎有点黑客,我想知道是否有更好的替代方案。


编辑:经过一些想法和反馈后,我正在考虑通过以下方式使用 PULL 队列:

  • 有两个 PULL 队列(medium-tasks and large-tasks)
  • have a dispatcher (PUSH) queue with a concurrency of 1 (so that only one dispatch task runs at any time). Dispatch tasks are created in multiple ways:
    • 通过每分钟一次的 cron 作业
    • 将中型/大型任务添加到推送队列后
    • 工作任务完成后
  • 有一个并发量等于工作人员数量的工作人员(PUSH)队列

以及工作流程:

  • 小任务直接添加到工作队列中
  • the dispatcher task, whenever it is triggered, does the following:
    • 估计空闲工作人员的数量(通过查看工作人员队列中正在运行的任务数量)
    • 对于任何“空闲”槽,它会从中/大型任务 PULL 队列中获取一个任务,并将其放入工作线程中(或者更准确地说:将其添加到工作线程 PUSH 队列中,这将导致它最终在工作线程上执行) 。

一旦实施并至少经过适度测试,我会报告。


小/中/大原始任务队列本身不会有太大帮助 - 一旦原始任务排队,它们将继续生成工作任务,甚至可能突破工作任务队列大小限制。因此,您需要调整/控制原始任务的排队速度。

我会跟踪数据存储/GCS 中的“todo”原始任务并将这些原始任务排入队列仅当相应的队列大小足够低时(1 个或可能 2 个待处理作业),来自循环任务、cron 作业或延迟任务(取决于您需要执行原始任务排队的速率),这将像推送队列调度程序一样实现所需的节奏和优先级逻辑,但无需额外的你提到的延迟。

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

在 Google App Engine 上使用任务队列时如何确定任务的优先级? 的相关文章

随机推荐

  • C# 中的 N 体模拟

    我正在尝试使用 Runge Kutta 4 或 Velocity Verlet 集成算法在 C 中实现 N 体模拟 在我转向更多数量的粒子之前 我想通过模拟地球绕太阳的轨道来测试模拟 但是 由于某种原因 我得到的不是椭圆轨道 而是一个奇怪的
  • 从 C# NUnit 在多个浏览器中依次运行 Selenium 测试

    我正在寻找推荐 最好的方法来使 Selenium 测试在多个浏览器中相继执行 我正在测试的网站不大 所以我还不需要并行解决方案 我有常用的测试设置方法 SetUp TearDown and Test 当然 SetUp 会实例化一个新的ISe
  • 使用 GeoFire 按半径查询位置

    我知道这是一个基本问题 但我仍然遇到很多麻烦 我有一个 Firebase 数据库存储社区事件 每个事件节点都有一个地理位置节点 使用 GeoFire 创建 称为活动地点 见下面的截图 使用 GeoFire 和 javascript 我将如何
  • 如何在图像上绘画并将该图像保存到 Android 中?

    我是画布新手 我想使用我已保存的图像并希望在该图像上进行一些绘制 之后我想保存它 我知道使用 Canvas 这是可能的 我可以在图像上绘画 但是当我要存储该图像时 它只保存了绘画 不是绘画的图像 那么有人可以告诉我如何在图像上绘画并保存该图
  • android ndk-构建错误

    我正在尝试为 Android 构建 tesseract 我已将 tesseract 放入示例文件夹中 C Android NDK android ndk r8 samples tesseract之内tesseract我有的文件夹tesser
  • CSS 网格并指定多个区域

    我需要一些元素重叠 我还想通过区域名称而不是行 列来指定内容 因为这样可以更好地阅读 我一生都无法理解如何按照 MDN 示例指定多个网格区域 或者 如果它甚至可能 文章建议它根据语法示例是可能的 但它实际上是如何工作的 没有任何线索 问题示
  • 解决多源多汇流网络的最优方式

    为了简单起见 假设我们有以下问题 我们正在为城市中的自动驾驶汽车编写 GPS 我们假设运行我们软件的汽车是路上唯一的汽车 他们将城市的布局表示为一个流网络 但流网络有多个起点 终点 因此存在多个不一定彼此靠近的源 汇 有没有有效的解决方案来
  • 如何覆盖 node.js http 以对所有出站请求使用代理

    我最近创建了一个 node js 应用程序 可以访问社交媒体网站并缓存我们的公共源 我正在使用一些现有的 npm 模块来方便访问社交媒体 api 它在我的开发环境中就像一个魅力 但在我们的生产环境中 请求超时 因为它们需要通过代理 无需修改
  • 构造函数参数的所有组合

    很可能是一个愚蠢的问题 但无论如何 是否有一种简短的方法来声明采用任意参数组合的构造函数 例如 具有 3 个参数的 ctor 有 2 3 种可能的组合 如下面的模型所示 template
  • 将正则表达式中的文本更改为大写

    我有个问题 如何将 HTML 标签 之间的文本更改为大写字母 部分代码 string a b hello world b table test table a Regex Replace a lt n gt String Empty 现在
  • Android项目包结构

    我想知道如何为 Android 应用程序创建灵活的包结构 以便于扩展和管理 我的第一个想法是将每个应用程序组件放在单独的包中 例如 spk myapp main 主要活动中使用的所有类 spk myapp processor 处理器提供程序
  • Objective C - 获取方法的参数类型?

    在运行时我需要能够获取方法的参数类型 以下是打印的内容 我在其他线程上读到 在运行时 Objective C 将传递给方法的所有对象视为参数id 如果这种方法不起作用 那么关于读取参数类型的方法还有其他建议吗 Log 2014 02 07
  • 什么叫会话存储?

    Web 应用程序 网站上下文中的会话存储是什么 它不仅仅是会话变量的临时存储吗 通常 用户对站点的第一个请求会建立一个会话 会话有一个密钥 该密钥作为 cookie 传递给用户 以便每个后续请求都会检索到相同的会话 会话存储可以存储您不希望
  • 在 HTML 和 Javascript 中的图像顶部“绘制”

    我正在构建一个网络应用程序 用户可以通过用光标在图像上 绘图 来标记图像 我们将获取用户的绘图并将其发送到服务器以转换为 PNG 或其他格式进行存储 我们需要这个应用程序能够在基于桌面和平板电脑的浏览器上运行 因此 Flash Java 和
  • 在C中检查大量数据是否为空的最快方法? [复制]

    这个问题在这里已经有答案了 我有大量数据 可能有 4MB 现在想要检查其中的所有位是否都为 0 例如 这是数据 void data malloc 4 1024 1024 memset data 0 4 1024 1024 检查其中的所有位是
  • 是否可以访问App Bundle的en.lproj?

    我希望能够更改语言目录中的语言文件 例如 假设我有日语更新 那么我可以让应用程序从 FTP 站点获取 localized strings 文件 然后写入 jp lproj 目录 另一个例子是将新语言上传到应用程序 我的应用程序将再次从 FT
  • Postgres 的 php pdo:“找不到驱动程序”

    我在新的 Ubuntu 18 04 服务器上为 Postgres 安装了 php 但我遇到了 php 问题 以下是我的 php 7 3 安装步骤 sudo apt install software properties common sud
  • PHP + PhantomJS 光栅化

    我在 PHP 应用程序中使用 PhantomJS 64 位来动态捕获要通过电子邮件发送给用户的 HTML 页面 phantomjs rasterize js http path to images image png 当我在命令行上运行上述
  • 查找 Maven 依赖项对象的依赖项

    我正在编写一个 Maven 3 插件 它需要知道给定的传递依赖项org apache maven model Dependency 我怎样才能做到这一点 在 Maven 3 中 您可以通过依赖于基于树的形式访问所有依赖项maven depe
  • 在 Google App Engine 上使用任务队列时如何确定任务的优先级?

    我正在尝试解决以下问题 我有一系列想要执行的 任务 我有固定数量的工作人员来执行这些工作人员 因为它们使用 urlfetch 调用外部 API 并且对此 API 的并行调用数量有限 我希望这些 任务 能够 尽快 执行 即最小延迟 这些任务是