Disque:Redis之父新開源的分布式內存作業隊列

cymt 9年前發布 | 10K 次閱讀 Disque

DisqueRedis之父Salvatore Sanfilippo新 開源的一個分布式內存消息代理。它適應于“Redis作為作業隊列”的場景,但采用了一種專用、獨立、可擴展且具有容錯功能的設計,兼具Redis的簡潔 和高性能,并且用C語言實現為一個非阻塞網絡服務器。有一點需要提請讀者注意,在Disque項目文檔及本文中,“消息(Message)”和“作業 (Job)”可互換。

Disque是一個獨立于Redis的新項目,但它重用了Redis網絡源代碼、節點消息總線、庫和客戶端協議的一大部分。由于Disque使用了 與Redis相同的協議,所以可以直接使用Redis客戶端連接Disque集群,只是需要注意,Disque的默認端口是7711,而不是6379。

Disque:Redis之父新開源的分布式內存作業隊列

作為消息代理,Disque充當了需要進行消息交換的進程之間的一個中間層,生產者向其中添加供消費者使用的消息。這種生產者-消費者隊列模型非常常見,其主要不同體現在一些細節方面:

  • Disque是一個同步復制作業隊列,在默認情況下,新增任務會復制到W個節點上,W-1個節點發生故障也不會影響消息的傳遞。
  • Disque支持至少一次和至多一次傳遞語義,前者是設計和實現重點,而后者可以通過將重試時間設為0來實現。每個消息的傳遞語義都是單獨設置的,因此,在同一個消息隊列中,語義不同的消息可以共存。
  • 按照設計,Disque的至少一次傳遞是近似一次傳遞,它會盡力避免消息的多次傳遞。
  • Disque集群的所有節點都有同樣的角色,也就是“多主節點(multi-master)”。生產者和消費者可以連接到不同的隊列或節點,節點會根據負載和客戶端請求自動交換消息。
  • Disque支持可選的異步命令。在這種模式下,生產者在向一個復制因子不為1的隊列中添加一個作業后,可以不必等待復制完成就可以轉而執行其它操作,節點會在后臺完成復制。
  • 在超過指定的消息重試時間后,Disque會自動將未收到響應的消息重新放入隊列。
  • 在Disque中,消費者使用顯式應答來標識消息已經傳遞完成。
  • Disque只提供盡力而為排序。隊列根據消息創建時間對消息進行排序,而創建時間是通過本地節點的時鐘獲取的。因此,在同一個節點上創建的消息 通常是按創建順序傳遞的,但Disque并不提供嚴格的FIFO語義保證。比如,在消息重新排隊或者因為負載均衡而移至其它節點時,消息的傳遞順序就無法 保證了。所以,Salvatore指出,從技術上講,Disque嚴格來說并不是一個隊列,而更應該稱為消息代理。
  • Disque通過四個參數提供了細粒度的作業控制,分別是復制因子(指定消息的副本數)、延遲時間(將消息放入隊列前的最小等待時間)、重試時間(設置消息何時重新排隊)、過期時間(設置何時刪除消息)。

需要注意的是,Disque項目尚處于Alpha預覽測試階段,代碼和算法未經充分測試,還不適合用于生產環境。在接下來的幾個月里,其實現和API很可能會發生重大變化。此外,它還有如下限制:

  • 其中還包含許多沒有用到的Redis代碼;
  • 它并非源于Salvatore的項目需求,而是源于他看到人們將Redis用作隊列,但他不是這方面的專家;
  • 同Redis一樣,它是單線程的,但鑒于它所操作的數據結構并不復雜,將來可以考慮改為多線程;
  • Disque進程中的作業數量受可用內存限制;
  • Disque沒有進行性能優化。

總之,該項目尚處于研究測試階段。感興趣的讀者可以查看該項目的GitHub頁面,了解更多信息。

原文:http://www.infoq.com/cn/news/2015/04/Disque-Redis-github 作者: 謝麗

 本文由用戶 cymt 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!