# 消息隊列
在開發應用程序的時候,你可能需要執行一些任務,例如解析和存儲一些大型文件,這些任務在Web 請求期間需要耗費很長時間才能執行完成。 這時候我們就可以用消息隊列來創建在后臺處理的隊列任務。 通過將時間密集型任務移至隊列,這樣你的應用程序可以以極快的速度響應 Web 請求,并為你的程序提供更好的用戶體驗
傳統的程序執行流程一般是 即時|同步|串行的,在某些場景下,會存在并發低,吞吐量低,響應時間長等問題。在大型系統中,一般會引入消息隊列的組件,將流程中部分任務抽離出來放入消息隊列,并由專門的消費者作針對性的處理,從而降低系統耦合度,提高系統性能和可用性。
一般來說,可以抽離的任務具有以下的特點:
●允許延后|異步|并行處理 (相對于傳統的 即時|同步|串行 的執行方式)
○允許延后:搶購活動時,先快速緩沖有限的參與人數到消息隊列,后續再排隊處理實際的搶購業務;
○允許異步:業務處理過程中的郵件,短信等通知
○允許并行:用戶支付成功之后,郵件通知,微信通知,短信通知可以由多個不同的消費者并行執行,通知到達的時間不要求先后順序。
●允許失敗和重試
○強一致性的業務放入核心流程處理
○無一致性要求或最終一致即可的業務放入隊列處理
## 1.配置
1.先打開.env文件,將queue下的state改成true(如果.env文件中沒有queue配置的話要手動添加)

2.隊列必須配置redis,打開.env文件,redis下就是redis的配置

## 2.消息的消費和刪除
1.在app/job目錄下創建一個任務消費類
例如:
~~~
<?php
namespace app\job;
use core\base\BaseJob;
/**
* 訂單延時關閉任務
*/
class OrderClose extends BaseJob
{
/**
* 消費
* @param $order_id 訂單id
* @param $close_time 關閉時間
* @return true
*/
protected function doJob($order_id, $close_time)
{
//業務代碼
//......
return true;
}
}
~~~
## 3.消息的創建與推送
在業務控制器中新增一個控制器,創建一條消息,并推送到隊列
1、新增一個控制器\\app\\adminapi\\controller\\test\\JobTest.php,在該控制器中添加 helloWorldJob 方法,實例化剛剛創建的任務類,并調用dispatch函數
~~~
<?php
namespace app\adminapi\controller\test;
use app\job\OrderClose;
use core\base\BaseAdminController;
use think\Response;
/**
* 測試隊列任務
*/
class JobTest extends BaseAdminController
{
/**
* 創建消息
* @return Response
*/
public function helloWorldJob()
{
$order_id = 1;//訂單id
$close_time = time();//訂單關閉時間
$is_pushed = OrderClose::dispatch(['order_id' => $order_id, 'close_time' => $close_time]);
if( $is_pushed !== false ){
echo date('Y-m-d H:i:s') . " Hello World Job is Pushed.";
}else{
echo 'Hello World Job Error.';
}
}
}
~~~
dispatch函數的參數介紹
* action 任務消費類內部的方法, 非必填,不填寫或類型為數組的話的話默認會調用doJob函數,如果是數組的話則視為當前值為data參數
* data 數據傳參, 他會將這兒的數組作為可變數量的參數傳遞給對應函數的給定變量參數
* secs 延時執行時間(單位為秒),默認為0, 支持延時執行和定時執行,如果為0就是普通的異步任務,如果傳值則視為當前時間的\*秒后延時執行
* queue\_name 當前任務歸屬的隊列名稱,如果為新隊列,會自動創建,結合命令行使用
* is\_async 默認為true,當前任務是否需要異步執行,最高優先級
2、新建一個路由配置文件\\app\\adminapi\\route\\job.php
~~~
<?php
use think\facade\Route;
Route::group('job', function () {
//獲取本地插件
Route::get('test', 'test.JobTest/helloWorldJob');
});
~~~
至此,所有的代碼都已準備完畢,在運行消息隊列之前,我們先看一下現在的目錄結構:

