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

49
我正在努力理解Laravel的Queued Event ListenerJobs的区别。
对我来说,它们似乎非常相似:
  1. 两者都实现了ShouldQueue接口(在事件侦听器的情况下,这是一个选项)
  2. 都实现了handle()failed()(可选)方法来执行各自的任务。
本质上,对我而言,两者都是可以异步运行的排队项。
到目前为止,我能够区分的是,作业具有更多“高级”功能/配置,例如$timeout, $tries属性,您还可以延迟作业的“触发”(由Illuminate\Bus\Queueable特性提供)。
我确信还有更多,但我指出了我注意到的一个问题。
因此,问题是,两者之间的实际区别是什么,更重要的是,何时使用哪种方法?
2个回答

57

很好的问题,我将从Laravel文档中解释开始

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

Jobs(任务):作业类非常简单,通常只包含一个处理方法,在队列处理作业时调用该方法。

基本上两者都是将工作推送到队列并/或执行其被要求做的一些处理,我认为主要区别在于它们如何被调用。

事件正在等待调用,而作业则是始终显式调用

事件的强大之处在于我们可以为单个事件注册多个监听器事件助手将向所有已注册的监听器分派事件,而无需我们显式调用它们。相比之下,对于作业,我们必须显式调用每个作业。

简而言之,如果您有一个场景,其中一个事件将触发多个方法调用,则使用事件很有帮助。如果只涉及到单个方法调用,作业就很好用。

事件场景:用户注册->发送电子邮件、派送免费礼品、为用户配置个人资料userxyz.site.com等等

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

在问题的确切上下文中,“Event(事件)”是“Queued Event Listener(队列化的事件监听器)”。每个Laravel事件都有一个绑定的监听器(事件监听器),然后,当我们将该事件排队时(在监听器中),它会神奇地成为“Queued Event Listener(队列化的事件监听器)”。


抱歉回复晚了。我确实同意大部分观点。然而,大多数观点都是针对事件与作业的轻重缓急,而不是排队事件与作业。比如说,如果 Laravel 的未来版本省略了排队事件,我们会错过什么吗? - LC Yoong
14
这篇帖子并没有回答 OP 所提出的问题,甚至与之毫不相关。问题是关于“排队”事件监听器,而不是事件本身。请考虑更新您的回答。 - sepehr
5
这里的术语“事件”指的是“排队的事件/监听器”。总体解释对我来说看起来不错。只需要切换你所提到的术语即可。 - Lunfel
一般的解释可以。 - Wesley Tokoi
1
实际上,在这种情况下,“事件”是一个“排队的事件侦听器”。每个Laravel事件都有一个绑定到它的监听器(事件侦听器),然后,当我们在侦听器中排队该事件时,它就神奇地成为了一个“排队的事件侦听器”。 - Ray
@ray 感谢您的评论,我将把您的评论添加到答案中。 - Tariq Khan

6

它们非常相似,eventlistener在handle方法中需要一个事件作为参数,而job则不需要。

在希望将触发部分与操作部分解耦的情况下,使用事件是很好的选择。例如,在项目中有多个模块,您希望一个模块对另一个模块中的事件作出反应。

与工作(jobs)相比,事件的一个限制是工作链接(job chaining)。例如,如果您从控制器触发了多个事件,则无法确保worker按顺序调度它们,并且第一个事件完成后才启动另一个事件。

在这些(罕见的)情况下,我有时会使用(未排队的)侦听器,然后再传递(已排队的)job来执行实际工作(链接或不链接)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接