高效能離不開非同步,非同步離不開佇列,內部是producer-consumer模型的原理。
設計中的核心概念:
job:乙個需要非同步處理的任務,是beanstalkd中得基本單元,需要放在乙個tube中;
tube:乙個有名的任務佇列,用來儲存統一型別的job,是producer和consumer操作的物件;
producer:job的生產者,通過put命令將乙個job放入乙個tube中;
consumer:job的消費者,通過reserve/release/bury/delete命令來獲取job或改變job的狀態;
job的生命週期
乙個job有ready, reserved, delayed, buried四種狀態。當producer直接put乙個job時,job就處於ready狀態,等待consumer來處理,如果選擇延遲put,job就先到delayed狀態,等待時間過後才遷移到ready狀態。
consumer獲取了當前ready的job後,該job的狀態就遷移到reserved,這樣其他的consumer就不能再操作該job。當consumer完成該job後,可以選擇delete, release或者bury操作。
delete之後,job從系統消亡,之後不能再獲取;release操作可以重新把該job狀態遷移回ready(也可以延遲該狀態遷移操作),使其他的consumer可以繼續獲取和執行該job;有意思的是bury操作,可以把該job休眠,等到需要的時候,再將休眠的job kick回ready狀態,也可以delete buried狀態的job。
正是有這些有趣的操作和狀態,才可以基於此做出很多意思的應用,比如要實現乙個迴圈佇列,就可以將reserved狀態的job休眠掉,等沒有ready狀態的job時再將buried狀態的job一次性kick回ready狀態。
幾個很nice的特性
優先順序:支援0到2^32的優先順序,值越小,優先順序越高,預設優先順序為1024。
持久化:可以通過binlog將job及其狀態記錄到檔案裡面,在beanstalkd下次啟動時可以通過讀取binlog來恢復之前的job及狀態。
分布式容錯:分布式設計和memcached類似,beanstalkd各個server之間並不知道彼此的存在,都是通過client來實現分布式以及根據tube名稱去特定server獲取job。
超時控制:為了防止某個consumer長時間占用任務但不能處理的情況,beanstalkd為reserve操作設定了timeout時間,如果該consumer不能在指定時間內完成job,job將被遷移回ready狀態,供其他consumer執行。
不足:在使用中發現乙個beanstalkd尚無提供刪除乙個tube的操作,只能將tube的job依次刪除,並讓beanstalkd來自動刪除空tube。還有就是beanstalkd不支援客戶端認證機制(開發者將應用場景定位在區域網)。
高效能mysql(一) 建立高效能索引
單列索引和多列索引 單列索引 多個單列索引的選擇問題 多個or條件 多個單列的效能往往效能很低,盡量建立高效的多列索引。多列索引 選擇合適的索引順序 避免範圍條件 在where子句中,in是有效的,範圍條件會導致後面的索引無效!在order by中,範圍條件和in都會導致無法按照索引排序!按照索引順...
如何高效能的設計乙個測試用例?
前言 如果問乙個問題,如何設計測試用例,恐怕會貽笑大方,因為剛入測試這一行的同學也都能噼里啪啦說上十分鐘不歇氣。但是如果追問下去,比如專案快速迭代時怎樣讓測試用例保持有效新鮮?什麼是更高效的設計方式?恐怕能回答上來的人不多了。在如今的軟體迭代過程中,在測試用例上投入的大量時間和亟需提公升的研發效率正...
Yaconf 乙個高效能的配置管理擴充套件
鳥哥出品 首先說說,這個是幹啥的.我見過很多的專案中,用php檔案做配置的,乙個config目錄下可能有十幾個甚至數十個.php配置檔案,裡面都是各種各樣的array,還有甚者會把一些詞典檔案 比如中文 英文對照 也放到配置中去.這就導致配置檔案的解析耗費了很大的效能 誠然,用了opcache能好點...