laravel隊(duì)列、消息通知和觀察者模式的理解

推薦
設(shè)計(jì)模式-PHP觀察者設(shè)計(jì)模式
laravel事件監(jiān)聽--模型事件新特性
深入了解laravel消費(fèi)隊(duì)列的兩種工作模式

看了laravel手冊(cè),有時(shí)候不太理解隊(duì)列、觀察者模式、通知等,這些功能的區(qū)別。想著直接在方法中處理數(shù)據(jù)庫不一樣嗎?

  • 隊(duì)列理解
    其實(shí)隊(duì)列適用于處理那些處理時(shí)間比較長的時(shí)間的事情,一般來說是針對(duì)短信,郵件獲取其他與第三方接口對(duì)接的應(yīng)用比較實(shí)用。其實(shí)隊(duì)列是把事件往數(shù)據(jù)庫或者redis等驅(qū)動(dòng)里面做了一次記錄。如果你的事件只是需要改動(dòng)數(shù)據(jù)表中的某個(gè)字段值的話,則不如直接對(duì)數(shù)據(jù)庫做修改比較方便,而不要實(shí)用隊(duì)列。
    隊(duì)列并不會(huì)使程序變得更快,它是為了讓數(shù)據(jù)變得合法。比如你完成了一個(gè)任務(wù),需要做相應(yīng)的積分處理,這個(gè)時(shí)候,可能會(huì)涉及到計(jì)算量比較大,一步步計(jì)算,所以可以放在隊(duì)列里面去執(zhí)行,即使計(jì)算量比較大,也會(huì)一步步來,不會(huì)導(dǎo)致系統(tǒng)崩潰。而創(chuàng)建任務(wù)后分發(fā)給每個(gè)用戶,就不需要使用隊(duì)列,因?yàn)闆]意義。分發(fā)也是一條SQL語句搞定的事情

  • 消息通知
    消息通知和直接對(duì)數(shù)據(jù)庫修改也是一樣的。只是佸?通知多了「頻道(via)」這個(gè)概念。你可以比較方便的切換實(shí)用郵件(toMail),還是實(shí)用數(shù)據(jù)庫(toDatabase)通知。如果你百分比確定只實(shí)用數(shù)據(jù)庫通知,其實(shí)你根本不需要實(shí)用消息通知這中寫法
    對(duì)了,如果你需要通知的類做了implements ShouldQueue的實(shí)例化,則默認(rèn)會(huì)放到隊(duì)列中處理。
    對(duì)了,如果使用隊(duì)列,則先后時(shí)間可以很好的把控。如果不適用隊(duì)列,則在數(shù)據(jù)庫中做一個(gè)隊(duì)列時(shí)間先后順序即可。不過這樣的話,就沒有隊(duì)列優(yōu)先級(jí)的概念了。但是依然可以添加一個(gè)字段作為優(yōu)先級(jí),按照優(yōu)先級(jí)和時(shí)間排序顯示即可。order by height,create_time

  • 事件系統(tǒng)
    其實(shí)事件系統(tǒng)主要是使用了觀察者模式。這個(gè)跟以上兩種情況不一樣。
    之前看到一篇文章講解的是在注冊(cè)功能中的使用。如果你注冊(cè)后,需要給用戶發(fā)送短信,注冊(cè)時(shí)間記錄等多個(gè)操作,你可能需要不斷的擴(kuò)展。但是使用了事件系統(tǒng),你就可以很方便的處理這些問題。代碼看上去更加簡潔。但還是那句話,如果你只有一項(xiàng)需求觸發(fā),還是直接處理數(shù)據(jù)庫即可
    laravel事件監(jiān)聽--模型事件新特性

應(yīng)用觀察者模式的好處:
觀察者模式解除了主體和具體觀察者的耦合,讓耦合的雙方都依賴于抽象,而不是依賴具體。從而使得各自的變化都不會(huì)影響另一邊的變化。降低對(duì)象之間的耦合度以達(dá)到解耦的目的,符合"開閉原則"的要求。

laravel 框架中,我分別使用了databasesync兩種模式測試了隊(duì)列,說明隊(duì)列確實(shí)是要過數(shù)據(jù)庫的

隊(duì)列測試

隊(duì)列

在隊(duì)列中,實(shí)例化 implements ShouldQueue 才會(huì)異步執(zhí)行。

<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendEmail implements ShouldQueue
{
.
.
.
 public function __construct($user)
    {
        $this->delay(5); // 這是多少秒之后執(zhí)行程序,適用于支付
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,251評(píng)論 8 265
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,309評(píng)論 2 89
  • 1、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,210評(píng)論 3 119
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評(píng)論 25 709
  • 講一個(gè)我最近很感動(dòng)和印象深刻的事兒吧: 大前天的清晨即將從北方返回南方工作 坐在短途大巴車上時(shí) 我后方坐著一個(gè)男孩...
    Ruueryee閱讀 282評(píng)論 0 0

友情鏈接更多精彩內(nèi)容