问题标签 [job-queue]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3314 浏览

node.js - 公牛队列:通过在 jobId 中使用部分时间戳确保时间段内的唯一作业

我需要确保添加到队列中的相同作业在一定时间内不会重复。

是否值得D/M/Y-HH:M在我的唯一jobId字符串中包含部分时间戳(即),所以它仅在不在同一分钟内处理?

12:01如果一个工作被添加到另一个位置,它仍然会重复12:09- 或者 Bull 有更好的方法来做到这一点?

0 投票
0 回答
21 浏览

php - 当并行处理的队列不多时,如何保持它的敏捷?

我有一个人们上传到我网站的照片的队列,因为在高峰时间可能会在一小时内上传 10,000 或更多张照片。

我的 php 脚本每分钟通过 cron 调用一次,并使用 where 子句从数据库中挑选照片FLOOR(photoId / 100) % $digit,其中$digit = $counter % 10;

因此,在第一分钟处理 ID 与 xxxx0xx 匹配的照片,然后处理 ID 为 xxxx1xx 和 xxxx2xx 的下一分钟照片,等等。我LIMIT 0, 1000查询并让它在我超时之前尝试做尽可能多的事情。

我有一个 6 核 HT xeon,通常让这些进程运行 6 分钟。

当我启动该过程时,我会运行它ionicenice如果服务器的 1 分钟平均负载高于 6,我将中止。如果没有,我会增加$counter并继续。

这似乎是完成大量工作的一个相当好的平衡,而不会过多地阻碍网站性能(一切都在同一个专用服务器上)。

我为什么要做FLOOR(photoId / 100)而不仅仅是photoId?好吧,人们上传了很多批量照片(即快速连拍),并且在网站上效果更好,因为这些照片都同时出现。这并不总是能做到这一点,但它会非常接近并且比仅仅改装要好得多photoId

当队列很忙并且有很多人在上传时,这非常有效。

但是在只有一位摄影师上传几十张照片的安静时间,他们可能会变得“不走运”,并且排队需要 10 分钟才能找到他们的身份证件来处理。

减轻这种情况的最佳方法是什么?到目前为止,我对排队的整个想法都是垃圾,我应该做些更好的事情吗?

而不是整个 % 技术,我可以只选择前 1000 个未标记为“正在处理”的 id。

然后我在数据库中将它们标记为“正在处理”,这样下一个过程就不会选择它们。尽可能多地做,然后取消标记其余的,以便可以再次选择它们。但是,如果队列中的人数少于 1000,那么接下来的 5 个进程将无法选择任何帮助,直到初始进程超时......

请提出建议!

谢谢

0 投票
1 回答
4678 浏览

rabbitmq - 为什么 celery 需要消息代理?

由于 celery 是一个作业队列/任务队列,名称说明它可以维护其任务并处理它们。那为什么它需要像rabbitmq或redis这样的消息代理呢?

0 投票
3 回答
11794 浏览

python - 如何在 Python-telegram-bot 中使用 Jobqueue

通过阅读文档,我可以很容易地制作一个机器人,但 Jobqueue 并没有按照它所写的那样工作。该run_daily方法使用datetime.time对象在特定时间发送消息,但此代码既不执行发送消息的工作,也不显示任何错误。它只是继续运行

0 投票
2 回答
535 浏览

perl - Mojolicious - minion worker 不会自动启动

我正在使用Mojolicious完整应用程序并加载Minion(后端 sqlite)。我的问题是为什么当我用hypnotoad启动 mojolicious 应用程序时,minion worker 不会自行启动。根据Minion文档,它应该:

后台工作进程通常使用命令 Minion::Command::minion::worker 启动,当应用程序加载 Mojolicious::Plugin::Minion 时该命令会自动可用。

环境:

  • 红帽企业 Linux 服务器 - 7.5 (迈坡)
  • Perl v5.16.3
  • Mojolicious 8.0(超级恶棍)
  • 小黄人 9.01

Mojolicious 完整的应用程序

这就是我启动服务器的方式:

/usr/local/bin/hypnotoad /var/www/apps/script/apps

目前,我在后台启动奴才工人(它也会在一段时间后被杀死,很明显),如下所示:

/var/www/apps/script/apps minion worker -m production

谢谢你。

0 投票
1 回答
200 浏览

amazon-web-services - 将长延迟队列从 beanstalkd 移动到 AWS

我现在正在将作业队列从本地 beanstalkd 服务器移动到 Amazon SQS。但问题是 SQS 只能有很短的延迟(15 分钟)。

在我的应用程序中,有数以千计的交易,当交易达到过期时间时,我使用 beanstalkd 使交易过期(即调用 api 将交易状态更新为已完成/失败)。

有什么服务/hacky方式可以用来处理这个用例吗?

谢谢

0 投票
1 回答
1155 浏览

java - spring boot中分布式任务调度和Job queue的建议

要求 :

