1.背景
REAL TIME
Latency low
data in motion
延時(shí)性要求高灾螃,系統(tǒng)快速收集數(shù)據(jù)快速處理。 所以需要消息系統(tǒng)犁跪,你不能都存下來等一天再處理摄乒。不然就不能即使防止類似信用卡盜刷的問題。
歷史數(shù)據(jù)(DATA IN DISK)
DATA IN MOTION(數(shù)據(jù)流動)
需要一個系統(tǒng)去分析數(shù)據(jù) 傳遞數(shù)據(jù)嗤军,這就是我們說的消息系統(tǒng)注盈。
2.什么是消息系統(tǒng)
Minix : IPC
Message Apps: wechat/ facebook messenger
TCP: 點(diǎn)到點(diǎn)的消息通訊(通過鏈路層傳遞消息)
Messaging Middle(消息中間件): AWS SQS(simple queue service)
SNS (push notification)
Open Source: XXX-MQ
MESSAGING VS STREAMING
streaming 偏重計(jì)算
messaging 偏重投遞
streaming 有order
messaging 不保證
-
Messaging models
JMS ->1. 點(diǎn)對點(diǎn)(一條消息,對應(yīng)一個生產(chǎn)者和一個消費(fèi)者):Queue
2. 發(fā)布訂閱模式 (公告欄型雳,廣播):Topic
Queue:
image.png FIFO
2.點(diǎn)對點(diǎn)
3.Shared Consumption (消息隊(duì)列被共享)No ordering guarantee
SIMPLE JVM Process
sender/producer : 1+ producer threads
receiver/ consumer : 2+ consumer threads
messaging media : LinkedBlockingQueue
System :
sender/producer : 1+ producer machines
receiver/ consumer : 2+ consumer machines
messaging media : Distributed message queue system
用QUEUE的好處:
用淘寶來舉個例子当凡,11.11那天流量 會100倍的增長山害,系統(tǒng)是按平時(shí)的情況去配置的機(jī)器。比如NORMAL 情況下 QPS 為10K沿量,雙11 就可能是 1M
如果我每天都按洪峰去配置浪慌,那么就造成了讓費(fèi)。
為了解決這個問題朴则,淘寶里就有很多的QUEUE权纤。BUFFER的效果。根據(jù)實(shí)際的資源乌妒,去慢慢處理的這些洪峰的訂單請求汹想。
為什么可以用MQ接受那么大的流量而不能用數(shù)據(jù)庫來做這件事呢?
一個交易可能是個復(fù)雜的事務(wù)操作撤蚊,而不是簡單的記一筆古掏。用MQ簡化了復(fù)雜性,我只做簡單的一件事侦啸,存下來槽唾。把快速的發(fā)布者,和慢的消費(fèi)者解耦合光涂。當(dāng)流量不匹配時(shí)庞萍,使得系統(tǒng)不會被過高的壓力給擊垮。
缺點(diǎn)就是: 延遲高忘闻。
視頻編碼:
上傳的文件會很大钝计,處理一個VEDIO時(shí)間特別長。然后往消息隊(duì)列丟齐佳,這個VEDIO需要轉(zhuǎn)碼私恬。把這個事件轉(zhuǎn)移到其他機(jī)器去離線的做了。這樣就可以異步的完成炼吴。
TOPIC(訂閱發(fā)布模式)
好處:一份數(shù)據(jù)可以給多個消費(fèi)者
Messaging Architecture
橘色和紅色部分是需要考慮的践付。
一個是存儲(message store),一個是服務(wù)(broker)
single/multiple server : broker + message store(single/ multiple disks)
producer 和 consumer 會經(jīng)過 broker 進(jìn)行通訊缺厉。
CONSUMER 上下線的問題,如何知道上次讀到哪里
BROKER 是否要重傳
用戶最關(guān)心的是:Delivery semantics
消息 at most once 最多只發(fā)一次
at least once 最少一次
exactly once 只被消費(fèi)一次
使用者的角度隧土,消息能不能丟提针?
消息能不能重復(fù)?
No retries -> at most once
retries -> at least once
exactly once -> retires + mechanism (de-duplication, transaction)
producer 需要自己產(chǎn)生ID曹傀,然后去重辐脖。
保證至少一次的設(shè)計(jì)。
當(dāng)BROKER投遞了一個消息后皆愉,把這個消息從發(fā)送隊(duì)里移除嗜价,加入到PENDING隊(duì)列艇抠。
如果對面沒有發(fā)ACK,過了很久久锥,這個時(shí)候要把消息從PENDING隊(duì)列重新加回發(fā)送隊(duì)列家淤。
如果收到ACK,就從PENDING隊(duì)列里REMOVE瑟由。