laravel队列、消息通知和观察者模式的理解

推荐
设计模式-PHP观察者设计模式
laravel事件监听--模型事件新特性
深入了解laravel消费队列的两种工作模式

看了laravel手册,有时候不太理解队列、观察者模式、通知等,这些功能的区别。想着直接在方法中处理数据库不一样吗?

  • 队列理解
    其实队列适用于处理那些处理时间比较长的时间的事情,一般来说是针对短信,邮件获取其他与第三方接口对接的应用比较实用。其实队列是把事件往数据库或者redis等驱动里面做了一次记录。如果你的事件只是需要改动数据表中的某个字段值的话,则不如直接对数据库做修改比较方便,而不要实用队列。
    队列并不会使程序变得更快,它是为了让数据变得合法。比如你完成了一个任务,需要做相应的积分处理,这个时候,可能会涉及到计算量比较大,一步步计算,所以可以放在队列里面去执行,即使计算量比较大,也会一步步来,不会导致系统崩溃。而创建任务后分发给每个用户,就不需要使用队列,因为没意义。分发也是一条SQL语句搞定的事情

  • 消息通知
    消息通知和直接对数据库修改也是一样的。只是佸䊟通知多了「频道(via)」这个概念。你可以比较方便的切换实用邮件(toMail),还是实用数据库(toDatabase)通知。如果你百分比确定只实用数据库通知,其实你根本不需要实用消息通知这中写法
    对了,如果你需要通知的类做了implements ShouldQueue的实例化,则默认会放到队列中处理。
    对了,如果使用队列,则先后时间可以很好的把控。如果不适用队列,则在数据库中做一个队列时间先后顺序即可。不过这样的话,就没有队列优先级的概念了。但是依然可以添加一个字段作为优先级,按照优先级和时间排序显示即可。order by height,create_time

  • 事件系统
    其实事件系统主要是使用了观察者模式。这个跟以上两种情况不一样。
    之前看到一篇文章讲解的是在注册功能中的使用。如果你注册后,需要给用户发送短信,注册时间记录等多个操作,你可能需要不断的扩展。但是使用了事件系统,你就可以很方便的处理这些问题。代码看上去更加简洁。但还是那句话,如果你只有一项需求触发,还是直接处理数据库即可
    laravel事件监听--模型事件新特性

应用观察者模式的好处:
观察者模式解除了主体和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。降低对象之间的耦合度以达到解耦的目的,符合"开闭原则"的要求。

laravel 框架中,我分别使用了databasesync两种模式测试了队列,说明队列确实是要过数据库的

队列测试

队列

在队列中,实例化 implements ShouldQueue 才会异步执行。

<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendEmail implements ShouldQueue
{
.
.
.
 public function __construct($user)
    {
        $this->delay(5); // 这是多少秒之后执行程序,适用于支付
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,989评论 8 265
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,176评论 2 89
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,054评论 3 119
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,099评论 25 709
  • 讲一个我最近很感动和印象深刻的事儿吧: 大前天的清晨即将从北方返回南方工作 坐在短途大巴车上时 我后方坐着一个男孩...
    Ruueryee阅读 1,697评论 0 0

友情链接更多精彩内容