在我的项目中(在分布式环境中运行),我们要求将作业安排在固定时间,初始延迟为 1 分钟,如果作业执行失败,它将重试,并且最多可以在 2 分钟内重试 10 次每个之间的延迟。

我们可以实现相同目标的工具:

我可以使用spring-retry. 但是,有多个容器可用(分布式环境)。Rabbit-MQAmazon-sqs、等工具Redis-quartz支持此功能。但我不确定哪个更适合springboot。

考虑因素:

以下是选择正确工具时需要考虑的事项:

分布式环境
一致性
容错
易于配置
异步处理

问题

基本上我正在寻找类似于 Resqueue 和 sidekiq ruby​​ 在 Java(springBoot)中的等效实现的东西。有没有人在他们的应用程序中实现了相同的功能?如果是这样,什么是更好的选择/方式提供的利弊。欢迎提出建议。

0 投票
2 回答
9198 浏览

node.js - 公牛队列未完成

我是 Bull 的新手。我尝试根据他们的文档代码运行 Bull。流程正在开始,但我的工作没有完成,或者不确定它是否触发了完成事件?我不确定在哪里犯了错误

在下面附上我的代码

我可以看到进度事件处理程序中的日志,但未触发完成事件。任何帮助表示赞赏

0 投票
9 回答
4115 浏览

design-patterns - 具有作业亲和性的作业队列

我目前面临一个问题,我很确定有一个官方名称,但我不知道在网上搜索什么。我希望如果我描述了我想到的问题和解决方案,有人能够告诉我设计模式的名称(如果有一个与我将要描述的匹配)。

基本上,我想要的是一个作业队列:我有多个创建作业的客户端(发布者),以及一些处理这些作业的工人(消费者)。现在我想将发布者创建的作业分发给各个消费者,这基本上可以使用几乎任何具有跨队列负载平衡的消息队列来实现,例如使用 RabbitMQ 甚至 MQTT 5。

然而,现在事情变得复杂了……每个工作都指向一个外部实体,比如说一个用户。我想要的是按顺序处理单个用户的作业,但并行处理多个用户。我没有要求用户 X 的工作总是交给工人 Y,因为无论如何它们都应该按顺序处理。

现在我可以使用 RabbitMQ 及其一致的哈希交换来解决这个问题,但是当新的工作人员进入集群时我会遇到数据竞争,因为 RabbitMQ 不支持重新定位已经在队列中的作业。

MQTT 5 也不支持这个:这里这个想法被称为“粘性共享订阅”,但这不是官方的。它可能是 MQTT 6 的一部分,也可能不是。谁知道。

我还查看了 NSQ、NATS 和其他一些经纪人。他们中的大多数甚至不支持这种非常具体的场景,而那些确实使用一致哈希的场景,其中存在前面提到的数据竞速问题。

现在,如果代理不将作业排序到队列中,一旦作业到达,问题就会消失,但是如果它会跟踪特定用户的作业是否已经被处理:如果是这样,它应该延迟所有其他作业此用户,但其他用户的所有作业仍应处理。这是,AFAICS,使用 RabbitMQ 等人是不可能的。

我很确定我不是唯一一个有这个用例的人。例如,我可以想到用户将视频上传到视频平台,虽然上传的视频是并行处理的,但单个用户上传的所有视频都是按顺序处理的。

所以,长话短说:我所描述的东西是否以一个通用名称而闻名?诸如分布式作业队列之类的东西?具有任务亲和性的任务调度程序?还是别的什么?我尝试了很多术语,但没有成功。这可能意味着没有解决方案,但正如所说,很难想象我是这个星球上唯一遇到这个问题的人。

有什么我可以寻找的想法吗?并且:是否有任何工具可以实现这一点?有什么协议吗?

PS:只使用预定义的路由键不是一个选项,因为用户 ID(我只是在这里作为一个虚构的例子)基本上是 UUID,所以可能有数十亿个,所以我需要更动态的东西。因此,一致的散列基本上是正确的方法,但如前所述,分布必须逐个工作,而不是预先进行,以避免数据竞争。

0 投票
0 回答
21 浏览

java - JobQueue 最多有 1 个 Job 或“如何使用最新数据重试”

我有一个要发送到 REST 服务器的 Observable。当连接失败时,我想永远重试发送。如果在连接失败期间,数据发生了变化,则应该发送新的数据。

我想我可以使用容量为 1 的 JobQueue 来实现这一点,并提供两种方法:forceEnqueue(Job job) 和 weakEnqueue(Job job)。现在,当连接失败时,作业可以尝试weakEnqueue() 本身。如果队列已满,则此操作失败。如果有新数据可用,则将其强制推入队列,从而消除可能已经入队的重试调用。

我无法使用 BlockingQueue 或 ConcurrentLinkedQueue 实现此行为。java中是否有一个线程安全的队列,可以支持这种要求,还是我试图以错误的方式解决这个问题?