gpt4 book ai didi

java - redis pub sub 和/或列表来实现数据收集器

转载 作者:可可西里 更新时间:2023-11-01 11:19:59 24 4
gpt4 key购买 nike

我正在开发一个需要按计划从第三方系统收集数据的模块,比如每 5 分钟一次。

启动数据收集的触发器来自 Multi-Tenancy UI。因此,10 个租户可以告诉该模块同时开始收集数据。

我从使用一个简单的 redis 队列开始,所有来自 UI 的启动请求都被发送到队列中,该模块充当工作人员,获取作业并运行它们。

问题是我们需要在 1 分钟内完成一个数据收集周期,如果有 100 个作业,如果我们连续进行,我们将花费一分钟多的时间。数据收集需要按计划进行。所以 UI 说每 5 分钟运行一次数据收集,直到我说停止!

因此,我们添加了另一个可以开始减轻负载的工作器。

我的问题是:如何在不在其中一个工作人员中保持状态(预定线程执行程序)的情况下实现常规计划?

我是不是想太多了,可以用更简单的方法来完成吗?

我现在的设计有一种 cron 作业,每 1 分钟从数据库中读取一次数据收集请求,然后将它们放入工作人员接收请求的队列中。

最佳答案

使用 beanstalkd在这种情况下,可能是比使用 Redis 更好的选择。

Beanstalkd 与 Redis 有很多共同点:易于部署、简单、轻便、快速、默认在内存中、通过简单的文本协议(protocol)进行通信,很多 clients in various languages ...但它专用于任务管理,它不是数据库。您可以动态地添加或删除工作人员,而无需在 beanstalkd 端进行任何配置。

您将作业放入“管”(队列的 beanstalkd 名称),然后工作人员可以保留它们——一次一个。一旦它保留了一个工作,一个 worker 就有完成它的最大时间(称为 TTR — 运行时间),否则该工作将被 beanstalkd 释放,重新放入管中,因此可能由另一个 worker 处理。

作业只是一个字符串;例如,它可以是描述要执行的任务的序列化 Json。

如果我对你的问题的理解是正确的,UI 租户可以创建具有正常优先级的作业来开始数据收集,并将它们放入一个独特的管中。一个或几个 worker 将从这个管中“保留”(获取)一个作业,处理它,删除它以通知 beanstalkd 它已经完成,然后保留另一个作业,等等。


保留删除
-----> [就绪] --------> [保留] --------> *噗*

(此模式的来源:beanstalkd 的协议(protocol)文档)

对于一个没有任何调度器每5分钟重复处理的作业,你可以说每次一个worker消费一个作业,它创建一个新的,并在将它放入时使用beanstalkd的“put with delay”特性 pipe 。因此,只有在延迟到期时(在您的情况下为 5 分钟),工作才会呈现给工作人员。

当 UI 想要取消剩余的作业时,它可以从管中挑选并删除所有作业。或者,如果您希望工作人员删除它们,则 UI 可以将优先级高于数据收集作业的取消作业(将其视为消息)放入管中。您也可以使用另一个电子管,假设您是在另一个线程而不是专门用于数据收集的线程中收听它。

我对你的问题的了解和理解显然是有限的,但你当然可以提炼这些想法来解决你的确切问题。

关于java - redis pub sub 和/或列表来实现数据收集器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39748609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com