2017-08-19 121 views
0

我正在處理一個龐大的在線短信系統,用戶從其用戶面板發送消息,這些消息轉到名爲messages_queue的mysql表中。PHP - 使用隊列和cron作業或直接處理請求?

然後,系統讀取隊列行併發送每個消息在Cronjob中。當然,以非常快的速度發送消息非常重要。

我在想,直接發送消息(根據用戶請求)並不使用隊列更好嗎? (發送消息需要連接到外部API)

我在考慮數據庫I/O時發現了這個問題。
這不是對數據庫的壓力嗎?

編輯/答:

我的問題是一個主要基於輿論的問題。順便說一句,以備將來使用我會寫我所做的和我得到的。上的@bansi評論,我想我的索引表,這是我所看到的:

這是我得到的開始,例如:

SELECT * FROM users WHERE parent="admin" 
//response:OK 
//Time: 3.581s 

你知道,3.581秒的查詢是一個很長的時間。然後我試圖拿到我需要的東西:

SELECT uname FROM users WHERE parent="admin" 
//response:OK 
//Time: 1.02s 

好的,這有點好一點,但仍然不是我想要的。在數據庫 索引可查詢字段和查詢中使用INDEX:
所以,我想這一個

SELECT uname FROM users USE INDEX(parent) WHERE parent="admin" 
//response:OK 
//Time: 0.168s 

是的,這就是我想要的。使用INDEXspecific needed fields約快30倍,這正是我所需要的。

+0

此問題主要是基於意見的。在我看來,使用單獨的隊列會更好,因爲您可以輕鬆處理錯誤和連接延遲。我認爲就目前的技術狀態而言,短信發送可能會導致任何數據庫壓力,即使您使用的是非常過時的計算機。 – bansi

+0

@bansi但在'ssh'中我使用了'htop',並且我的大部分查詢都是'SELECT * from messages_queue WHERE active = 1 AND sendflag = 0',我的平均服務器負載約爲3.0,服務器。我認爲這不是一種常見的情況。 –

+0

據我所知,cron的最小間隔時間爲1分鐘,每分鐘查詢不會超載數據庫。注意:你應該在下一份工作開始之前完成你的工作(或者有一些邏輯),以避免重複。 – bansi

回答

1

該隊列的優勢是能夠給用戶提供更快的響應,因此雖然SMS沒有得到更快的發送,但用戶會感覺系統更快,因爲他們點擊「發送」並獲得立即反饋。你也許可以嘗試將你的隊列從數據庫中移出到專門的隊列處理系統,比如RabbitMQ。

+1

這是一個很好的答案,但這不是我的答案。不管怎麼說,還是要謝謝你。 –

1

好了,我用的MySQL前排隊,假以時日,如果不擦桌子,就會變得很慢,你可以使用它,但你總是有乾淨的執行行...

但是,如果你正在尋找一個真正的隊列系統,我會推薦RabbitMQ,它很容易,真的很棒,你可以用它做多少。

+0

我對RabbitMQ並不是很有經驗,這就是爲什麼我沒有與之合作。 (之前系統是基於MYSQL隊列開發的,這也是另一個原因。)無論如何,我會認真考慮擁有一個乾淨的桌子。謝謝。 –