您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 > 

03 消息訂閱機制(app推送用戶消息的時間基于什么原則進行選擇的)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-05-15 09:28:07【】8人已围观

简介力,因此從集群的整體考慮,有多少個partitions就意味著有多少個"leader",kafka會將"leader"均衡的分散在每個實例上,來確保整體的性能穩定。ProcersProcer將消息發布

力,因此從集群的整體考慮,有多少個partitions就意味著有多少個"leader",kafka會將"leader"均衡的分散在每個實例上,來確保整體的性能穩定。

Procers

Procer將消息發布到指定的Topic中,同時Procer也能決定將此消息歸屬于哪個partition;比如基于"round-robin"方式或者通過其他的一些算法等。

Consumers

本質上kafka只支持Topic。每個買粉絲nsumer屬于一個買粉絲nsumer group;反過來說,每個group中可以有多個買粉絲nsumer。發送到Topic的消息,只會被訂閱此Topic的每個group中的一個買粉絲nsumer消費。

如果所有的買粉絲nsumer都具有相同的group,這種情況和queue模式很像;消息將會在買粉絲nsumers之間負載均衡。

如果所有的買粉絲nsumer都具有不同的group,那這就是"發布-訂閱";消息將會廣播給所有的消費者。

在kafka中,一個partition中的消息只會被group中的一個買粉絲nsumer消費;每個group中買粉絲nsumer消息消費互相獨立;我們可以認為一個group是一個"訂閱"者,一個Topic中的每個partions,只會被一個"訂閱者"中的一個買粉絲nsumer消費,不過一個買粉絲nsumer可以消費多個partitions中的消息。kafka只能保證一個partition中的消息被某個買粉絲nsumer消費時,消息是順序的。事實上,從Topic角度來說,消息仍不是有序的。

Kafka的設計原理決定,對于一個topic,同一個group中不能有多于partitions個數的買粉絲nsumer同時消費,否則將意味著某些買粉絲nsumer將無法得到消息。

Guarantees

Kafka就比較適合高吞吐量并且允許少量數據丟失的場景,如果非要保證“消息可靠傳輸”,可以使用JMS。

Kafka Procer 消息發送有兩種方式(配置參數 procer.type):

對于同步方式(procer.type=sync)?Kafka Procer 消息發送有三種確認方式(配置參數 acks):

kafka的設計初衷是希望作為一個統一的信息收集平臺,能夠實時的收集反饋信息,并需要能夠支撐較大的數據量,且具備良好的容錯能力。

持久性

kafka使用文件存儲消息,這就直接決定kafka在性能上嚴重依賴文件系統的本身特性。且無論任何OS下,對文件系統本身的優化幾乎沒有可能。文件緩存/直接內存映射等是常用的手段。因為kafka是對日志文件進行append操作,因此磁盤檢索的開支是較小的;同時為了減少磁盤寫入的次數,broker會將消息暫時buffer起來,當消息的個數(或尺寸)達到一定閥值時,再flush到磁盤,這樣減少了磁盤IO調用的次數。

性能

需要考慮的影響性能點很多,除磁盤IO之外,我們還需要考慮網絡IO,這直接關系到kafka的吞吐量問題。kafka并沒有提供太多高超的技巧;對于procer端,可以將消息buffer起來,當消息的條數達到一定閥值時,批量發送給broker;對于買粉絲nsumer端也是一樣,批量fetch多條消息。不過消息量的大小可以通過配置文件來指定。對于kafka broker端,似乎有個sendfile系統調用可以潛在的提升網絡IO的性能:將文件的數據映射到系統內存中,socket直接讀取相應的內存區域即可,而無需進程再次買粉絲py和交換。 其實對于procer/買粉絲nsumer/broker三者而言,CPU的開支應該都不大,因此啟用消息壓縮機制是一個良好的策略;壓縮需要消耗少量的CPU資源,不過對于kafka而言,網絡IO更應該需要考慮。可以將任何在網絡上傳輸的消息都經過壓縮。kafka支持gzip/snappy等多種壓縮方式。

生產者

負載均衡: procer將會和Topic下所有partition leader保持socket連接;消息由procer直接通過socket發送到broker,中間不會經過任何“路由層“。事實上,消息被路由到哪個partition上,有procer客戶端決定。比如可以采用“random““key-hash““輪詢“等,如果一個topic中有多個partitions,那么在procer端實現“消息均衡分發“是必要的。

其中partition leader的位置(host:port)注冊在zookeeper中,procer作為zookeeper client,已經注冊了watch用來監聽partition leader的變更事件。

異步發送:將多條消息暫且在客戶端buffer起來,并將他們批量的發送到broker,小數據IO太多,會拖慢整體的網絡延遲,批量延遲發送事實上提升了網絡效率。不過這也有一定的隱患,比如說當procer失效時,那些尚未發送的消息將會丟失。

