Laravel 排队事件侦听器与作业之间的区别

Posted

技术标签:

【中文标题】Laravel 排队事件侦听器与作业之间的区别【英文标题】:Difference between Laravel queued event listeners vs jobs 【发布时间】:2017-08-07 07:37:41 【问题描述】:

我正试图围绕 Laravel 的 queued event listener 与 jobs 进行比较。

在我看来,两者都非常相似:

    两者都实现了ShouldQueue接口(对于事件监听器,这是一个选项) 两者都实现了handle()failed()(可选)方法来执行各自的任务。

本质上,对我来说,两者都是可以异步运行的排队项。

到目前为止,我能够区分的是,作业具有更多“高级” 功能/配置,例如 $timeout$tries 属性,您还可以延迟作业的“触发器” (由Illuminate\Bus\Queueable 特性提供)。

我确定还有更多,但我指出的是突然出现在我面前的那个。

所以,问题是,两者之间的实际区别是什么,更重要的是,你什么时候更喜欢其中一个?

【问题讨论】:

【参考方案1】:

好问题,我将从 laravel 文档如何解释它开始

Events :Laravel 的事件提供了一个简单的observer 实现,允许您订阅和监听应用程序中发生的各种事件。事件是解耦应用程序各个方面的好方法,因为单个事件可以有多个互不依赖的侦听器。

在哪里

作业:作业类非常简单,通常只包含一个句柄方法,该方法在作业被队列处理时调用。

基本上两者都将作业推送到队列和/或进行一些处理其要求做的事情,我要说的主要区别是它们的调用方式。

事件正在被调用,因为乔布斯总是被明确调用

事件的力量在于我们可以为单个事件注册多个侦听器,并且事件助手会将事件分派给所有已注册的听众,而不需要我们明确地称呼他们。在乔布斯的情况下,我们必须明确地称呼它们。

简而言之,如果您有一个事件会触发多个方法调用的场景,那么事件会有所帮助。如果它的单个方法调用 Jobs 是好的。

事件场景:用户注册 -> 发送电子邮件、派发赠品、为用户个人资料 userxyz.site.com 创建子域等

工作场景:用户注册 -> 发送电子邮件。

在问题的确切上下文中:“事件”是“排队事件侦听器”。每个 Laravel 事件都有一个绑定到它的侦听器(事件侦听器),然后,当我们将该事件(在侦听器中)排队时,它神奇地是一个“排队事件侦听器”

【讨论】:

抱歉回复晚了。我同意所陈述的大部分观点。但是,大多数观点是针对事件与作业,而不是排队事件与作业。比如说,如果 Laravel 的未来版本省略了队列事件,我们会错过什么吗? 这篇文章没有回答 OP 的要求,甚至没有远程回答。问题是关于 queued 事件侦听器,而不是事件。请考虑更新您的答案。 这里的“事件”一词用作“排队事件/侦听器”。一般的解释对我来说似乎很好。只需要切换您所指的术语。 一般的解释是可以的。 确实,在这种情况下,“事件”是“排队事件侦听器”。每个 Laravel 事件都有一个绑定到它的侦听器(事件侦听器),然后,当我们将该事件(在侦听器中)排队时,它神奇地是一个“排队事件侦听器”【参考方案2】:

嗯,它们非常相似,事件监听器在句柄方法中将事件作为参数,作业则没有。

在您希望将触发部分与操作部分分离的情况下,事件非常有用。例如,当您在项目中有多个模块并且您希望一个模块对另一个模块中的事件做出反应时。

工作相比,事件的一个限制是工作链。例如,如果您从控制器触发多个事件,则无法确定工作人员按顺序分派它们,并且第一个事件在另一个事件启动之前完成。

在这些(罕见的)情况下,我有时会遇到(非排队的)侦听器,这些侦听器反过来调度(排队)执行实际工作(链式或非链式)的作业。

【讨论】:

以上是关于Laravel 排队事件侦听器与作业之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 队列 - 作业之间暂停

Laravel 5.8:传递给事件侦听器的参数变为空

如何在接收事件的多个 Laravel/Lumen 侦听器中保留模型状态?

实现队列时,Laravel通知侦听器无用

Laravel 拦截多参数 Artisan 事件

smack 数据包侦听器和消息侦听器之间的区别