关于
h工作人员
是一个Redis支持的至少一次持久队列库。它隐约受到启发侧基(sidekiq)
对于Ruby。它旨在成为用于处理后台任务的简单可靠机制。工作可以由Haskell应用程序或任何可以将正确形状的JSON数据结构推送到Redis队列中。这个处理作业的应用程序不必与创建它们的应用程序(它们只需要能够与相同的Redis服务器,并使用相同的JSON序列化)。
稳定性
这已经在一个发送电子邮件的应用程序中运行(使用工作人员-
)几个月了。这是相对较低的流量(事务消息)大多数情况下,峰值为10k-30k消息(邮件爆炸)。
重要注意事项
工作到期真的很重要。默认为120秒,可能很短,这取决于您的应用程序(对于就像发送电子邮件一样,这可能很好)。此超时的原因是重要的是,如果作业运行时间超过此值,监视器会认为工作失败了以某种无法解释的方式(比如运行作业的服务器死亡),并将作业添加回队列运行。基于此作业处理器的语义,作业正在运行多次不是失败案例,但显然不是什么你希望所以一定要设置超时对您的应用程序来说是合理的。
概述
要定义作业,您需要定义作业的序列化表示,以及运行作业的函数,返回状态。的行为未捕获异常是在创建worker时定义的,可以是任何一个失败
或重试
.返回的作业失败
已删除从队列中,而返回的作业重试
再次添加。这个之间的唯一差异成功
和a失败
那是一个失败
返回已记录的消息(即既不再次运行)。
例子
请参阅例子
存储库中的目录。
语义学
此队列处理器的此行为是连续的。
我们依赖Redis的定义行为来实现可靠性。工作一次已经是队列
d、 它保证最终运行,前提是存在一些工作线程和监视器线程。如果工作线程运行给定作业失败,作业最终将被重试(如果您不希望出现这种行为,请不要启动任何监视器线程)。一旦作业完成,前提是没有任何东西会杀死干预时间、返回的作业成功
将不再运行,返回的作业失败
将记录他们的消息,并将不再运行,返回的作业重试
将排队再一次。如果在此之前有什么东西杀死了工作线程确认通过后,将重试作业。例外情况在作业内触发不会影响工作线程作业的do在启动时定义(它们可以导致失败
或重试
).
任何与此行为的偏差都被视为将被修复的错误。
Redis操作
在引擎盖下,我们将在redis中具有以下数据结构(名称
在创建h工作人员
实例):
hworker-作业-名称
:json序列化作业描述列表
hworker产品名称
:正在进行的作业的哈希,映射到开始时间
h工作-中断-名称
:到时间为止无法反序列化的作业的哈希;很可能意味着您更改了序列化格式,而作业仍在队列中,或您将不同的应用程序指向同一队列。
hworker失败队列
:失败作业的记录(根据配置限制大小)。
在下面的伪代码中,我使用多种
...执行委员会
表示原子代码块。这些实际上是通过lua和EVAL公司
,但我认为这样读比较容易。如果你想看实际发生了什么,只需阅读代码-它不太长!
当工人想要工作时,会发生以下情况:
now=时间多种v=RPOP员工-作业-名称如果vHSET hworker-progress-name v now公司执行委员会五
完成作业后,它会执行以下操作:
v=作业HDEL hwork-progress v公司
如果作业返回重试
,发生以下情况:
v=作业t=启动时间多种LPUSH工作-作业vHDEL h工作进度t执行委员会
监视器运行在另一个线程上,该线程将重新运行保留在中的作业进展太久(因为这表明发生了未知的事情错误)。它定期运行的操作是:
keys=HKEYS(或HSCAN)hwork-progress对于v键:启动=HGET hwork-progress v如果启动<TIME-超时多RPUSH工时作业vHDEL hwork-progress v公司执行委员会
注意监视器的功能和重试
略有不同-监视器将作业放在队列的前面,而重试
放它们在后面。
使用的主库
贡献者
生成状态