標籤:
Disque是Redis之父Salvatore Sanfilippo新開源的一個分布式記憶體訊息代理。它適應於"Redis作為作業隊列"的情境,但採用了一種專用、獨立、可擴充且具有容錯功能的設計,兼具Redis的簡潔和高效能,並且用C語言實現為一個非阻塞網路伺服器。
Redis的作者Salvatore Sanfilippo(網名Antirez)發表的一篇部落格文章,介紹了自己幾個月以來在晚上和周末開發的新項目——Disque。
開發初衷
Antirez之所以動念開發Disque,是因為看到很多人用Redis來處理隊列,但這樣做的優勢和劣勢都很明顯:Redis很快、易用而且很多基礎設施裡已經在用;但是Redis的高可用性/叢集特性的設計完全偏向可變資料結構,這與不可變的訊息非常不同,並非最佳方案。
訊息中介重要的功能是保證至少一次或者最多一次發送訊息,而且前者更重要。Antirez開始想通過少量修改Redis來實現,但幾天后發現用戶端演算法太複雜了。Redis已經有很多功能,再增加功能並非什麼好主意。何況訊息佇列的運作方式與Redis很不同。
那麼,是不是可以新開發一個訊息佇列呢?
世界上已經有很多訊息佇列了,新做一個有價值嗎?Antirez想,既然有這麼多人用Redis來處理訊息佇列,已有的方案看上去要麼太簡單要麼太複雜,其中必有機會,於是他動手了。
開發過程
他頭一次沒有直接寫代碼,而是花了幾個星期思考設計,嘗試從使用者角度理解什麼樣的訊息佇列會讓人更爽。主要的使用情境沒變:延遲作業。Disque是通用系統,但主要針對的問題,是發送可能要處理的作業的訊息。如果有什麼違背了這一情境,就會被幹掉。
設計有了,Antirez直接從Redis代碼入手。幸運的是Redis部分就是編寫C分布式系統的一個架構。協議、網路程式庫、用戶端處理、結點到結點的訊息匯流排已經有了,無需重頭再寫。但他又不想影響Redis本身,於是採取了比較實際的辦法:開一個Redis分支,然後將Redis專用的東西全部刪掉,只剩一個架構,再開始實現設計。
很幸運的是有C#的用戶端來操作Disque: https://github.com/ziyasal/Disque.Net .
相關連結:
Disque:Redis之父新開源的分布式記憶體作業隊列
Disque 使用教程(DisqueBook.com)
Disque:Redis之父新開源的分布式記憶體作業隊列