【轉】持久化訊息佇列之MEMCACHEQ

來源:互聯網
上載者:User

標籤:style   blog   http   io   color   ar   os   使用   sp   

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中:

<?php// MemcacheQ config$queueOptions = array(    ‘name‘ => ‘example-queue‘,    ‘driverOptions‘ => array(        ‘host‘ => ‘127.0.0.1‘,        ‘port‘ => 22201    )); // Instantiate Zend_Queue$queue = new Zend_Queue(‘MemcacheQ‘, $queueOptions); // Find out if the queue existsif (!$queue->getAdapter()->isExists($queueOptions[‘name‘])){    // If not, create it    $queue->createQueue($queueOptions[‘name‘]);} // Build a query string (key=val&key=val) because we need a scalar value//使用者在$timestamp訪問了$page頁面。$params = http_build_query(    array(     ‘timestamp‘ => $timestamp,     ‘page‘ => $page    ));// Send the data to the queue$queue->send($params);

 


這樣就把這一次訪問儲存到了訊息佇列[example-queue]中。

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

<?php// MemcacheQ config$queueOptions = array(    ‘name‘ => ‘example-queue‘,    ‘driverOptions‘ => array(        ‘host‘ => ‘127.0.0.1‘,        ‘port‘ => 22201    )); // Instantiate Zend_Queue$queue = new Zend_Queue(‘MemcacheQ‘, $queueOptions); // Retrieve 5 items from the queue$messages = $queue->receive(5); // $message is now a instance of Zend_Queue_Message_Iterator// @TODO: Use a nice FilterIterator ;)foreach ($messages as $job){    if (‘creating queue‘ == $job->body || false === $job->body)    {        // Skip message        continue;    }    // Parse the query string to a array    parse_str($job->body, $data);     // Execute the heavy process //更新資料庫    $this->registerHit($data[‘timestamp‘], $data[‘page‘]);}

 

【轉】持久化訊息佇列之MEMCACHEQ

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.