剛入公司的兩周多,對cdx專案有了進一步的認識和理解,在這基礎上,也開始了解部門內部甚至公司提供的一些中間服務。cdx專案中涉及到的二方服務和三方服務很多,從之前寫過的sso,auth,到三方相簿的各個介面,以及儲存的雲服務gift,以及今天說到的內搜系統。
由於內搜推送資訊是到乙個kafka佇列中消費,雖然作為業務開發不涉及訊息中介軟體的建設,但還是希望能了解內部選型的一些思想,一點一點學習和理解部門的各個服務。這裡我也參加了內部的一些分享,想說說自己對kafka的初識吧。
首先是kafka的官方介紹和原理:
apache kafka是分布式發布-訂閱訊息系統。它最初由linkedin公司開發,之後成為apache專案的一部分。kafka是一種快速、可擴充套件的、設計內在就是分布式的,分割槽的和可複製的提交日誌服務。
組成:
訊息推送方式:push,pull
這裡有一副對比圖很好的說明了兩種情況的優劣,kafka是使用pull的方式。
消費機制三種:
at most once—consumer先記錄log再消費,這樣訊息可能會丟失造成沒有消費,但不會重複消費。
at least once—consumer先消費了再記錄log,這樣保證訊息一定被消費,但有可能重複。(聽了ep的分享好像目前使用的是這種)
exactly once—確保消費並且確保只消費一次,這種是最理想的狀態(同時處理訊息並把result和log同時寫入)。
儲存策略:
1)kafka以topic來進行訊息管理,每個topic包含多個partition,每個partition對應乙個邏輯log,有多個segment組成。
2)每個segment中儲存多條訊息,訊息id由其邏輯位置決定,即從訊息id可直接定位到訊息的儲存位置,避免id到位置的額外對映。
3)每個part在記憶體中對應乙個index,記錄每個segment中的第一條訊息偏移。
4)發布者發到某個topic的訊息會被均勻的分布到多個partition上(或根據使用者指定的路由規則進行分布),broker收到發布訊息往對應partition的最後乙個segment上新增該訊息,當某個segment上的訊息條數達到配置值或訊息發布時間超過閾值時,segment上的訊息會被flush到磁碟,只有flush到磁碟上的訊息訂閱者才能訂閱到,segment達到一定的大小後將不會再往該segment寫資料,broker會建立新的segment。
上面這四條是標準的乙個敘述,我想針對其中兩點進行說明:
1. partition路由分配規則:一種是輪詢方式,這樣會保證訊息分部均勻,但是沒有邏輯上的區分;另外一種是指定路由規則(比如hash方法),這樣可以進行一定的對映,如將統一使用者的分到一片等等。
2.持久化方式:log分為.index和.log檔案,檔案都會有乙個offset偏移量,記得聽人分享過,使用了linux核心sendfile函式直接進行隨機寫的操作,提高了效率。
另外,關於kafka與zk的協調配置還需要我去學習(不過好像kafka的新版本offset是儲存在自己伺服器上的,不借助zk來儲存)。
來了公司發現很多東西都停留理論層面,需要學習和實踐的還有很多,希望自己能不斷進步吧。
由內而外,相由心生
我們看乙個人,可以看他的相,但是不要完全就這個相來論這個人,不要我們第一眼看過去看他什麼,看他的眼睛,乙個人眼睛呢他露了凶光,他很 這個人你就要一定小心,他眼睛很暗淡,他沒有什麼力量更談不上有什麼神,這個人運氣不會好,我講這些跟迷信沒有一點關係,沒有,因為他是你內心在外面的乙個表現,我在說一遍啊,人...
lucene RangeQuery範圍內搜尋
queryparser可以使用 起始 to 終止 表示式,起始 to 終止 表示式來構造rangequery物件。private term begin,end begin new term pubmonth 201001 end newterm pubmonth 201501 rangequery ...
由內而外全面造就自己
品德成功論提醒人們,高效能的生活是有基本原則的,只有當人們學會並遵循這些原則,把它們融入到自己的品德中去,才能享受真正的成功與恆久的幸福。只重技巧就彷彿考前臨時抱佛腳,縱使有時順利過關,甚至成績還不錯,但沒有日積月累的付出,絕對無法學得精通。思維定式以及入如何實現思維定式的轉換 條件作用對人類認知和...