個人經營的讀書打卡羣,一衆志同道合的人,聚在一個羣裏,每天至少閱讀15分鐘,然後拍照或截屏在羣裏打卡,同時,簡短的分享一下自己的心得,日復一日,月復一月,我們終將發現閱讀的力量。歡迎喜歡閱讀的你加入(加入時需要推薦2本自己閱讀的書才能入羣,以表示你確實在閱讀)
限100人以內,羣二維碼:
以下爲正文:
第五章 大數據利器之Elasticsearch
5.1、Lucene介紹
Lucent採用了基於倒排表的設計原理,可以非常高效地實現文本查找,在底層採用了分段的存儲模式,使他在讀寫時幾乎完全避免了鎖的出現,大大提升了讀寫性能。
5.1.1、核心模塊
— analysis模塊:分詞
— index模塊:建索引
— store模塊:負責索引讀寫
— queryParser:語法分析
— search模塊:對索引的搜索
— similarity模塊:負責相關性打分和排序的實現
5.1.2、核心術語
— Term:單詞,索引裏最小的存儲和查詢單元
— 詞典:Term的集合,詞典的數據結構有HashMap(性能高,浪費空間),fst(finite-state transducer)有更好的數據壓縮和查詢效率
— 倒排表:記錄的是某個詞在哪些文章出現過
— 正向信息:原始的文檔信息,可以用來做排序、聚合、展示
— 段:索引中最小的存儲單元,只讀不能寫
5.1.3、檢索方式
1、單詞查詢
2、AND
3、OR
4、NOT
5.1.4、分段存儲
段不變性的有點:
— 不需要鎖
— 可以常駐內存
— 緩存友好
— 增量創建
段不變性的缺點:
— 刪除時,舊數據不會立即被刪除,而是標記爲.del,等到段更新時才真正的刪除
— 更新由刪除和新增組成
— 由於索引具有不變性,每次新增數據時,都需要新增一個段來存儲數據
— 查詢出來的數據需要對已刪除的數據進行過濾
爲了提升寫的性能,Lucene採用了延遲寫的策略。先寫內存,然後批量寫入磁盤,若有一個段被寫到磁盤,則生成一個提交點。
5.1.5、段合併策略
爲了控制所有裏段的數量,我們必須定期進行段的合併操作
5.1.6、Lucene相似度打分
1、文本相似度的主要影響因子
— tf:詞頻,其值越大,這篇文章描述的內容與該詞越接近
— idf:(inverse document frequency),表示整個文檔包含某個詞的文檔數量越少,這個便越重要
— length:同等條件下,搜索詞所在的文檔長度越長,搜索詞和文檔的相似度就越低;文檔長度越短,相似度就越高
— term boost:查詢在語句中每個詞的權重
— document boost:文檔權重
— field boost:域的權重,就是字段權重
— query boost:查詢條件的權重
2、基於向量空間模型
向量空間模型的主要思路是把文本信息映射到空間向量中,形成文本信息和向量數據的映射關係,然後通過計算幾個或者多個不同的向量的差異,來計算文本的相似度
3、基於概率的模型
BM25算法是根據BIM算法改進而來的,目前爲止,是優秀的排名算法
5.2、Elastisearch簡介
5.2.1、核心概念
— Cluster:集羣
— Node
— Shards:分片
— Replicas:副本
— Index:索引
— Type:類別
— Document:文檔
— Settings:集羣中索引的定義
— Mapping,類似關係數據庫的表結構信息
— Analyzer:字段的分詞方式的定義
Elastic search的節點分類如下:
— 主節點,負責創建索引、刪除索引、分配分片、追蹤集羣中的節點狀態
— 數據節點,負責數據的存儲和相關具體操作,如索引的創建、修改、刪除、搜索、聚合
— 客戶端節點,既不是候選主節點也不是數據節點的節點
— 部落節點,跨越多個集羣
— 協調節點,任何節點都可以成爲協調節點
集羣的狀態有紅黃綠三種。
5.2.2、3C和腦裂
1、共識性(Consensus),分佈式系統中所有節點必須對給定的數據或者節點的狀態達成共識(zen discovery)
2、併發(Concurrency),
— 樂觀併發控制(OCC),解決寫-寫衝突的無鎖併發控制
— 多版本併發控制:使用版本號控制
3、一致性(Consistency)
三種允許寫操作的判斷
— One:只要主分片可用,就寫
— All:只有當主分片和所有副本都可用時,才允許寫操作
— Quorum:默認選項,一半以上節點可用就寫
4、腦裂
集羣中出現多個主節點時,可能會丟失數據,這種現象稱爲腦裂
5.2.3、事務日誌
內存裏的日誌不可搜索,文件系統裏的日誌可以搜索
第六章 全面揭祕分佈式定時任務
6.1、什麼是定時任務
常用定時任務
1、crontab命令
Linux下的任務調度分爲兩類,系統任務調度和用戶任務調度
— 系統任務調度:操作系統保存一個針對整個系統的crontab文件,該文件通常存放於/etc或者/etc的子目錄下面
— 用戶任務調度:每個用戶都有自己的crontab文件,所有用戶定義的文件都存放於/var/spool/cron目錄中,文件名與用戶名一致
crontab配置文件格式說明:
# * * * * * command
# | | | | | |
# | | | | | --要執行的命令
# | | | | —星期(0-7,星期日爲0或7)
# | | | —月(1-12)
# | | —日(1-31)
# | —小時(0-23)
# —分鐘(0-59)
— 以逗號隔開表示一個列表範圍
— 連字符,指定值得範圍
— 星號,代表任何的值
— 正斜線,指定時間的頻率
— -u 設定某個用戶的crontab文件
— file,命令文件的名稱
— -e 編輯某個用戶的crontab文件
— -l 用於顯示某個用戶的crontab文件
— -r 用於刪除某個用戶的crontab文件
— -i 用於在刪除用戶crontab文件時給出提示
2、JDKTimer
是一個單線程,定時調度所有TimerTask任務
Timer類的主要函數:Timer,schedule,然後重新run方法
Timer類的缺陷:
— 時間不準確延遲
— 異常終止
— 執行週期任務時依賴系統時間
3、ScheduleExecutor
每個調度任務都會有線程池中的一個線程去執行,因此任務是併發執行的。
ScheduleExecutor與Timer相比:
— 可以解決Timer不準時延遲的問題
— 多線程併發,能做到線程隔離
— 不依賴系統時間的變化而發生執行上的變化
— 執行過程中拋出異常,就會停止
4、Spring Schedule
主要包括TaskExecutor、TaskSchedule、Trigger三個抽象接口
5、Quartz,開源項目
框架的核心對象如下:
— Job,表示一個工作,爲要執行的具體內容
— JobDetail,任務調度細節
— Trigger,執行任務的規則
— Schedule,代表一個任務調度容器
6、cron表達式
在線表達式工具(http://www.pppet.net)
6.2、分佈式定時任務
6.2.1、定時任務使用場景
— 業務需求
— 產品運營
— 運維管理
6.2.2、傳統定時任務存在的問題
1、只在一臺服務器上運行
2、通過配置參數分散運行
3、通過全局鎖互斥執行
6.2.3、分佈式定時任務及其原理
分佈式定時任務特點:
— 高可用性
— 可伸縮性
— 負載均衡
— 失效轉移
分佈式鎖有3種實現方式
— 基於數據庫的實現方式,依靠數據庫的全局索引實現
— 基於Redis的實現方式
— 基於zookeeper的實現方式
1、永久節點
2、臨時節點
3、順序節點
6.3、開源分佈式定時任務的用法
6.3.1、Quartz的分佈式模式
6.3.2、TBSchedule(阿里巴巴開源的分佈式調度框架)
6.3.3、Elastic-Job
噹噹網開源的分佈式調度解決方案
第七章 RPC服務的發展歷程和對比分析
7.1、什麼是RPC服務
RPC協議是一種通過網絡向遠程計算機請求服務,而不需要了解底層網絡技術的協議。
RPC有以下優勢:
— 簡單
— 高效
— 通用
7.2、RPC的服務原理
7.2.1、Socket套接字
雙向通信
7.2.2、RPC的調用過程
step1 客戶端調用本地的客戶端存根方法
step2 客戶端存根通過系統調用,使用操作系統內核套接字向遠程服務發送編碼的網絡消息
step3 網絡消息由內核通過TCP/UDP傳輸到遠程服務器
step4 服務端存根接收客戶端消息,並對消息進行解碼
step5 服務端存根調用服務端方法,並將從客戶端接收到的參數傳遞給該方法
step6 服務端執行完成後,把返回結果存入服務端存根代碼中
step7 服務端存根將返回值編碼並序列化後,通過一個或多個網絡消息返回給客戶端
step8 消息通過網絡傳輸給客戶端
step9 客戶端從本地存根讀取本地套接字消息
step10 客戶端存根將消息返回給客戶端函數,並將消息從網絡二進制轉換爲本地語言格式