laravel队列、消息通知和观察者模式的理解
推荐
设计模式-PHP观察者设计模式
laravel事件监听--模型事件新特性
深入了解laravel消费队列的两种工作模式
看了laravel
手册,有时候不太理解队列、观察者模式、通知等,这些功能的区别。想着直接在方法中处理数据库不一样吗?
-
队列理解
其实队列适用于处理那些处理时间比较长
的时间的事情,一般来说是针对短信,邮件获取其他与第三方接口对接的应用比较实用。其实队列是把事件往数据库或者redis
等驱动里面做了一次记录。如果你的事件只是需要改动数据表中的某个字段值的话,则不如直接对数据库做修改比较方便,而不要实用队列。
队列并不会使程序变得更快,它是为了让数据变得合法。比如你完成了一个任务,需要做相应的积分处理,这个时候,可能会涉及到计算量比较大,一步步计算,所以可以放在队列里面去执行,即使计算量比较大,也会一步步来,不会导致系统崩溃。而创建任务后分发给每个用户,就不需要使用队列,因为没意义。分发也是一条SQL语句搞定的事情 -
消息通知
消息通知和直接对数据库修改也是一样的。只是佸䊟通知多了「频道(via)」这个概念。你可以比较方便的切换实用邮件(toMail),还是实用数据库(toDatabase)通知。如果你百分比确定只实用数据库通知,其实你根本不需要实用消息通知这中写法
对了,如果你需要通知的类做了implements ShouldQueue
的实例化,则默认会放到队列中处理。
对了,如果使用队列,则先后时间可以很好的把控。如果不适用队列,则在数据库中做一个队列时间先后顺序即可。不过这样的话,就没有队列优先级的概念了。但是依然可以添加一个字段作为优先级,按照优先级和时间排序显示即可。order by height,create_time
-
事件系统
其实事件系统主要是使用了观察者模式。这个跟以上两种情况不一样。
之前看到一篇文章讲解的是在注册功能中的使用。如果你注册后,需要给用户发送短信,注册时间记录等多个操作,你可能需要不断的扩展。但是使用了事件系统,你就可以很方便的处理这些问题。代码看上去更加简洁。但还是那句话,如果你只有一项需求触发,还是直接处理数据库即可
laravel事件监听--模型事件新特性
应用观察者模式的好处:
观察者模式解除了主体和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。降低对象之间的耦合度以达到解耦的目的,符合"开闭原则"的要求。
在 laravel
框架中,我分别使用了database
和sync
两种模式测试了队列,说明队列确实是要过数据库的
队列
在队列中,实例化 implements ShouldQueue
才会异步执行。
<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendEmail implements ShouldQueue
{
.
.
.
public function __construct($user)
{
$this->delay(5); // 这是多少秒之后执行程序,适用于支付
}
}