目錄
回复内容:
首頁 後端開發 php教程 队列是什么意思?

队列是什么意思?

Jun 17, 2016 am 08:31 AM

能详细的说下吗,整天听到队列,头都疼了,百度也找不到好的解释

回复内容:

首先,队列是一种数据结构,用链表和数组都可以实现,队列的特点就是先放入队列的数据先出队列。
不过看到话题标签有Redis,猜测题主想问的应该是现在很广泛使用的消息队列(MQ)。这里的消息不只是简单的文本信息,也可以是序列化后的对象。现在比较流行的开源消息队列系统有Beanstalkd,RabbitMQ,Redis(可以作为队列系统使用)等,其核心作用都是先将消息数据通过系统接口按顺序放入队列(暂存于内存),需要时再按放入的顺序依次取出以作后续处理。
就拿我前段时间做的邮件发送系统举例:
系统以HTTP协议提供服务,对外提供的主要功能是发送邮件,API地址为 /api/msg.send。使用者只要以POST请求此地址,传入subject,body,recipient这三个参数,即可发送一封邮件。


方案1: 不使用数据库,不使用队列
请求接口时,控制器直接调用sendmail或外部smtp服务器发送邮件,整个发送过程HTTP请求处于等待状态,待邮件发送完成,返回发送结果(只是调用发送程序是否成功的结果,不是邮件真正的发送结果,真正发送结果需要分析邮件日志)
这个方案最简单直接,平时发送少量邮件是可以的,但是缺点也很明显:
1. 因为接口调用时整个邮件发送过程都是同步进行的,每次请求都要等待邮件发送端完成处理,必然导致每次调用接口的等待时间增长。
2. 当系统接口并发请求较高时,系统可用性不仅受限于WebServer的处理能力,还完全受限于邮件发送端软件的处理能力,其中任一环节故障就会导致整个系统无法提供服务。
3. 若邮件发送端软件出现故障(比如SMTP连接超时),导致某次请求时邮件发送失败,那这封邮件内容便彻底丢失了,系统没有任何存留,不能实现自动重发。

方案2: 使用数据库,不使用队列
请求接口时,将要发送的邮件信息存入数据库,表结构如下:
id | subject | body | recipient | sent_at | failed_at | failed_times
然后在服务器上运行一个定时任务,每秒一次读取 sent_at=0 && failed_times
相对于方案1的提升:
1. 去掉了同步发送邮件的操作,接口请求响应会快很多
2. 邮件发送失败后可以重发,邮件不会丢失
3. 当邮件发送端完全失效后系统也可以接受邮件发送请求,待发送端恢复后可以继续发送邮件。

但还是存在缺点:
每次请求都会写一次数据库,当大并发量或者大数据量(一次请求包含100万个收件人)时,数据库负载过高影响稳定性,同时也会严重增加接口的响应时间(一下子写入100万条记录不是闹着玩的)

方案3: 数据库 + 队列

请求接口时,将要发送的邮件信息以JSON格式存入队列系统,放入的单个消息形如:
{
"subject" : "今天没吃药",
"body" : "感觉自己",
"recipient" : "mengmeng@da.com"
}

现在的队列基本上都是内存队列,数据存取非常快,一瞬间写入100万条数据再也不是难事。
随后,在服务器上运行一个常驻进程任务(Worker),实时监听队列中是否有新的消息(Job,此处指邮件信息)。当新消息进入时,从队列中取出消息,调用邮件发送端完成处理,发送成功后将此消息销毁并将消息内容插入数据库(同方案2),如果发送失败,将此消息重新放入队列,并加入一个60秒的延时标记,意味60秒后再取出处理。

这样改进后整个系统的吞吐量和响应速度将大大提升,而且同时也让系统支持了分布式运行的能力。每个Worker进程都可以视为一个处理节点,倘若把worker分散到不同的服务器上,便实现整个系统的分布式处理了,这也是队列的一个重要特性之一。

在我实际项目中还是做了许多基于方案3的改进,对于群发还使用了邮件列表和邮件模板等设计,整个系统类似Mailgun和Sendcloud的设计,等整个系统稳定下来,我会考虑将代码开源到Github。

这个例子只是队列的一个常见使用场景,一般来说在需要缓解数据库写入压力的场景下面,都可以考虑使用消息队列,还有一些需要分布式处理的情况下,也是队列很好的使用场景。

现在大部分语言都有成熟的消息队列处理组件,可以很方便的使用各种队列系统,比如我常用的
Laravel 便原生支持了 Beanstalkd,Amazon SQS,IronMQ,Redis。

抱砖引玉,不足之处请指正,谢谢。 排队听说过吧?先来的站前面(队首),后来的跟在后面(队尾),出队的时候从队首出,入队的跟在队尾,这就是队列!至于实现,链表和数组都行!
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1269
29
C# 教程
1248
24
PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? 說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP和Python:代碼示例和比較 PHP和Python:代碼示例和比較 Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

See all articles