首先說一下隊(duì)列設(shè)計(jì)。
假設(shè)有一本很長(zhǎng)的書,并且有許多人閱讀。有些人可以在午餐時(shí)間閱讀,有些人在周一晚上閱讀,其他人則在周末帶回家。這本書很長(zhǎng),在任何時(shí)候,我們都有數(shù)百人閱讀它。
書的讀者需要跟蹤他們?cè)跁械奈恢茫虼怂麄?strong>通過在書中放置書簽來跟蹤他們的位置。有些讀者閱讀速度很慢,書簽就在開頭。而有些讀者半途而廢,將自己的書簽留在書中,再也不會(huì)回來。
更糟糕的是,我們每天都在給這本書加頁。沒有人能真正讀完這本書。
最終,書被書簽塞滿了,直到有一天,它太重了,搬不動(dòng),沒人能再讀了。
于是有一個(gè)非常聰明的人決定不允許讀者在書中放置書簽,而必須在日記中寫下他們要翻到的頁數(shù)。
這就是 Apache Kafka 的設(shè)計(jì),而且是一個(gè)非常有彈性的設(shè)計(jì)。
其他隊(duì)列的常見替代設(shè)計(jì)是讓隊(duì)列服務(wù)跟蹤讀者所在的位置——這意味著需要為每個(gè)讀者分配內(nèi)存。行為不端的讀者可能會(huì)反復(fù)請(qǐng)求新的隊(duì)列會(huì)話,這會(huì)使隊(duì)列服務(wù)不堪重負(fù)。因此,這不是一個(gè)好的設(shè)計(jì),因?yàn)槲覀兿Mx者可以隨意閱讀而不會(huì)對(duì)隊(duì)列造成任何風(fēng)險(xiǎn)。
Kafka
Kafka 是圍繞一系列事件而設(shè)計(jì)的,例如:
1001:'甲'購買了旅游套餐'A'
1002:'甲'更新了他的訂閱偏好為“每日”
1003:'乙'使用'iphone'登錄
1004:'乙'打開了旅游套餐'巴厘島'
1005:'乙'使用'桌面Web'登錄
1006:'乙'購買了旅游套餐'巴厘島'
Kafka 事件閱讀器會(huì)跟蹤它們已讀取的流中的 ID,這意味著事件服務(wù)器不需要跟蹤它們。即使有許多行為不佳的讀者, Kafka 事件服務(wù)器也能保持可預(yù)測(cè)的內(nèi)存使用。
Kafka 聽起來很不錯(cuò),為什么需要 redis Streams?
Kafka 是存儲(chǔ)事件流的絕佳選擇,它專為大規(guī)模而設(shè)計(jì)。為了達(dá)到這種規(guī)模,Kafka 承擔(dān)了額外的復(fù)雜性,配置和管理 Kafka 設(shè)置需要了解一些復(fù)雜的概念。但對(duì)于較小的項(xiàng)目,更簡(jiǎn)單、更小的系統(tǒng)可能是更好的選擇。
Redis 是簡(jiǎn)單的、非持久性數(shù)據(jù)存儲(chǔ)的最常見選擇之一。它對(duì)所有流行的編程語言都有很好的庫支持,并且被大多數(shù)開發(fā)人員所熟知。Redis 支持更簡(jiǎn)單版本的 Kafka 事件流概念,使每個(gè)人都可以輕松使用。
Redis Streams使用示例
- 創(chuàng)建一個(gè)名為“stream”的流
XADD stream * data hello
- 讀取名為“stream”的流中的所有消息
XREAD STREAMS stream $
- 讀取名為“stream”的流中的最新消息
XREAD STREAMS stream 0
- 讀取名為“stream”的流中的最新消息,并等待1秒鐘以獲取更多消息
XREAD STREAMS stream 0 BLOCK 1000
- 讀取名為“stream”的流中的最新消息,并等待1秒鐘以獲取更多消息,最多獲取10條消息
XREAD STREAMS stream 0 COUNT 10 BLOCK 1000
- 讀取名為“stream”的流中的最新消息,并將其標(biāo)記為已處理
XREAD STREAMS stream 0 COUNT 1 BLOCK 1000
XACK stream group 1526569493336-0
總結(jié)
在一些需要使用事件流的場(chǎng)景中,一般使用 Kafka ,但在一些簡(jiǎn)單的場(chǎng)景下,也可以考慮使用 Redis Stream,畢竟Redis Stream更加簡(jiǎn)單,成本更低。






