天天看點

【轉】持久化消息隊列之MEMCACHEQ

G MEMCACHEQ AS MESSAGE QUEUE

PHP,消息隊列,MEMCACHEQ

使用消息隊列(MESSAGE QUEUE)可以把某些耗時的工作推後,然後在背景慢慢地去執行,

這樣就不會讓你的使用者等待太久。

今天介紹PHP的消息隊列: MEMCACHEQ。

MEMCACHEQ

MEMCACHEQ的特性:

1 簡單易用

2 處理速度快

3 多條隊列

4 并發性能好

5 與memcache的協定相容。這就意味着隻要裝了memcache的extension就可以了,不需要額外的插件。

6 在zend framework中使用也很友善。

MEMCACHEQ依賴于libevent和BerkleyDB。

BerkleyDB用于持久化存儲隊列的資料。 這樣在MEMCACHEQ崩潰或者伺服器挂掉的時候,

不至于造成資料的丢失。這一點很重要,很重要。

MemcacheQ will run as a daemon and communicates over the UDP protocol. It can handle concurrent connections and can be used in a load-balanced environment.

啟動參數:

memcacheq -d -r -H /data/memcacheq -N -R -v -L 1024 -u nobody &> \

/data/memcacheq/error.log

解釋一下:

-d 守護程序

-r Maximize core file limit

-v 詳細輸出

-u 以使用者的身份來運作

-H BDB 檔案的儲存目錄

-N Performance improvement

-R 太久的日志檔案會被删除。

-L 日志緩存大小,預設是32K。 1024表示1024K。

其它參數:

-h help

-vv 更加詳細的輸出

不使用-d的話,輸出會直接顯示到控制台。

ZEND_QUEUE

zend framework有一個與MEMCACHEQ通信的adapter:

Zend_Queue_Adapter_Memcacheq

http://framework.zend.com/manual/en/zend.queue.adapters.html

下面用一個真實的例子來示範如何在zend framework中使用MEMCACHEQ。

一個新聞網站,每條新聞顯示的時候,都要顯示出來此新聞的通路量,同時還要把它的通路量加1。

這個通路量是儲存到news表中的,與news的其它資訊儲存在一起。

這個資料變化得非常快,緩存的意義不大。

如果每次使用者檢視新聞的時候,都去資料庫中執行一次update visitCount+1的操作,

肯定是比較費力的。

使用者必須等待update完成之後,才能看到新聞的内容。

使用MEMCACHEQ之後呢,我們可以把每一次通路都記錄到消息隊列中,然後在背景再周期性去更新資料庫。

寫入消息隊列的速度是非常快的,比直接更新mysql快得多得多。

在viewNews.php中:

這樣就把這一次通路儲存到了消息隊列[example-queue]中。

然後再搞個cron,去處理隊列中的消息。