消費者

買粉絲nsumer端向broker發送“fetch”請求,并告知其獲取消息的offset;此后買粉絲nsumer將會獲得一定條數的消息;買粉絲nsumer端也可以重置offset來重新消費消息。

在JMS實現中,Topic模型基于push方式,即broker將消息推送給買粉絲nsumer端。不過在kafka中,采用了pull方式,即買粉絲nsumer在和broker建立連接之后,主動去pull(或者說fetch)消息;這中模式有些優點,首先買粉絲nsumer端可以根據自己的消費能力適時的去fetch消息并處理,且可以控制消息消費的進度(offset);此外,消費者可以良好的控制消息消費的數量,batch fetch。

其他JMS實現,消息消費的位置是有prodiver保留,以便避免重復發送消息或者將沒有消費成功的消息重發等,同時還要控制消息的狀態。這就要求JMS broker需要太多額外的工作。在kafka中,partition中的消息只有一個買粉絲nsumer在消費,且不存在消息狀態的控制,也沒有復雜的消息確認機制,可見kafka broker端是相當輕量級的。當消息被買粉絲nsumer接收之后,買粉絲nsumer可以在本地保存最后消息的offset,并間歇性的向zookeeper注冊offset。由此可見,買粉絲nsumer客戶端也很輕量級。

對于JMS實現,消息傳輸擔保非常直接:有且只有一次(exactly once)。

在kafka中稍有不同:

at most once: 消費者fetch消息,然后保存offset,然后處理消息;當client保存offset之后,但是在消息處理過程中出現了異常,導致部分消息未能繼續處理。那么此后"未處理"的消息將不能被fetch到,這就是"at most once"。

at least once: 消費者fetch消息,然后處理消息,然后保存offset。如果消息處理成功之后,但是在保存offset階段zookeeper異常導致保存操作未能執行成功,這就導致接下來再次fetch時可能獲得上次已經處理過的消息,這就是"at least once",原因offset沒有及時的提交給zookeeper,zookeeper恢復正常還是之前offset狀態。

exactly once: kafka中并沒有嚴格的去實現(基于2階段提交,事務),我們認為這種策略在kafka中是沒有必要的。

通常情況下“at-least-once”是我們首選。(相比at most once而言,重復接收數據總比丟失數據要好)。

kafka高可用由多個broker組成,每個broker是一個節點;

創建一個topic,這個topic會劃分為多個partition,每個partition存在于不同的broker上,每個partition就放一部分數據。

kafka是一個分布式消息隊列,就是說一個topic的數據,是分散放在不同的機器上,每個機器就放一部分數據。

在0.8版本以前,是沒有HA機制的,就是任何一個broker宕機了,那個broker上的partition就廢了,沒法寫也沒法讀,沒有什么高可用性可言。

0.8版本以后,才提供了HA機制,也就是就是replica副本機制。每個partition的數據都會同步到其他的機器上,形成自己的多個replica副本。然后所有replica會選舉一個leader出來,那么生產和消費都跟這個leader打交道,然后其他replica就是follower。

寫的時候,leader會負責把數據同步到所有follower上去,讀的時候就直接讀leader上數據即可。

kafka會均勻的將一個partition的所有replica分布在不同的機器上,從而提高容錯性。

如果某個broker宕機了也沒事,它上面的partition在其他機器上都有副本的,如果這上面有某個partition的leader,那么此時會重新選舉一個新的leader出來,大家繼續讀寫那個新的leader即可。這就有所謂的高可用性了。

寫數據的時候,生產者就寫leader,然后leader將數據落地寫本地磁盤,接著其他follower自己主動從leader來pull數據。一旦所有follower同步好數據了,就會發送ack給leader,leader收到所有follower的ack之后,就會返回寫成功的消息給生產者。

消息丟失會出現在三個環節,分別是生產者、mq中間件、消費者:

RabbitMQ

Kafka

大體和RabbitMQ相同。

Rabbitmq

需要保證順序的消息投遞到同一個queue中,這個queue只能有一個買粉絲nsumer,如果需要提升性能,可以用內存隊列做排隊,然后分發給底層不同的worker來處理。

Kafka

寫入一個partition中的數據一定是有序的。生產者在寫的時候 ,可以指定一個key,比如指定訂單id作為key,這個訂單相關數據一定會被分發到一個partition中去。消費者從partition中取出數據的時候也一定是有序的,把每個數據放入對應的一個內存隊列,一個partition中有幾條相關數據就用幾個內存隊列,消費者開啟多個線程,每個線程處理一個內存隊列。

怎樣徹底清除買粉絲訂閱號聊天信息記錄?

進入訂閱號頁面可以操作一鍵清除

很赞哦!(8954)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款的名片

职业:程序员,设计师

现居:广东佛山南海区

工作室:小组

Email:[email protected]