## 4.發布任務
在瀏覽器中訪問[http://your.project.com/adminapi/job/test](http://your.project.domain/index/job_test/actionWithHelloJob),可以看到消息推送成功。

## 5.啟動任務
切換當前終端窗口的目錄到項目niucloud目錄下,執行
~~~
php think workerman
~~~
可以看到執行的結果類似如下:

通常的,我們需要將消息隊列放到守護進程Supervisor常駐內存運行。

至此,我們成功地完成了一個消息的 創建 -> 推送 -> 消費 -> 刪除 的流程
## 特別注意:修改傳參后需要重啟重啟 workerman 在可生效!!!
- 源碼下載
- 安裝部署
- 環境要求
- 安裝視頻教程
- 寶塔部署
- 授權綁定
- 二次開發須知
- 技術棧
- 目錄結構
- 命名規范
- 二次開發指導
- 二次開發環境搭建步驟
- 二次開發注意事項
- 單站和Saas模式開發
- 插件結構描述
- MENU開發
- DIY組件/頁面開發
- 自定義手機端DIY裝修頁面
- Route 路由處理
- Services中的core文件夾
- 自定義站點管理端控制臺頁面樣式
- 調用素材資源
- Resource資源文件
- 引入圖標ICON
- SMS發送短信開發
- Job 消息隊列和計劃任務
- 消息隊列
- 計劃任務開發
- 生產環境編譯打包處理步驟
- 生產環境搭建步驟
- 插件安裝時npm,composer檢測不可用問題處理
- 上傳圖片大小限制修改
- 插件uniapp開發
- 菜單語言包
- 插件打包
- 插件內測在線升級
- 自定義端口開發
- 如何開發自定義布局后臺布局
- 二次開發應用插件視頻教程
- 二次開發安裝視頻教程
- 準備工作與創建插件
- 插件目錄整體說明
- 插件admin目錄
- 插件app目錄說明(adminapi、api、驗證器)
- 插件app目錄(dict、job)
- 插件app目錄說明(lang、listener)
- 插件app目錄說明(model、service)
- 插件uniapp目錄說明
- 插件開發之后臺功能開發(代碼生成器)
- 插件開發之uniapp功能開發(api)第一節
- 插件開發之uniapp功能開發(api)第二節
- 插件開發之uniapp功能開發(api)第三節
- 插件安裝與打包原理
- 消息隊列開發
- 計劃任務開發
- DIY組件和自定義頁面裝修開發
- 支付接口開發
- 插件升級包打包流程以及云編譯功能
- 常見問題
- 怎么添加菜單,添加了菜單不出現怎么回事
- 怎么配置跨域的問題
- 站點site端(租戶端、商家端)和saas管理端(平臺端)究竟啥意思,有啥區別
- 框架中是有訂單表order,假如開發一個商城插件,請問商城的訂單數據是不是重新搞一個訂單表shop_order
- 有些支付平臺是綁定回調唯一網址或目錄,如果有幾個開發者開發插件都有支付那這塊怎么解決?
- 站點過期,可以登錄,這樣對嗎?
- 計劃任務怎么啟動啊
- Git多分支開發,切換分支
- 安裝應用出現is_dir():報錯處理方案
- 綁定授權時出現“請求來源產品與授權產品不一致”解決方案
- “未找到admin源碼所在目錄”的解決方案
- 頁面裝修本地開發環境配置
- 接口請求錯誤處理方案
- 未獲取到授權信息問題處理方案
- 騰訊地圖配置
- 請求超時問題處理方案
- 下載應用時提示找不到zip解決方案
- 怎么關閉開發調試模式
- 獲取數據失敗問題處理方案
- 框架安裝后,訪問域名無法進入admin端(多數發生在本地)
- 底部導航失效問題
- 開放平臺小程序審核通過發布失敗問題
- 先升級插件后升級框架,導致云編譯報debounce的錯誤
- 微信公眾號自動回復不通
- 修改訪問域名默認跳轉端口
- 插件與框架的兼容問題處理
- 升級提示mkdir()處理方案
- 云編譯時node.js內存不足導致內存溢出處理方案
- 報錯Allowed memory size of ** bytes exhausted (tried to allocate ** bytes)處理方法
- 代碼生成器
- 設計數據表
- 導入數據表
- 添加字段
- 代碼生成
- 效果預覽
- niucloud (服務端)
- 服務端目錄結構
- 整體運行流程
- 入口文件
- 模塊
- 中間件
- 控制器
- 路由
- 模型類
- 服務類
- 驗證類
- 消息隊列
- 開發消息隊列
- 多語言
- 裝載器
- 短信發送
- 上傳文件
- 第三方支付
- 第三方登錄
- 數據字典裝載器
- 打印
- 事件
- 消息提醒(模版消息)
- 數據字典
- admin (后臺管理端)
- 準備工作
- 新手入門
- 目錄結構
- 系統配置
- 路由
- 接口
- 管理端編譯上傳
- uni-app(手機端前端)
- 準備工作
- 前端目錄結構
- Hbuilder開發
- 發行h5
- 運行uniapp
- 發行uniapp
- Visual Studio Code開發
- 發行 uniapp
- 運行 uniapp
- 配置項
- 路由
- 接口
- 分包建議
- 手機端編譯
- 微信小程序編譯上傳
- web端(PC前端)
- 準備工作
- 目錄結構
- 代碼運行
- 路由
- 接口
- 黑暗主題
- web端打包上線
- api接口
- 配置手冊
- 阿里云oss云存儲配置
- 三方開放平臺小程序托管
- 計劃任務配置
- 站點域名配置
- 小票打印配置
- 電子面單配置
- 微信小程序客服配置
- 微信打款配置