關(guān)于我們
書單推薦
新書推薦
|
高性能之道: SRE視角下的運維架構(gòu)實踐 讀者對象:本書適合互聯(lián)網(wǎng)行業(yè)內(nèi)的運維人員、SRE和DevOps工程師、架構(gòu)師、技術(shù)團隊負(fù)責(zé)人及關(guān)注用戶體驗的相關(guān)開發(fā)者閱讀,也適合掌握了一定的SRE方法論但在實踐中無從下手的讀者閱讀。
本書從實踐出發(fā),包括了作者參與并主導(dǎo)的3家電商互聯(lián)網(wǎng)公司架構(gòu)從0到1的構(gòu)建經(jīng)歷,從多個角度講解穩(wěn)定、性能、效率、成本四大職責(zé)落地經(jīng)驗,并結(jié)合Mikey金字塔進(jìn)行了部分創(chuàng)新,很多內(nèi)容都可以直接復(fù)用于實際工作。本書分為7篇,分別是開端篇、監(jiān)控篇、故障篇、容量篇、全局視角篇、性能篇和擴展篇。 本書適合互聯(lián)網(wǎng)行業(yè)內(nèi)的運維人員、SRE和DevOps工程師、架構(gòu)師、技術(shù)團隊負(fù)責(zé)人及關(guān)注用戶體驗的相關(guān)開發(fā)者閱讀,也適合掌握了一定的SRE方法論但在實踐中無從下手的讀者閱讀。
王力,資深技術(shù)老兵,《Nginx實戰(zhàn):基于Lua語言的配置、開發(fā)與架構(gòu)詳解》和《高性能之道:SRE視角下的運維架構(gòu)實踐》作者。15年互聯(lián)網(wǎng)從業(yè)經(jīng)驗,其中有9年電商互聯(lián)網(wǎng)開發(fā)和運維經(jīng)驗,這期間擔(dān)任過微拍堂運維專家、阿里技術(shù)專家、折800運維架構(gòu)師等,并有5年主導(dǎo)電商大促活動保障的落地經(jīng)驗,推進(jìn)過折800、微拍堂兩家電商平臺運維架構(gòu)從0到1的建設(shè),精通服務(wù)的穩(wěn)定性建設(shè),精通高并發(fā)場景下的性能優(yōu)化和中間件開發(fā),擅長通過架構(gòu)設(shè)計來優(yōu)化系統(tǒng)復(fù)雜度、降本增效。本書提供了一些補充內(nèi)容(比如對軟件安裝、配置的講解等),大家可以搜微信公眾號“SRE基礎(chǔ)架構(gòu)”進(jìn)行查閱。
目 錄
開端篇 弱化邊界感 第1章 引言 3 1.1 運維架構(gòu)和SRE 3 1.2 理解業(yè)務(wù),技術(shù)為業(yè)務(wù)服務(wù) 5 1.3 不設(shè)邊界 6 1.4 SRE金字塔 6 1.5 總結(jié) 7 第2章 重視測試環(huán)境和預(yù)發(fā)布環(huán)境 8 2.1 提效和維穩(wěn)的第一道門檻——測試環(huán)境 9 2.1.1 低級錯誤 9 2.1.2 提效分析 10 2.2 “守門員”——預(yù)發(fā)布環(huán)境 11 2.2.1 低級錯誤 11 2.2.2 提效分析 12 2.3 兩大環(huán)境問題根本原因溯源 12 2.4 微拍堂測試環(huán)境治理思路介紹 13 2.5 總結(jié) 17 監(jiān)控篇 底層邏輯的藝術(shù) 第3章 淺談監(jiān)控系統(tǒng)設(shè)計 21 3.1 梳理監(jiān)控體系 21 3.2 梳理監(jiān)控指標(biāo) 22 3.3 變更監(jiān)控 25 3.4 準(zhǔn)實時系統(tǒng)監(jiān)控 25 3.5 短時進(jìn)程追蹤工具 27 3.6 全鏈路監(jiān)控 27 3.7 商業(yè)監(jiān)控平臺的選用建議 28 3.8 監(jiān)控方式:白盒監(jiān)控與黑盒監(jiān)控 29 3.9 從監(jiān)控數(shù)據(jù)中總結(jié)規(guī)律 30 3.10 黃金指標(biāo) 30 3.11 總結(jié) 31 第4章 云原生可觀測性開源工具——Kindling 32 4.1 行業(yè)現(xiàn)狀 32 4.2 Kindling解決方案——關(guān)聯(lián)內(nèi)核可觀測性數(shù)據(jù)的Trace 34 4.3 Kindling探針的架構(gòu)設(shè)計理念 37 4.4 Kindling探針架構(gòu) 38 4.4.1 內(nèi)核態(tài)程序:drivers 38 4.4.2 用戶態(tài)C/C++程序:kindling-probe 38 4.4.3 用戶態(tài)Go程序:kindling-collector 39 4.4.4 程序間通信方式 40 4.5 在線Demo介紹 41 4.6 案例分享 42 4.6.1 安裝 43 4.6.2 功能介紹 44 4.6.3 穩(wěn)定性價值 47 4.7 總結(jié) 48 第5章 高階實戰(zhàn)——打造可持續(xù)維護(hù)的閉環(huán)流程 49 5.1 案例:動態(tài)觀測SQL質(zhì)量流程設(shè)計 50 5.1.1 分析規(guī)范難以落地的原因 50 5.1.2 監(jiān)督與管控流程設(shè)計 51 5.1.3 通知和統(tǒng)計 57 5.2 案例:WebP格式圖片的規(guī)范和落地實踐 57 5.2.1 規(guī)范無法持續(xù)推廣 57 5.2.2 成本和用戶體驗上的雙贏 58 5.2.3 計劃實施 60 5.2.4 管控機制 60 5.2.5 采集數(shù)據(jù)信息和數(shù)據(jù)加工處理 60 5.2.6 巡檢平臺之規(guī)范化監(jiān)督 61 5.3 案例:管道通信規(guī)范化實踐 62 5.3.1 我們每天都在使用管道 62 5.3.2 管道示例場景及性能說明 64 5.3.3 如何規(guī)范管道使用場景 66 5.4 標(biāo)準(zhǔn)和規(guī)范治理平臺 67 5.4.1 現(xiàn)狀 68 5.4.2 設(shè)計思路 68 5.5 總結(jié) 72 第6章 挖掘Nginx的監(jiān)控價值 73 6.1 URI指紋服務(wù)設(shè)計 73 6.2 Nginx日志分析指南 76 6.2.1 參數(shù)白名單 76 6.2.2 URI的響應(yīng)時間和HTTP狀態(tài)監(jiān)控 77 6.2.3 URI響應(yīng)字節(jié)數(shù)波動分析 77 6.2.4 查詢URL請求的項目 79 6.2.5 注意HTTPS的透傳 80 6.2.6 利用Nginx完成動態(tài)全鏈路比例調(diào)整 81 6.3 總結(jié) 82 故障篇 故障的生命周期 第7章 事前治理的方法論 85 7.1 從故障中總結(jié)經(jīng)驗 85 7.2 從系統(tǒng)資源層面和日志中巡檢異常 86 7.3 從標(biāo)準(zhǔn)和規(guī)范中尋找閉環(huán)之路 86 7.4 從業(yè)務(wù)中挖掘基礎(chǔ)服務(wù)的使用問題 87 7.5 技術(shù)風(fēng)險防控運營成本 87 7.6 總結(jié) 88 第8章 變更管控設(shè)計思路 89 8.1 變更管控 89 8.1.1 變更對象 89 8.1.2 變更發(fā)布 90 8.1.3 變更可灰度 91 8.1.4 變更可回滾 92 8.1.5 變更可監(jiān)控 92 8.1.6 配置項變更 92 8.1.7 變更管控思路 92 8.2 JumpServer使用的藝術(shù)及工單交互 96 8.3 變更三板斧:運維團隊的可監(jiān)控、可灰度、可回滾實踐 98 8.3.1 案例:云服務(wù)器資源伸縮穩(wěn)定性 98 8.3.2 案例:CDN OpenResty的變更策略 102 8.4 總結(jié) 106 第9章 輪值的設(shè)計思路 107 9.1 值班模式探究 108 9.1.1 讓開發(fā)人員參與其中 108 9.1.2 制定KPI 109 9.1.3 值班人員的邊界探討 110 9.2 值班機器人 111 9.3 提升值班價值——SRE需求池設(shè)計 112 9.3.1 結(jié)合日常巡檢與非值班時間 112 9.3.2 在煩瑣的工作中收集需求 112 9.4 總結(jié) 113 第10章 故障演練與應(yīng)急預(yù)案 114 10.1 故障演練緣由 114 10.1.1 更好地面對系統(tǒng)規(guī)模增長帶來的復(fù)雜性 115 10.1.2 提升故障的排查速度 115 10.1.3 驗證應(yīng)急預(yù)案的正確性 115 10.1.4 驗證基礎(chǔ)設(shè)施的穩(wěn)定性 116 10.1.5 驗證監(jiān)控感知能力 116 10.1.6 驗證應(yīng)急流程的順暢度 116 10.2 故障演練流程 116 10.2.1 故障演練場景關(guān)鍵要素 116 10.2.2 故障演練預(yù)期 117 10.3 應(yīng)急預(yù)案 119 10.3.1 應(yīng)急場景標(biāo)準(zhǔn)化 120 10.3.2 梳理應(yīng)急預(yù)案清單 120 10.4 總結(jié) 121 第11章 應(yīng)急響應(yīng)流程實踐 122 11.1 收攏故障上報來源 122 11.1.1 從技術(shù)體系內(nèi)部發(fā)現(xiàn) 122 11.1.2 從技術(shù)體系外部發(fā)現(xiàn) 123 11.2 建立應(yīng)急小組 123 11.2.1 人多力量弱 123 11.2.2 穩(wěn)定性接口人和崗位權(quán)限 123 11.2.3 完善客訴標(biāo)準(zhǔn)化術(shù)語 124 11.3 故障噪點治理 124 11.3.1 報警治理 124 11.3.2 設(shè)計外部反饋閾值 125 11.3.3 收集第三方抖動事件 125 11.4 控制應(yīng)急節(jié)奏 126 11.4.1 舍小保大 126 11.4.2 “優(yōu)先止血”,后續(xù)定位根本原因 127 11.4.3 及時同步信息,減少信息差 127 11.5 應(yīng)急“止血”的常見操作 127 11.5.1 代碼回滾 127 11.5.2 重啟 128 11.5.3 時序監(jiān)控下的限流、熔斷、擴容 129 11.5.4 業(yè)務(wù)降級 130 11.5.5 阻斷慢查詢 131 11.5.6 網(wǎng)絡(luò)與運營商 131 11.5.7 重識監(jiān)控 132 11.6 總結(jié) 132 第12章 靜態(tài)容災(zāi)降級系統(tǒng) 133 12.1 荊棘之路 134 12.2 設(shè)計之路 136 12.3 架構(gòu)流程圖 138 12.3.1 反向代理系統(tǒng) 138 12.3.2 日志分析系統(tǒng) 138 12.3.3 后臺系統(tǒng)——利用URI指紋服務(wù) 138 12.3.4 爬蟲系統(tǒng) 139 12.3.5 容災(zāi)的緩存系統(tǒng) 140 12.3.6 基于時間的版本用途 140 12.3.7 異地容災(zāi) 141 12.4 核心代碼解說 142 12.4.1 Ngx_Lua應(yīng)用 142 12.4.2 爬蟲和日志分析系統(tǒng)的關(guān)系 143 12.4.3 完全容災(zāi)和部分容災(zāi)功能 144 12.5 靜態(tài)容災(zāi)的智能關(guān)閉方案 145 12.5.1 從日志分析系統(tǒng)復(fù)制請求 145 12.5.2 利用GoReplay復(fù)制流量 145 12.5.3 利用Nginx的mirror鏡像功能 146 12.5.4 灰度驗證容災(zāi)系統(tǒng)緩存——閉環(huán)設(shè)計 147 12.6 替換爬蟲的新思路 148 12.7 總結(jié) 148 第13章 基于OpenResty的動態(tài)限流設(shè)計思路 150 13.1 常見反向代理限流方案缺點分析 150 13.2 動態(tài)限流設(shè)計思路 151 13.3 多維度限流 154 13.4 智能感知響應(yīng)能力動態(tài)控速設(shè)計方案 157 13.5 屏蔽慢請求帶來的服務(wù)阻塞 159 13.6 總結(jié) 160 第14章 故障復(fù)盤 161 14.1 復(fù)盤前 161 14.2 復(fù)盤中 161 14.3 復(fù)盤后 164 14.4 自省 164 14.5 跨部門分享 165 14.6 故障庫 165 14.7 總結(jié) 165 容量篇 性能與成本間的平衡 第15章 成本優(yōu)化 169 15.1 成本優(yōu)化事前準(zhǔn)備 169 15.1.1 目標(biāo)的制定和價值體現(xiàn) 170 15.1.2 IT成本與人力成本的權(quán)衡 170 15.1.3 提升對系統(tǒng)的理解 171 15.1.4 評估優(yōu)化前后的數(shù)據(jù)統(tǒng)計及業(yè)務(wù)影響 171 15.1.5 從用戶體驗看待成本優(yōu)化 173 15.1.6 梳理業(yè)務(wù)和資源的關(guān)系 173 15.2 公有云基礎(chǔ)資源優(yōu)化實踐 174 15.2.1 成本管理白皮書 174 15.2.2 合理化資源使用率 177 15.2.3 自建產(chǎn)品和云產(chǎn)品的使用場景優(yōu)化 178 15.2.4 基于業(yè)務(wù)場景的成本控制 179 15.3 總結(jié) 180 第16章 智能伸縮平臺 181 16.1 彈性伸縮平臺關(guān)鍵路徑盤點 181 16.2 基礎(chǔ)設(shè)施建設(shè) 182 16.2.1 基于Pod的HPA傳統(tǒng)模式 182 16.2.2 基于Cluster-Autoscaler的Node伸縮 184 16.3 基于業(yè)務(wù)場景的實戰(zhàn) 189 16.3.1 定時伸縮 189 16.3.2 基于預(yù)測的彈性伸縮 191 16.4 風(fēng)險控制體系 199 16.4.1 動態(tài)限流觸發(fā)規(guī)則 199 16.4.2 擴容節(jié)點失敗和業(yè)務(wù)降級 200 16.5 總結(jié) 200 第17章 容量規(guī)劃 201 17.1 容量規(guī)劃現(xiàn)狀 201 17.2 容量規(guī)劃建設(shè)思路 202 17.2.1 建設(shè)核心 202 17.2.2 建設(shè)思路 203 17.3 應(yīng)用系統(tǒng)容量規(guī)劃說明 204 17.4 基于巡檢模式的容量評估流程 205 17.4.1 對流量來源的梳理 205 17.4.2 對容量對象的梳理 206 17.4.3 收集日常關(guān)鍵性數(shù)據(jù) 207 17.5 對容量規(guī)劃關(guān)注點的梳理 210 17.5.1 壓力測試 210 17.5.2 業(yè)務(wù)放量 212 17.5.3 大促活動 213 17.5.4 秒殺業(yè)務(wù) 214 17.5.5 關(guān)注運營活動計劃 214 17.5.6 尖刺限流 215 17.6 總結(jié) 215 第18章 編程能力 216 18.1 養(yǎng)成寫偽代碼的習(xí)慣 216 18.2 養(yǎng)成管理代碼的習(xí)慣 217 18.3 編程能力分級 218 18.4 編程能力更深層的價值探討 219 18.4.1 如何看待PHP短連接問題 219 18.4.2 理解Redis和Memcached在業(yè)務(wù)場景上的區(qū)別 220 18.4.3 進(jìn)程、線程、協(xié)程在Linux系統(tǒng)中的表現(xiàn) 221 18.4.4 探究阻塞和非阻塞、異步和同步在系統(tǒng)中的表現(xiàn) 223 18.4.5 共享內(nèi)存 224 18.4.6 嘗試一些導(dǎo)致進(jìn)程崩潰的操作 224 18.4.7 學(xué)習(xí)秒殺系統(tǒng)的業(yè)務(wù)架構(gòu) 225 18.4.8 給自己的代碼做閉環(huán)實踐 226 18.4.9 參與業(yè)務(wù)開發(fā)日常 226 18.5 熟悉編程語言特性 226 18.6 通過系統(tǒng)分析倒推應(yīng)用配置問題 227 18.6.1 通過access函數(shù)發(fā)現(xiàn)PHP性能問題 227 18.6.2 Java連接池失效 228 18.7 總結(jié) 229 全局視角篇 運維破圈 第19章 開啟測試視角 233 19.1 測試人員的職責(zé)邊界 233 19.2 壓力測試 234 19.2.1 壓測黑名單思維 235 19.2.2 壓測利器Wrk 235 19.2.3 流量鏡像工具GoReplay 235 19.3 自動化測試監(jiān)控平臺設(shè)計 237 19.3.1 “牽一發(fā)而動全身”的迭代 238 19.3.2 OpenDiffy介紹 238 19.3.3 變更管控的支撐系統(tǒng)OpenDiffy+GoReplay 239 19.4 破壞性測試探究 239 19.5 從前端的體驗“找碴兒” 240 19.5.1 基于瀏覽器特性的服務(wù)優(yōu)化 240 19.5.2 從圖片加載中尋找優(yōu)化方法 241 19.5.3 數(shù)據(jù)埋點的發(fā)送頻率 242 19.5.4 域名的使用限制 243 19.5.5 請求重復(fù)性 243 19.5.6 PageSpeed Insights分析頁面的加載 243 19.5.7 定期的內(nèi)耗分析 245 19.6 總結(jié) 245 第20章 開啟用戶視角 246 20.1 內(nèi)外兼顧 246 20.1.1 內(nèi)部用戶 247 20.1.2 外部用戶 248 20.2 建立反饋機制 249 20.2.1 優(yōu)化客服反饋機制 249 20.2.2 與客服合作的案例分享 249 20.2.3 獎勵機制 250 20.2.4 關(guān)注輿情 250 20.3 產(chǎn)品體驗——谷歌SRE的高階思維 251 20.3.1 不僅僅是體驗 251 20.3.2 交互煩瑣 252 20.3.3 無人問津 252 20.3.4 ROI 252 20.4 防御體系的“誤傷”指南 253 20.4.1 WAF“誤傷” 253 20.4.2 內(nèi)部風(fēng)控“誤傷” 254 20.5 關(guān)注客戶端環(huán)境 254 20.5.1 客戶端機型配置 254 20.5.2 網(wǎng)絡(luò) 255 20.6 總結(jié) 255 第21章 開啟前端和App開發(fā)人員視角 256 21.1 概述 256 21.2 為什么要解決性能問題 257 21.3 緩存 257 21.3.1 強緩存 257 21.3.2 協(xié)商緩存 259 21.4 網(wǎng)絡(luò)請求 261 21.4.1 HTTP/2.0 261 21.4.2 DNS預(yù)解析 262 21.4.3 預(yù)先建立連接 262 21.4.4 服務(wù)器應(yīng)該避免過多重定向 263 21.5 客戶端計算 263 21.6 預(yù)加載 265 21.7 梳理技術(shù)風(fēng)險 265 21.7.1 請求阻塞式串行加載 266 21.7.2 埋點發(fā)送過于頻繁 266 21.7.3 弱網(wǎng)下的資源加載降級 266 21.7.4 撥測 266 21.8 總結(jié) 267 第22章 DNS應(yīng)用場景實踐 268 22.1 利用DNS完成故障轉(zhuǎn)移 268 22.2 使用HTTPDNS提升訪問穩(wěn)定性 271 22.3 提升測試、A/B測試等環(huán)境的切換效率 273 22.4 域名反向解析用途實踐 273 22.5 內(nèi)部DNS系統(tǒng)高可用實踐 274 22.5.1 兩次DNS故障 275 22.5.2 問題和思考 276 22.5.3 改進(jìn)措施 278 22.5.4 配置及驗證 279 22.5.5 監(jiān)控 283 22.6 總結(jié) 284 性能篇 SRE進(jìn)階之路 第23章 高并發(fā)網(wǎng)關(guān)價值探究 287 23.1 通用功能介紹 287 23.2 網(wǎng)關(guān)中的聚合模式 288 23.2.1 Lura啟示錄 289 23.2.2 APISIX中的batch-requests插件 289 23.2.3 從GraphQL發(fā)現(xiàn)的技術(shù)實踐思路 291 23.3 兼顧緩存的網(wǎng)關(guān)設(shè)計思路 293 23.3.1 APISIX的proxy-cache插件 293 23.3.2 利用聚合拼接緩存資源 293 23.3.3 鑒權(quán)和緩存剝離 294 23.4 總結(jié) 295 第24章 高性能Varnish緩存系統(tǒng) 296 24.1 HTTP緩存對后端服務(wù)的價值分析 296 24.2 CDN緩存和Varnish緩存的共存模式 298 24.3 安裝Varnish和所需模塊 299 24.4 配置文件概覽 300 24.5 穩(wěn)定性建設(shè)所依賴的功能 300 24.5.1 神圣模式 300 24.5.2 寬限模式——異步緩存更新 302 24.5.3 更安穩(wěn)的軟清除 303 24.6 最佳實踐 304 24.6.1 動態(tài)緩存時間配置 304 24.6.2 熱Key及秒殺系統(tǒng)的緩存實踐 305 24.6.3 后端服務(wù)故障轉(zhuǎn)移 306 24.6.4 高并發(fā)下Varnish啟動參數(shù)優(yōu)化 307 24.6.5 Varnish配置模板優(yōu)化實踐 307 24.6.6 測試環(huán)境緩存系統(tǒng)的干擾事件 309 24.7 總結(jié) 309 第25章 SRE漏斗優(yōu)化法則 310 25.1 SRE性能優(yōu)化之漏斗優(yōu)化法則 311 25.2 漏斗優(yōu)化法則的技術(shù)棧梳理 312 25.2.1 減少訪問量 312 25.2.2 減少返回的數(shù)據(jù) 313 25.2.3 減少交互次數(shù) 313 25.2.4 降低CPU、內(nèi)存使用率 314 25.2.5 提升資源利用率 314 25.3 總結(jié) 315 第26章 awesome性能分析工具 316 26.1 站在巨人的肩膀上工作 316 26.1.1 系統(tǒng)性能分析常見清單 317 26.1.2 bcc-tools工具清單 319 26.1.3 火焰圖 320 26.2 Netdata 320 26.3 總結(jié) 321 第27章 性能優(yōu)化實踐錦集 322 27.1 TIME_WAIT優(yōu)化方案擴展 322 27.2 利用Ngx_Lua縮短請求鏈路 323 27.3 eBPF在Kubernetes上的應(yīng)用 325 27.3.1 kubectl-trace 325 27.3.2 使用前提 325 27.3.3 使用優(yōu)點 325 27.3.4 使用場景 326 27.3.5 安裝 326 27.4 善用CDN 327 27.4.1 靜態(tài)加速 327 27.4.2 動態(tài)加速 328 27.4.3 緩存過期保護(hù)策略 328 27.5 記一次中臺服務(wù)優(yōu)化實戰(zhàn) 329 27.5.1 尋找優(yōu)化目標(biāo) 330 27.5.2 抽絲剝繭——嘗試優(yōu)化方案 331 27.5.3 使用go pprof火焰圖發(fā)現(xiàn)端倪 333 27.5.4 回顧復(fù)盤 337 27.6 總結(jié) 337 擴展篇 在團隊間搭建橋梁 第28章 業(yè)務(wù)開發(fā)人員視角下的技術(shù)風(fēng)險 341 28.1 了解業(yè)務(wù)開發(fā)人員 342 28.1.1 工作內(nèi)容 342 28.1.2 廢棄十年如一日 343 28.1.3 重構(gòu)并非易事 343 28.1.4 發(fā)布前的檢查清單 344 28.1.5 站在巨人的肩膀上編程 344 28.1.6 拒絕偽需求 345 28.2 大淘客之旅 346 28.2.1 對話高層,達(dá)成共識 346 28.2.2 對話業(yè)務(wù)線負(fù)責(zé)人 347 28.2.3 重識目標(biāo),各個擊破 347 28.2.4 技術(shù)氛圍和激勵政策 348 28.2.5 “曲線救國”的技術(shù)路線 348 28.3 總結(jié) 351 第29章 SRE視角全篇總結(jié) 352 29.1 齊心協(xié)力 353 29.1.1 關(guān)鍵要素 353 29.1.2 華山論劍 353 29.2 競品分析——最后1公里 355 29.3 故障降級系統(tǒng)——來自監(jiān)控的溝通藝術(shù) 355 29.3.1 抽象業(yè)務(wù)形態(tài) 355 29.3.2 抽象監(jiān)控觸發(fā)條件 357 29.3.3 收攏零散性的自愈任務(wù) 357 29.4 重識CMDB價值 357 29.5 總結(jié) 358
你還可能感興趣
我要評論
|