<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>System Design Fundamental on Jenny blog</title>
        <link>https://yue-jenny.github.io/categories/system-design-fundamental/</link>
        <description>Recent content in System Design Fundamental on Jenny blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Tue, 14 Feb 2023 15:00:24 +0800</lastBuildDate><atom:link href="https://yue-jenny.github.io/categories/system-design-fundamental/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>系統設計基礎筆記(十) Replication And Sharding</title>
        <link>https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%8D%81-replication-and-sharding/</link>
        <pubDate>Tue, 14 Feb 2023 15:00:24 +0800</pubDate>
        
        <guid>https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%8D%81-replication-and-sharding/</guid>
        <description>&lt;h2 id=&#34;replication-and-sharding&#34;&gt;Replication And Sharding&lt;/h2&gt;
&lt;h3 id=&#34;前言&#34;&gt;前言&lt;/h3&gt;
&lt;h3 id=&#34;replication&#34;&gt;Replication&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;目的是建立一個&lt;strong&gt;高可用&lt;/strong&gt;的資料庫架構&lt;/li&gt;
&lt;li&gt;可以選擇&lt;strong&gt;同步或非同步&lt;/strong&gt;的方式進行 main 與 replication 資料庫的同步方式&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;sharding&#34;&gt;Sharding&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;目的是為了建立&lt;strong&gt;高吞吐量&lt;/strong&gt;的資料庫架構&lt;/li&gt;
&lt;li&gt;透過將資料切片，存在不同的節點，可減少對一個節點太多次存取資料造成的負擔，換句話說，即能增加吞吐量&lt;/li&gt;
&lt;li&gt;達成 sharding 的策略有
&lt;ul&gt;
&lt;li&gt;hashing strategy，此部分相關議題為 &lt;a class=&#34;link&#34; href=&#34;https://dev.to/arslan_ah/how-to-use-consistent-hashing-in-a-system-design-interview-33ge&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Consistent Hashing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;使用不同 table (需要確認資料夠 unitform) 存取&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;參考資料-&#34;&gt;參考資料 👐&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;system experts&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://dev.to/arslan_ah/how-to-use-consistent-hashing-in-a-system-design-interview-33ge&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;How to Use Consistent Hashing in a System Design Interview?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🍀 若喜歡我的分享，可以幫我拍拍手👏，是對我最大的鼓勵&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>系統設計基礎筆記(九) Peer-To-Peer Networks</title>
        <link>https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B9%9D-peer-to-peer-networks/</link>
        <pubDate>Fri, 10 Feb 2023 09:58:46 +0800</pubDate>
        
        <guid>https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B9%9D-peer-to-peer-networks/</guid>
        <description>&lt;h2 id=&#34;peer-to-peer-networks&#34;&gt;Peer-To-Peer Networks&lt;/h2&gt;
&lt;h3 id=&#34;p2p-network&#34;&gt;P2P network&lt;/h3&gt;
&lt;h4 id=&#34;介紹&#34;&gt;介紹&lt;/h4&gt;
&lt;p&gt;&lt;img src=&#34;https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B9%9D-peer-to-peer-networks/p2p.png&#34;
	width=&#34;200&#34;
	height=&#34;207&#34;
	srcset=&#34;https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B9%9D-peer-to-peer-networks/p2p_hu64920a50441050d30b3b9472de4aa1e5_12577_480x0_resize_box_3.png 480w, https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B9%9D-peer-to-peer-networks/p2p_hu64920a50441050d30b3b9472de4aa1e5_12577_1024x0_resize_box_3.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;P2P network&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;96&#34;
		data-flex-basis=&#34;231px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;對等式網路，又稱對等技術，依靠使用者群（peers）交換資訊的網際網路體系&lt;/li&gt;
&lt;li&gt;目標就是讓所有的客戶端都能提供資源，包括頻寬，儲存空間和計算能力。因此，當有節點加入且對系統請求增多，整個系統的容量也增大。這是具有一組固定伺服器的Client-Server結構不能實現的，因為在上述這種結構中，客戶端的增加意味著所有使用者&lt;strong&gt;更慢&lt;/strong&gt;的資料傳輸。&lt;/li&gt;
&lt;li&gt;根據中央化程度，可以區分為&lt;strong&gt;一般型P2P、特殊型P2P與混合型P2P&lt;/strong&gt;，使用一般型P2P技術的網路系統有&lt;strong&gt;比特幣、Gnutella或自由網&lt;/strong&gt;等。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;好處&#34;&gt;好處&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;不會因為單點故障就導致整體服務無法運作&lt;/li&gt;
&lt;li&gt;不會讓單點遇到效能瓶頸&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;gossip-protocol&#34;&gt;Gossip Protocol&lt;/h3&gt;
&lt;h4 id=&#34;簡介&#34;&gt;簡介&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;又稱作 epidemic protocol，是 P2P network 的核心技術&lt;/li&gt;
&lt;li&gt;Gossip protocol 的實際應用如 Cassandra / Redis Cluster / Consul 等集群架構
&lt;ul&gt;
&lt;li&gt;consul 用於管理 membership 與傳播消息，有興趣可點&lt;a class=&#34;link&#34; href=&#34;https://developer.hashicorp.com/consul/docs/architecture/gossip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;這邊&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;廣度優先遍歷(Breadth-First Search, BFS)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;假設 A 得到某些資訊，更新了自身的資訊，A 需要將資訊告訴 B、C 等，然後 B、C 告訴其他的 D、E、F、G，一直遍歷。如果節點 B 收到 A 的消息，發現自己早就知道這個消息就直接忽略，從而可以防止圖重複遍歷。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;執行過程&#34;&gt;執行過程&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Gossip 過程是&lt;strong&gt;異步&lt;/strong&gt;的，也就是說發消息的節點不會關注對方是否收到，即&lt;strong&gt;不等待響應&lt;/strong&gt;；不管對方有沒有收到，它都會每隔1 秒向周圍節點發消息&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B9%9D-peer-to-peer-networks/gossip.png&#34;
	width=&#34;631&#34;
	height=&#34;518&#34;
	srcset=&#34;https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B9%9D-peer-to-peer-networks/gossip_hu7b8d06cb578bd73d02d564beeee187d5_97088_480x0_resize_box_3.png 480w, https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B9%9D-peer-to-peer-networks/gossip_hu7b8d06cb578bd73d02d564beeee187d5_97088_1024x0_resize_box_3.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;source:https://zhuanlan.zhihu.com/p/41228196&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;121&#34;
		data-flex-basis=&#34;292px&#34;
	
&gt;&lt;/p&gt;
&lt;h4 id=&#34;通信模式&#34;&gt;&lt;strong&gt;通信模式&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Push:
&lt;ul&gt;
&lt;li&gt;節點 A 將數據 (key,value,version) 及對應的版本號推送給節點 B，節點 B 更新 A 中比自己新的數據&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pull:
&lt;ul&gt;
&lt;li&gt;A 僅將數據 key, version 推送給 B，B 將本地比 A 新的數據（Key, value, version）推送給 A，A 更新本地&lt;/li&gt;
&lt;li&gt;對 A 來說是 pull&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Push/Pull:
&lt;ul&gt;
&lt;li&gt;與 Pull 類似，步驟上多一步，A 再將本地比 B 新的數據推送給 B，B 則更新本地&lt;/li&gt;
&lt;li&gt;收斂速度&lt;strong&gt;最快&lt;/strong&gt;，收斂速度是指所有節點的資訊達到一致的速度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;優點&#34;&gt;優點&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;擴展性 (scalability)
&lt;ul&gt;
&lt;li&gt;允許任意節點的增加和減少&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;容錯 (Fault tolerance)
&lt;ul&gt;
&lt;li&gt;任何節點的故障和重啟都不會影響 Gossip 消息的傳播&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;去中心化 (decentralization)
&lt;ul&gt;
&lt;li&gt;所有節點都可以是對等的，任何一個節點無需知道整個狀況，只要網路相通，任意一個節點就可以把消息散播到全網&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;一致性收斂
&lt;ul&gt;
&lt;li&gt;消息會以一傳十、十傳百一樣的指數級速度在網路中快速傳播，因此系統狀態的不一致可以在很快的時間內收斂到一致&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;簡易實現&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;缺點&#34;&gt;缺點&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;latency
&lt;ul&gt;
&lt;li&gt;節點只會隨機向&lt;strong&gt;少數幾個節點&lt;/strong&gt;發送消息，消息最終是通過多個輪次的散播而到達全網&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;消息冗餘
&lt;ul&gt;
&lt;li&gt;節點會&lt;strong&gt;定期隨機&lt;/strong&gt;選擇周圍節點發送消息，而收到消息的節點也會重複該步驟，因此就&lt;strong&gt;不可避免的存在消息重複發送給同一節點的情況&lt;/strong&gt;，造成了消息的冗餘，同時也&lt;strong&gt;增加了收到消息的節點的處理壓力&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;由於是定期發送，即使收到了消息的節點還會反複收到重複消息，加重了消息的冗餘。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;參考資料-&#34;&gt;參考資料 👐&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://zh.wikipedia.org/zh-tw/%E5%B0%8D%E7%AD%89%E7%B6%B2%E8%B7%AF&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;對等網路 - 维基百科，自由的百科全书&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ithelp.ithome.com.tw/articles/10216158&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Day20|P2P網路(1)：P2P網路基礎知識 - iT 邦幫忙::一起幫忙解決難題，拯救 IT 人的一天&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://yuanchieh.page/posts/2020/2020-10-26-gossip-protocol-%E4%BB%8B%E7%B4%B9%E4%B8%8A/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Gossip Protocol 介紹 (上) - 從 Cassandra 內部實作認識 Gossip Protocol 的使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://zhuanlan.zhihu.com/p/41228196&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;P2P 网络核心技术：Gossip 协议&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🍀 若喜歡我的分享，可以幫我拍拍手👏，是對我最大的鼓勵&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>系統設計基礎筆記(八) Pulling And Streaming</title>
        <link>https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%85%AB-pulling-and-streaming/</link>
        <pubDate>Mon, 06 Feb 2023 23:24:44 +0800</pubDate>
        
        <guid>https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%85%AB-pulling-and-streaming/</guid>
        <description>&lt;h2 id=&#34;pulling-and-streaming&#34;&gt;Pulling And Streaming&lt;/h2&gt;
&lt;h3 id=&#34;prerequistites&#34;&gt;Prerequistites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Client-Server Model
&lt;ul&gt;
&lt;li&gt;client 發 request，server 提供資料或服務給 client&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Socket
&lt;ul&gt;
&lt;li&gt;是一種一種網路傳輸協定，實現 client 與 server 的雙向溝通機制，使用 TCP 連線，透過 HTTP 3-way handshake 建立連線&lt;/li&gt;
&lt;li&gt;目的是可以即時地讓雙方交換資訊，應用場景如聊天室&lt;/li&gt;
&lt;li&gt;優點是較少開銷、即時性、二進位支援等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;polling&#34;&gt;Polling&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;每隔多少固定的時間去更新資料&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;streaming-pushing&#34;&gt;Streaming (Pushing)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;持續&lt;/strong&gt;與 server 保持連線，並隨時取得最新資料&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%85%AB-pulling-and-streaming/polling-and-streaming.png&#34;
	width=&#34;581&#34;
	height=&#34;401&#34;
	srcset=&#34;https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%85%AB-pulling-and-streaming/polling-and-streaming_huab6d95d64cfe2c9bc60d83fabcd5d583_25902_480x0_resize_box_3.png 480w, https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%85%AB-pulling-and-streaming/polling-and-streaming_huab6d95d64cfe2c9bc60d83fabcd5d583_25902_1024x0_resize_box_3.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;polling-and-streaming&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;144&#34;
		data-flex-basis=&#34;347px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;參考資料-&#34;&gt;參考資料 👐&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/WebSocket&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;WebSocket - Web APIs | MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.geeksforgeeks.org/polling-and-streaming-concept-scenarios/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Polling and Streaming - Concept &amp;amp; Scenarios - GeeksforGeeks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🍀 若喜歡我的分享，可以幫我拍拍手👏，是對我最大的鼓勵&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>系統設計基礎筆記(七) Configuration</title>
        <link>https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B8%83-configuration/</link>
        <pubDate>Sat, 04 Feb 2023 10:30:09 +0800</pubDate>
        
        <guid>https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B8%83-configuration/</guid>
        <description>&lt;h2 id=&#34;configuration&#34;&gt;Configuration&lt;/h2&gt;
&lt;h3 id=&#34;static-configuration-vs-dynamic-configuration&#34;&gt;Static Configuration V.S Dynamic Configuration&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Static Configuration
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;以 YAML 或 JSON 為主的設定檔&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YAML:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-YAML&#34; data-lang=&#34;YAML&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;receipt&lt;/span&gt;:     &lt;span style=&#34;color:#ae81ff&#34;&gt;Oz-Ware Purchase Invoice&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;date&lt;/span&gt;:        &lt;span style=&#34;color:#e6db74&#34;&gt;2012-08-06&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;customer&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;given&lt;/span&gt;:   &lt;span style=&#34;color:#ae81ff&#34;&gt;Dorothy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;family&lt;/span&gt;:  &lt;span style=&#34;color:#ae81ff&#34;&gt;Gale&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;JSON
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-JSON&#34; data-lang=&#34;JSON&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;streetAddress&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;21 2nd Street&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;city&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;New York&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;state&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;NY&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;postalCode&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;10021&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;需要跟 source code 結合&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;需要 &lt;strong&gt;re-deploy&lt;/strong&gt; 應用才能更新設定&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dynamic Configuration
&lt;ul&gt;
&lt;li&gt;UI 介面去控制設定&lt;/li&gt;
&lt;li&gt;需要去實作此 feature&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;參考資料-&#34;&gt;參考資料 👐&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;🍀 若喜歡我的分享，可以幫我拍拍手👏，是對我最大的鼓勵&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>系統設計基礎筆記(六) Rate Limiting</title>
        <link>https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%85%AD-rate-limiting/</link>
        <pubDate>Thu, 02 Feb 2023 10:55:49 +0800</pubDate>
        
        <guid>https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%85%AD-rate-limiting/</guid>
        <description>&lt;h2 id=&#34;rate-limiting&#34;&gt;Rate Limiting&lt;/h2&gt;
&lt;h3 id=&#34;prerequistites&#34;&gt;Prerequistites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DDOS
&lt;ul&gt;
&lt;li&gt;分散式阻斷服務攻擊（distributed denial-of-service attack）亦稱洪水攻擊&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DoS
&lt;ul&gt;
&lt;li&gt;阻斷服務攻擊（英語：denial-of-service attack）&lt;/li&gt;
&lt;li&gt;預防方式是使用 rate limit, 可以限制 IP, 使用者帳戶, 區域等等。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;rate-limiting-1&#34;&gt;Rate Limiting&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;意思就是限流&lt;/li&gt;
&lt;li&gt;根據維基百科，定義是「控制計算機發送或接收的&lt;strong&gt;請求之頻率&lt;/strong&gt;」&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;rate-limiting-for-multiple-server&#34;&gt;Rate Limiting for Multiple Server&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;use &lt;strong&gt;Redis&lt;/strong&gt; to implement rate limiting for multiple servers&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;application-layer-如何實現-rate-limit&#34;&gt;Application Layer 如何實現 Rate Limit&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;實現方式
&lt;ul&gt;
&lt;li&gt;在 Node.js 裡，有一個用來做限流的 express middleware 叫做 &lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com/package/express-rate-limit&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;express-rate-limit&lt;/a&gt;，可&lt;a class=&#34;link&#34; href=&#34;https://ithelp.ithome.com.tw/m/articles/10268910&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;看這篇&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;缺點
&lt;ul&gt;
&lt;li&gt;在 API server 裡面自己用 middleware 做限流，雖然這樣做感覺很方便，但也會讓 API server 無法完全專注在業務邏輯上&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;aws-waf-web-application-firewall&#34;&gt;AWS WAF (Web Application Firewall)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;目的是保護您的 Web 應用程式免受常見 Web 入侵程式的危害&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;運作方式&#34;&gt;運作方式&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%85%AD-rate-limiting/AWS-WAF.png&#34;
	width=&#34;2360&#34;
	height=&#34;699&#34;
	srcset=&#34;https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%85%AD-rate-limiting/AWS-WAF_hu506d3f345407d576fe677b6871abeb83_162306_480x0_resize_box_3.png 480w, https://yue-jenny.github.io/2023/02/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%85%AD-rate-limiting/AWS-WAF_hu506d3f345407d576fe677b6871abeb83_162306_1024x0_resize_box_3.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;source: https://docs.aws.amazon.com/waf/latest/developerguide/how-aws-waf-works.html&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;337&#34;
		data-flex-basis=&#34;810px&#34;
	
&gt;&lt;/p&gt;
&lt;h4 id=&#34;關於-aws-waf-components&#34;&gt;關於 AWS WAF components&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Web ACLs&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目的是保護 AWS resources，藉由建立一組 web ACL 並新增 rules 去定義保護策略&lt;/li&gt;
&lt;li&gt;屬於 AWS WAF resource&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rules&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;顧名思義，定義檢查標準 (inspection criteria)，當有 matching requests，可以做的事情如允許通過、計算他們或者執行 CAPTCHA puzzles 去檢查是否為機器人&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不屬於&lt;/strong&gt; AWS WAF resource&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rule groups&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以組合自己的 rule groups，也可以直接在 web ACL 中定義規則&lt;/li&gt;
&lt;li&gt;屬於 AWS WAF resource&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;關於-web-acl-capacity-units-wcu&#34;&gt;關於 Web ACL capacity units (WCU)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;strong&gt;WCU 來計算與控制運行規則、規則組和 Web ACL 所需的&lt;/strong&gt;操作資源
&lt;ul&gt;
&lt;li&gt;For example, a size constraint rule statement uses fewer WCUs than a statement that inspects against a regex pattern set.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS WAF 會管理 &lt;strong&gt;Rule capacity, Rule group capacity, Web ACL capacity&lt;/strong&gt;，詳情可以參考&lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/waf/latest/developerguide/how-aws-waf-works.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;這篇&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;關於-resources-that-you-can-protect-with-aws-waf&#34;&gt;關於 Resources that you can protect with AWS WAF&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;使用 AWS WAF web ACL 去保護&lt;strong&gt;全球或區域性&lt;/strong&gt;的 resource types，只需要將 web ACL 連結到你想要保護的 resources 上，官方提供 &lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/waf/latest/developerguide/how-aws-waf-works.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon CloudFront 以及 Regional resources 特別說明&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Note: &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/tw/cloudfront/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon CloudFront&lt;/a&gt; 是一項&lt;strong&gt;內容交付網路(CDN)&lt;/strong&gt; 服務，可協助您以高速效能、安全和開發人員易用性快速、可靠地分發靜態和動態內容。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;限制
&lt;ul&gt;
&lt;li&gt;一個 web ACL 可以連結多個 AWS resources，一個 AWS resource 僅連結一個 web ACL&lt;/li&gt;
&lt;li&gt;一個 web ACL 可以連結多個 CloudFront distributions，且已連結到 CloudFront distribution 的 web ACL &lt;strong&gt;不能&lt;/strong&gt;再去連結其他 AWS resource type&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;使用情境舉例-3-點&#34;&gt;使用情境，舉例 3 點&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/waf/latest/developerguide/waf-rules.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;篩選 Web 流量&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;建立規則以根據各種條件篩選 Web 請求，例如 IP 地址、HTTP 標頭和內文，或自訂 URI。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/waf/latest/developerguide/waf-atp.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;防止帳戶接管詐騙&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;監控應用程式的登入頁面，偵測以盜用憑證對使用者帳戶進行的未經授權存取。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/waf/latest/APIReference/Welcome.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;使用 API 管理 AWS WAF&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;自動建立和維護規則，並將這些規則併入開發和設計程序中。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;比較-aws-waf-aws-shield-與-aws-firewall-manager&#34;&gt;比較 AWS WAF, AWS Shield 與 AWS Firewall Manager&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AWS WAF&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;monitor requests that are forwarded to your web applications and control access to your content.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/waf/latest/developerguide/shield-chapter.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AWS Shield&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;help protect against &lt;strong&gt;DDoS&lt;/strong&gt; attacks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/waf/latest/developerguide/fms-chapter.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AWS Firewall Manager&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;set up your firewall rules and apply the rules automatically across accounts and resources, even as new resources are added.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;參考資料-&#34;&gt;參考資料 👐&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/waf/latest/developerguide/what-is-aws-waf.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;What are AWS WAF, AWS Shield, and AWS Firewall Manager?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/waf/latest/developerguide/how-aws-waf-works.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;How AWS WAF works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/tw/cloudfront/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;低延遲內容交付網路 (CDN) - Amazon CloudFront - Amazon Web Services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com/package/express-rate-limit&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;express-rate-limit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🍀 若喜歡我的分享，可以幫我拍拍手👏，是對我最大的鼓勵&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>系統設計基礎筆記(五) Logging And Monitoring</title>
        <link>https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/</link>
        <pubDate>Thu, 26 Jan 2023 12:16:48 +0800</pubDate>
        
        <guid>https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/</guid>
        <description>&lt;h2 id=&#34;logging-and-monitoring&#34;&gt;Logging And Monitoring&lt;/h2&gt;
&lt;h3 id=&#34;前言&#34;&gt;前言&lt;/h3&gt;
&lt;h3 id=&#34;prerequistites&#34;&gt;Prerequistites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Logging&lt;/li&gt;
&lt;li&gt;Monitoring&lt;/li&gt;
&lt;li&gt;Alerting&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;elastic-search-logstash-kibana-elk&#34;&gt;Elastic Search, Logstash, Kibana (ELK)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Elasticsearch 的核心是搜索引擎、採集管道Logstash 和可視化工具Kibana。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/elk-stack-3-elks-stacked.jpg&#34;
	width=&#34;493&#34;
	height=&#34;360&#34;
	srcset=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/elk-stack-3-elks-stacked_hue327090e74217d99738d852fa79149e2_16530_480x0_resize_q75_box.jpg 480w, https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/elk-stack-3-elks-stacked_hue327090e74217d99738d852fa79149e2_16530_1024x0_resize_q75_box.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;source: https://www.elastic.co/cn/what-is/elk-stack&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;136&#34;
		data-flex-basis=&#34;328px&#34;
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;elastic-search&#34;&gt;Elastic Search&lt;/h4&gt;
&lt;h5 id=&#34;introduce&#34;&gt;Introduce&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一個建置在 Apache Lucene 上的分散式搜尋和分析引擎，提供 near real-time 的數據搜尋與分析，能夠儲存複雜結構的數據&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;授權不是開放原始碼，也不向使用者提供相同的自由。因此引進了 &lt;strong&gt;OpenSearch&lt;/strong&gt; 專案，此專案是一個社群驅動型 ALv2 許可的開放原始碼 Elasticsearch 和 Kibana 分支&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;列舉幾項應用場景:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;網站或應用的 search box&lt;/li&gt;
&lt;li&gt;儲存與分析 logs, metrics 等 structured 或 unstructured 文字進而找出安全漏洞&lt;/li&gt;
&lt;li&gt;將 Elasticsearch 作為儲存引擎去自動化 workflows&lt;/li&gt;
&lt;li&gt;將 Elasticsearch 作為 GIS 去整合與分析空間資料&lt;/li&gt;
&lt;li&gt;將 Elasticsearch 作為生物訊息搜尋工具去儲存與處理基因資料&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;以資料流來簡易說明-elasticsearch-86current-做的事情&#34;&gt;以資料流來簡易說明 Elasticsearch 8.6(current) 做的事情&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;documents and indices&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;儲存&lt;strong&gt;已序列化&lt;/strong&gt;為 JSON 文檔的複雜數據結構&lt;/li&gt;
&lt;li&gt;有多個 Elasticsearch 節點時，存儲的文檔分佈在集群中，並且可以從任何節點立即訪問&lt;/li&gt;
&lt;li&gt;支援快速搜尋，因為使用了 &lt;strong&gt;“inverted index”&lt;/strong&gt; 的數據結構，每種數據都有專屬並優化過的結構，如
&lt;ul&gt;
&lt;li&gt;text fields are stored in inverted indices&lt;/li&gt;
&lt;li&gt;numeric and geo fields are stored in &lt;strong&gt;BKD trees&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;支援 schema-less，當不確定如何處理文檔中的字段時使用，需啟用 “dynamic mapping”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;search and analyze&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;支援 &lt;strong&gt;structured queries, full text queries&lt;/strong&gt; 以及結合兩種搜尋方式&lt;/li&gt;
&lt;li&gt;除此之外，也有支援高性能地理空間與數值數據搜尋&lt;/li&gt;
&lt;li&gt;透過 Elasticsearch’s comprehensive JSON-style query language (Query DSL) 可以去訪問這些搜尋功能&lt;/li&gt;
&lt;li&gt;結合 JDBC 與 ODBC drivers 可以讓第三方 applications 更加廣泛地透過 SQL 與 Elasticsearch 互動&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;scalabilty and resilience&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elasticsearch 可根據您的需求進行擴展，並且知道如何平衡多節點 cluster&lt;/li&gt;
&lt;li&gt;運作方式
&lt;ul&gt;
&lt;li&gt;將 shards 分布到多個 nodes 上，利用確保&lt;strong&gt;冗餘 (redundancy)&lt;/strong&gt; 可以達到防止 hardware failures 以及增加 query capacity (讀取請求的能力)，當 nodes 數量增減，Elasticsearch 會自動遷移 shard 以重新平衡集群&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;shard 有兩種 types
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;primaries&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Each document in an index belongs to one primary shard.&lt;/li&gt;
&lt;li&gt;數量固定。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replicas&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;a copy of a primary shard.&lt;/li&gt;
&lt;li&gt;為了冗餘 (redundancy)，可以達到防止 hardware failures 以及增加 query capacity (讀取請求的能力)。&lt;/li&gt;
&lt;li&gt;數量可以更改。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;logstash&#34;&gt;Logstash&lt;/h4&gt;
&lt;h5 id=&#34;introduce-1&#34;&gt;Introduce&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;一種開放原始碼資料擷取工具，可讓您從各種來源收集資料、轉換資料並將資料傳送到所需目的地。憑藉預先建置的篩選條件和對 200 多個外掛程式的支援，Logstash 可讓使用者輕鬆擷取資料，而不管資料來源或類型如何。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;架構&#34;&gt;架構:&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;一個輸入，一個輸出，中間有個管道（不是必須的），這個管道用來收集、解析和轉換日誌的。&lt;/li&gt;
&lt;li&gt;three stages: inputs → filters → outputs&lt;/li&gt;
&lt;li&gt;Inputs generate events, filters modify them, and outputs ship them elsewhere.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/logstash.png&#34;
	width=&#34;1089&#34;
	height=&#34;243&#34;
	srcset=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/logstash_hub2b30e6314ca55e2737e9d92e183e05d_35396_480x0_resize_box_3.png 480w, https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/logstash_hub2b30e6314ca55e2737e9d92e183e05d_35396_1024x0_resize_box_3.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;logstash, source: https://www.elastic.co/guide/en/logstash/current/first-event.html&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;448&#34;
		data-flex-basis=&#34;1075px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;簡介 Inputs, Filters 與 Outputs
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Inputs&lt;/code&gt; 如 file, syslog, redis or beat&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;參考&lt;a class=&#34;link&#34; href=&#34;https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html#configuring-filebeat&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;這篇&lt;/a&gt; configure Filebeat to send log lines to Logstash&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Filters&lt;/code&gt; 如 grok, mutate, drop, clone, geoip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;grok: 解析與重組文字，Logstash 中用來解析非結構性的 log 的最好方式，可參考&lt;a class=&#34;link&#34; href=&#34;https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html#configuring-grok-filter&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;這篇&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;mutate: 能夠 rename, remove, replace, and modify fields in your events&lt;/li&gt;
&lt;li&gt;drop: 完整剔除一個 event&lt;/li&gt;
&lt;li&gt;clone: 複製一個 event&lt;/li&gt;
&lt;li&gt;geoip: 加入一些新的資訊，如 IP 地址&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Outputs&lt;/code&gt; 如 elasticsearch, file, graphite, statsd&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;elasticsearch: 放在這邊的優點是效率、方便且容易搜尋的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;file: 寫入檔案內&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;graphite: 一個 open-source 的儲存時序資料與 render graphs 工具&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;根據官方文件介紹
&lt;blockquote&gt;
&lt;p&gt;Graphite does two things:&lt;br&gt;
1.Store numeric time-series data&lt;br&gt;
2.Render graphs of this data on demand&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;statsd:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用途是監控應用程式，方式是將 metrics 收集、儲存並建立對應的警報機制&lt;/li&gt;
&lt;li&gt;原理是監聽 UDP (或 TCP) 的程式並收集數據，將數據傳送給其他應用程式。&lt;/li&gt;
&lt;li&gt;重要概念
&lt;ul&gt;
&lt;li&gt;bucket: 每個 stat 擁有自己的 bucket&lt;/li&gt;
&lt;li&gt;value: 每個 stat 擁有一個 value，通常是 integer&lt;/li&gt;
&lt;li&gt;type: 指定 c (用於計數器)、g (用於測量儀)、ms (用於計時器)、h (用於長條圖) 或 s (用於 set)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/statsd/statsd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;官方文件&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Codecs plugins&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可在 input 或者 output 流程去更改數據顯示的格式&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.elastic.co/guide/en/logstash/8.6/codec-plugins.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;codec-plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;整合多種-data-source&#34;&gt;整合多種 data source&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;參考&lt;a class=&#34;link&#34; href=&#34;https://www.elastic.co/guide/en/logstash/current/multiple-input-output-plugins.html#multiple-input-output-plugins&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;這篇範例&lt;/a&gt;, conf 檔設定值應如下:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;input {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;twitter {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ae81ff&#34;&gt;consumer_key =&amp;gt; &amp;#34;enter_your_consumer_key_here&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ae81ff&#34;&gt;consumer_secret =&amp;gt; &amp;#34;enter_your_secret_here&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ae81ff&#34;&gt;keywords =&amp;gt; [&amp;#34;cloud&amp;#34;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ae81ff&#34;&gt;oauth_token =&amp;gt; &amp;#34;enter_your_access_token_here&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ae81ff&#34;&gt;oauth_token_secret =&amp;gt; &amp;#34;enter_your_access_token_secret_here&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;beats {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ae81ff&#34;&gt;port =&amp;gt; &amp;#34;5044&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;output {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;elasticsearch {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ae81ff&#34;&gt;hosts =&amp;gt; [&amp;#34;IP Address 1:port1&amp;#34;, &amp;#34;IP Address 2:port2&amp;#34;, &amp;#34;IP Address 3&amp;#34;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;file {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ae81ff&#34;&gt;path =&amp;gt; &amp;#34;/path/to/target/file&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;kibana&#34;&gt;Kibana&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;一種用於檢視日誌和事件的資料視覺化和探索工具。Kibana 提供易於使用的互動式圖表、預先建置的彙總和篩選條件以及地理空間支援&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;introduce-2&#34;&gt;Introduce&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;一種用於檢視日誌和事件的資料視覺化和探索工具。Kibana 提供易於使用的互動式圖表、預先建置的彙總和篩選條件以及地理空間支援&lt;/li&gt;
&lt;li&gt;透過 kibana 能做到:
&lt;ul&gt;
&lt;li&gt;透過搜尋與觀察你的數據進而找出安全漏洞&lt;/li&gt;
&lt;li&gt;分析與視覺化你的數據&lt;/li&gt;
&lt;li&gt;管理數據、監測 Elastic Stack cluster 健康程度與權限控管&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;kibana-query-language-kql&#34;&gt;Kibana Query Language (KQL)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;only filters data, and has no role in aggregating, transforming, or sorting data&lt;/li&gt;
&lt;li&gt;filter documents where a value for a field exists, matches a given value, or is within a given range&lt;/li&gt;
&lt;li&gt;example
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;filter for documents where the http.request.method is GET, use the following query:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http.request.method: GET
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;search for all documents for which http.response.bytes is less than 10000:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http.response.bytes &amp;lt; 10000
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;filter documents where the http.request.method is not GET, use the following query:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;**NOT** http.request.method: GET
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;find documents where a single value inside the user array contains a first name of “Alice” and last name of “White”, use the following:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;user:{ first: &amp;#34;Alice&amp;#34; and last: &amp;#34;White&amp;#34; }
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;lucene-query-syntax&#34;&gt;Lucene query syntax&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;regular expressions or fuzzy term matching&lt;/li&gt;
&lt;li&gt;Lucene syntax is not able to search nested objects or scripted fields.&lt;/li&gt;
&lt;li&gt;example
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;find entries that have 4xx status codes and have an extension of php or html:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;status:[400 TO 499] AND (extension:php OR extension:html)
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;prometheus&#34;&gt;Prometheus&lt;/h3&gt;
&lt;h4 id=&#34;介紹&#34;&gt;介紹&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;open-source systems monitoring and alerting toolkit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud Native Computing Foundation (CNCF)&lt;/strong&gt; in 2016 as the second hosted project
&lt;ul&gt;
&lt;li&gt;NOTE: 第一個被 CNCF hosted 的 project 是 kubernetes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;collects and stores its metrics as &lt;strong&gt;time series&lt;/strong&gt; data&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;優點&#34;&gt;優點&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;recording any purely &lt;strong&gt;numeric time series&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;support for &lt;strong&gt;multi-dimensional&lt;/strong&gt; data collection and querying&lt;/li&gt;
&lt;li&gt;Prometheus server is &lt;strong&gt;standalone&lt;/strong&gt;, not depending on network storage or other remote services&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;缺點&#34;&gt;缺點&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;不適合需要 100% accuracy 的服務&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;功能&#34;&gt;功能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;a multi-dimensional &lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/docs/concepts/data_model/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;data model&lt;/a&gt; with time series data identified by metric name and key/value pairs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PromQL&lt;/strong&gt;, a &lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/docs/prometheus/latest/querying/basics/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;flexible query language&lt;/a&gt; to leverage this dimensionality&lt;/li&gt;
&lt;li&gt;no reliance on distributed storage; single server nodes are autonomous&lt;/li&gt;
&lt;li&gt;time series collection happens via a &lt;strong&gt;pull model&lt;/strong&gt; over HTTP&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/docs/instrumenting/pushing/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pushing time series&lt;/a&gt; is supported via an intermediary gateway&lt;/li&gt;
&lt;li&gt;targets are discovered via service discovery or static configuration&lt;/li&gt;
&lt;li&gt;multiple modes of graphing and dashboarding support&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;metrics-介紹&#34;&gt;&lt;strong&gt;&lt;strong&gt;metrics 介紹&lt;/strong&gt;&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;metrics are &lt;strong&gt;numeric measurements&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Metrics play an important role in understanding &lt;strong&gt;why your application is working in a certain way.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;支援四種 metrics types, &lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/docs/tutorials/understanding_metric_types/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;這篇有更詳細的介紹&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Counter&lt;/strong&gt; - only increase or reset&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gauge&lt;/strong&gt; - 使用情境如計算 number of pods in a cluster, number of events in an queue&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Histogram&lt;/strong&gt; - 使用情境可以是&lt;strong&gt;任何需要計算&lt;/strong&gt;的值，如 API requests 所花費的時間，Histogram 會將數據存在 buckets 中，會先定義 buckets - lower or equal 0.3 , le 0.5, le 0.7, le 1, and le 1.2，接著計算完每次 request 所花費的時間後可以將對應到 bucket 的 count 加一，如下圖&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/histogram.png&#34;
	width=&#34;871&#34;
	height=&#34;424&#34;
	srcset=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/histogram_hu647b5cc5950a58e113463ff58cc8a41c_18276_480x0_resize_box_3.png 480w, https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/histogram_hu647b5cc5950a58e113463ff58cc8a41c_18276_1024x0_resize_box_3.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;histogram&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;205&#34;
		data-flex-basis=&#34;493px&#34;
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt; - Histogram 的替代方案，因為更便宜，但付出的代價是 lose more data，原理是計算 metrics 的層級是 application level，所以當同一個 process 有諸多 instances 的話會無法計算&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;components&#34;&gt;&lt;strong&gt;&lt;strong&gt;Components&lt;/strong&gt;&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;the main &lt;a class=&#34;link&#34; href=&#34;https://github.com/prometheus/prometheus&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prometheus server&lt;/a&gt; which scrapes and stores time series data&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/docs/instrumenting/clientlibs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;client libraries&lt;/a&gt; for instrumenting application code&lt;/li&gt;
&lt;li&gt;a &lt;a class=&#34;link&#34; href=&#34;https://github.com/prometheus/pushgateway&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;push gateway&lt;/a&gt; for supporting short-lived jobs&lt;/li&gt;
&lt;li&gt;special-purpose &lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/docs/instrumenting/exporters/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;exporters&lt;/a&gt; for services like HAProxy, StatsD, Graphite, etc.&lt;/li&gt;
&lt;li&gt;an &lt;a class=&#34;link&#34; href=&#34;https://github.com/prometheus/alertmanager&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;alertmanager&lt;/a&gt; to handle alerts&lt;/li&gt;
&lt;li&gt;various support tools&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/prometheus-arch.png&#34;
	width=&#34;1351&#34;
	height=&#34;811&#34;
	srcset=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/prometheus-arch_hu39e4c960c6daf3c3c2461dd22ee1ec3a_115281_480x0_resize_box_3.png 480w, https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/prometheus-arch_hu39e4c960c6daf3c3c2461dd22ee1ec3a_115281_1024x0_resize_box_3.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;source: https://prometheus.io/docs/introduction/overview/&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;166&#34;
		data-flex-basis=&#34;399px&#34;
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;grafana&#34;&gt;Grafana&lt;/h3&gt;
&lt;h4 id=&#34;介紹-1&#34;&gt;介紹&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Grafana Labs 開發的 open-source 專案之一，還有其他專案，如 Grafana Loki (Like Prometheus, but for logs!), Grafana k6 (load testing tool)…&lt;/li&gt;
&lt;li&gt;query, visualize, alert on, and explore your metrics, logs, and traces wherever they are stored.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;功能-1&#34;&gt;功能&lt;/h4&gt;
&lt;h5 id=&#34;explore-metrics-logs-and-traces&#34;&gt;Explore metrics, logs, and traces&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;以 &lt;strong&gt;RBAC ( Role-based access Control )&lt;/strong&gt; 來決定誰能夠 explore 這些數據&lt;/li&gt;
&lt;li&gt;利用以下功能來查詢到更多數據趨勢與細節，細節參考&lt;a class=&#34;link&#34; href=&#34;https://grafana.com/docs/grafana/latest/explore/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;這篇&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;query management in explore&lt;/li&gt;
&lt;li&gt;logs integration in explore&lt;/li&gt;
&lt;li&gt;trace integration in explore&lt;/li&gt;
&lt;li&gt;inspector in explore: 目的是 &lt;strong&gt;troubleshoot 你的 queries&lt;/strong&gt;，可以將數據導出至 csv 檔案，logs 導出至 txt 檔案&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;alerts&#34;&gt;Alerts&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;參考&lt;a class=&#34;link&#34; href=&#34;https://grafana.com/docs/grafana/latest/alerting/alerting-rules/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;這篇&lt;/a&gt;去建立 alert rules，包含設定 threshold, interval, duration&lt;/li&gt;
&lt;li&gt;「 缺少數據」也能被設定 alert 行為&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;annotations&#34;&gt;Annotations&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hover&lt;/strong&gt; over events to see the full event metadata and tags.&lt;/li&gt;
&lt;li&gt;參考&lt;a class=&#34;link&#34; href=&#34;https://grafana.com/docs/grafana/latest/dashboards/build-dashboards/annotate-visualizations/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;這篇&lt;/a&gt;可進行 Add annotation, Add region annotation, Edit annotation, Delete annotation, Built-in query, Query by tag 等功能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/grafana.png&#34;
	width=&#34;746&#34;
	height=&#34;293&#34;
	srcset=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/grafana_hua8009842305b5769221fa691144c8887_40516_480x0_resize_box_3.png 480w, https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%94-logging-and-monitoring/grafana_hua8009842305b5769221fa691144c8887_40516_1024x0_resize_box_3.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;hover 可以看相關的 metadata 與 tags, sources: https://grafana.com/docs/grafana/latest/dashboards/build-dashboards/annotate-visualizations/&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;254&#34;
		data-flex-basis=&#34;611px&#34;
	
&gt;&lt;/p&gt;
&lt;h4 id=&#34;grafana-provides-many-ways-to-authenticate-users&#34;&gt;Grafana provides many ways to authenticate users&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;預設是提供 password authentication，其他&lt;a class=&#34;link&#34; href=&#34;https://grafana.com/docs/grafana/latest/setup-grafana/configure-security/configure-authentication/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;詳細請看這篇&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;參考資料-&#34;&gt;參考資料 👐&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.elastic.co/cn/what-is/elk-stack&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;what is elk stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.elastic.co/guide/en/cloud/current/ec-getting-started.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Elasticsearch Service Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/tw/what-is/elasticsearch/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;what-is-elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.elastic.co/guide/en/logstash/current/pipeline.html#pipeline&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;How Logstash Works | Logstash Reference [8.6] | Elastic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/elasticsearch-intro.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;elasticsearch introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.elastic.co/guide/en/kibana/current/introduction.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;kibana introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://prometheus.io/docs/introduction/overview/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Overview | Prometheus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://grafana.com/docs/grafana/latest/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Grafana documentation | Grafana documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🍀 若喜歡我的分享，可以幫我拍拍手👏，是對我最大的鼓勵&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>系統設計基礎筆記(四) Publish/Subscribe Pattern</title>
        <link>https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%9B%9B-publish/subscribe-pattern/</link>
        <pubDate>Wed, 18 Jan 2023 20:13:18 +0800</pubDate>
        
        <guid>https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%9B%9B-publish/subscribe-pattern/</guid>
        <description>&lt;h2 id=&#34;publishsubscribe-pattern&#34;&gt;Publish/Subscribe Pattern&lt;/h2&gt;
&lt;h3 id=&#34;publishsubscribe-pattern-pubsub-簡介&#34;&gt;Publish/Subscribe Pattern (Pub/Sub) 簡介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;一種包含 publisher、subscriber 與 broker 的訊息模型
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;publisher&lt;/strong&gt; - 將訊息&lt;strong&gt;傳送至特定 topic&lt;/strong&gt;(也可能被稱呼為 &lt;strong&gt;channels&lt;/strong&gt;)，不需要擔心誰需要收到這筆消息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;subscriber&lt;/strong&gt; - &lt;strong&gt;訂閱特定 topic&lt;/strong&gt; 後，將會收到來自此 topic 的訊息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;broker&lt;/strong&gt; - 負責將 topic 的訊息轉發給 subscriber&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;通常有以下的保證，如「&lt;strong&gt;至少傳送一次&lt;/strong&gt;」、「&lt;strong&gt;持久化&lt;/strong&gt;」、「&lt;strong&gt;訊息的順序性&lt;/strong&gt;」、「&lt;strong&gt;訊息可重送多次&lt;/strong&gt;」
&lt;ul&gt;
&lt;li&gt;若相同&lt;strong&gt;訊息可重送多次&lt;/strong&gt;，不會影響結果就是符合冪等性(idempotent)，需要 consumer 另外實作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%9B%9B-publish/subscribe-pattern/publish-subscribe.png&#34;
	width=&#34;1531&#34;
	height=&#34;543&#34;
	srcset=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%9B%9B-publish/subscribe-pattern/publish-subscribe_hu398db46b8eff78fda80a450631206aab_25455_480x0_resize_box_3.png 480w, https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%9B%9B-publish/subscribe-pattern/publish-subscribe_hu398db46b8eff78fda80a450631206aab_25455_1024x0_resize_box_3.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;source:https://learn.microsoft.com/en-us/azure/architecture/patterns/publisher-subscriber&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;281&#34;
		data-flex-basis=&#34;676px&#34;
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;有哪些-pubsub-服務&#34;&gt;有哪些 Pub/Sub 服務?&lt;/h3&gt;
&lt;p&gt;這邊舉幾個服務，後續再寫一篇較詳細文章來比較之間差異&lt;/p&gt;
&lt;h4 id=&#34;rabbitmq&#34;&gt;RabbitMQ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;最廣泛使用的 message broker，特色是輕量級輕鬆部屬，但也有支援 distributed 以符合 high-scale 與 high-availability 的要求&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.rabbitmq.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;點我看更多👀&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;apache-kafka&#34;&gt;Apache Kafka&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;最先是由 LinkedIn 創立的一款&lt;strong&gt;分散式訊息系統 (distributed messaging system)&lt;/strong&gt;，由 Scala 和 Java 編寫的 open-source 專案，&lt;a class=&#34;link&#34; href=&#34;https://kafka.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;點我看更多👀&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%9B%9B-publish/subscribe-pattern/Overview_of_Apache_Kafka.jpg&#34;
	width=&#34;416&#34;
	height=&#34;309&#34;
	srcset=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%9B%9B-publish/subscribe-pattern/Overview_of_Apache_Kafka_hue991647147ca2d95c15c545730161e7a_23969_480x0_resize_q75_box.jpg 480w, https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E5%9B%9B-publish/subscribe-pattern/Overview_of_Apache_Kafka_hue991647147ca2d95c15c545730161e7a_23969_1024x0_resize_q75_box.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Kafka 概覽。source: wiki&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;134&#34;
		data-flex-basis=&#34;323px&#34;
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;原本的 Kafka 團隊有出雲端受託管版本的 Kafka - &lt;strong&gt;Confluent Cloud (Cloud Native Apache Kafka®)&lt;/strong&gt;，&lt;a class=&#34;link&#34; href=&#34;https://www.confluent.io/apache-kafka-vs-confluent/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;點我看更多👀&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;另外，AWS 也有是出自己的雲端版本的 Kafka - &lt;strong&gt;Amazon MSK&lt;/strong&gt;，&lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/tw/msk/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;點我看更多&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;cloud-pubsub&#34;&gt;Cloud Pub/Sub&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Google 創立的雲端 Pub/Sub 服務，可用於&lt;strong&gt;串流服務、非同步微服務整合&lt;/strong&gt;。&lt;a class=&#34;link&#34; href=&#34;https://cloud.google.com/pubsub?hl=zh-tw&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;點我看更多👀&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;參考資料-&#34;&gt;參考資料 👐&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;system expert&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://zh.wikipedia.org/zh-tw/Kafka&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;wiki - Kafka&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://learn.microsoft.com/en-us/azure/architecture/patterns/publisher-subscriber&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;publisher-subscriber pattern&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🍀 最後，若喜歡我的分享，可以幫我拍拍手👏，是對我最大的鼓勵!✨&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>系統設計基礎筆記(三) MapReduce</title>
        <link>https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B8%89-mapreduce/</link>
        <pubDate>Wed, 18 Jan 2023 10:32:40 +0800</pubDate>
        
        <guid>https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B8%89-mapreduce/</guid>
        <description>&lt;h2 id=&#34;mapreduce&#34;&gt;MapReduce&lt;/h2&gt;
&lt;h3 id=&#34;前言&#34;&gt;前言&lt;/h3&gt;
&lt;p&gt;MapReduce 是一個 Google 提出的軟體架構，適用於&lt;strong&gt;大規模資料的並列運算&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;prerequistites&#34;&gt;Prerequistites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;File System
&lt;ul&gt;
&lt;li&gt;資料的儲存系統&lt;/li&gt;
&lt;li&gt;有許多不同型態，例如以垂直結構為主的目錄與資料夾、Object storage 等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Distributed File System
&lt;ul&gt;
&lt;li&gt;分散式檔案系統，透過一大群機器(cluster)互相合作，對外表現如同&lt;strong&gt;一個巨大的 file system&lt;/strong&gt;，將 data 切成特定大小的 chunks (如 4 MB 或 64 MB)，會透過 &lt;strong&gt;central control plane&lt;/strong&gt; 會決定應該將 chunks 存在哪一個 node，後續應該去哪一個 node 讀取 chunks&lt;/li&gt;
&lt;li&gt;主要操作方式是透過&lt;strong&gt;網路&lt;/strong&gt;以定義好的通訊協定進行資料存取&lt;/li&gt;
&lt;li&gt;目前現有的產品有 Google File System (GFS)、Hadoop Distributed File System (HDFS)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hadoop
&lt;ul&gt;
&lt;li&gt;支持 MapReduce 與資料管線的 open-source 框架，最重要的中央組件為 Hadoop Distributed File System (HDFS)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;各階段簡介&#34;&gt;各階段簡介&lt;/h3&gt;
&lt;h4 id=&#34;map-階段&#34;&gt;Map 階段&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;負責 &lt;strong&gt;filtering&lt;/strong&gt; 和 &lt;strong&gt;sorting&lt;/strong&gt; 並且組合出一個 key value pair 結果&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;reduce-階段&#34;&gt;Reduce 階段&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;負責&lt;strong&gt;資料整合&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;以 wordcount 為例，從 Map 傳過來的 key 若一樣，表示同一個字，因此把一樣的 key 做加總，可以得出最後的出總筆數&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;冪等性idempotency特性&#34;&gt;冪等性(idempotency)特性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;意義: &lt;strong&gt;當操作多次，結果應呈現一致&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;透過 pub/sub messaging system 應當有冪等性，因為 pub/sub 系統本身允許相同訊息被 consumer 接收多次&lt;/li&gt;
&lt;li&gt;舉例，增加資料庫某欄位的 integer value，就不是一個具有冪等性的操作，因為保持每次增加的操作後都不會保持跟前一個相同的數值&lt;/li&gt;
&lt;li&gt;另一舉例，將欄位值設定為 &amp;ldquo;DONE&amp;rdquo;，多次重複此操作，還是會顯示為 &amp;ldquo;DONE&amp;rdquo;，因此設定為 &amp;ldquo;DONE&amp;rdquo; 是一個冪等性操作&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;範例&#34;&gt;範例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;input&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;要做計算的原始資料，可以是一堆文字清單等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;split&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;把 input 資料做分散處理&lt;/li&gt;
&lt;li&gt;以 hadoop 來說，當 MapReduce 工作被輸入的時候，會被&lt;strong&gt;切割到各個 cluster 裡面等待做處理&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;🔔&lt;strong&gt;map&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;MapReduce 的 map 階段&lt;/li&gt;
&lt;li&gt;每一個節點有自己的一份資料要分析，會把對應切割出來的資料&lt;strong&gt;建立 key value 的結果&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;key 是字本身，value 是 1 代表找到一筆&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;combine&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在 map 的機器進行以下動作&lt;/li&gt;
&lt;li&gt;將一樣的 key 先做一次加總，避免傳送多次出去，例如 combine 後的結果可能是 &amp;ldquo;A&amp;rdquo; 有 2 筆、&amp;ldquo;B&amp;rdquo; 有 1 筆等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;shuffle &amp;amp; sort&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在進入 reduce 階段之前，會先被做一個&lt;strong&gt;排序&lt;/strong&gt;，因此&lt;strong&gt;相關的 key 會放在一起&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;比如第一批資料的 &amp;ldquo;A&amp;rdquo; 有 2 筆、第二批資料的 &amp;ldquo;A&amp;rdquo; 有 5 筆&amp;hellip;第一批資料的 &amp;ldquo;B&amp;rdquo; 有 1 筆、第二批資料的 &amp;ldquo;B&amp;rdquo; 有 3 筆&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;🔔&lt;strong&gt;reduce&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;此階段會做&lt;strong&gt;實際的加總&lt;/strong&gt;，因此每一個 key 的 value 會被加總&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;output&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;最後得到的結果&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B8%89-mapreduce/061114_0930_Introductio1.jpg&#34;
	width=&#34;642&#34;
	height=&#34;460&#34;
	srcset=&#34;https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B8%89-mapreduce/061114_0930_Introductio1_hu4f185708e50b3a3419973268adc34821_28898_480x0_resize_q75_box.jpg 480w, https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B8%89-mapreduce/061114_0930_Introductio1_hu4f185708e50b3a3419973268adc34821_28898_1024x0_resize_q75_box.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;source: https://www.guru99.com/introduction-to-mapreduce.html&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;139&#34;
		data-flex-basis=&#34;334px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;參考資料-&#34;&gt;參考資料 👐&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;system expert&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://zh.wikipedia.org/zh-tw/MapReduce&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;wiki MapReduce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.guru99.com/introduction-to-mapreduce.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;introduction-to-mapreduce&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🍀 最後，若喜歡我的分享，可以幫我拍拍手👏，是對我最大的鼓勵!✨&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>系統設計基礎筆記(二) Cache</title>
        <link>https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%8C-cache/</link>
        <pubDate>Tue, 17 Jan 2023 11:04:46 +0800</pubDate>
        
        <guid>https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%BA%8C-cache/</guid>
        <description>&lt;h2 id=&#34;cache-快取&#34;&gt;Cache 快取&lt;/h2&gt;
&lt;h3 id=&#34;前言&#34;&gt;前言&lt;/h3&gt;
&lt;p&gt;快取對於系統層面上相當重要，用的好、用的巧，有助於整體系統的順暢度。&lt;br&gt;
因此目標是了解👉為什麼使用、👉使用策略與👉何時使用。&lt;/p&gt;
&lt;h3 id=&#34;prerequistites&#34;&gt;Prerequistites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;cache
&lt;ul&gt;
&lt;li&gt;意思是將一部分的資料儲存起來，需要使用的時候，不需要經過後端或者資料庫再拿一次，優勢是取得資料較快&lt;/li&gt;
&lt;li&gt;通常使用的情境是將常用且不經常修改的 response 儲存，不必每次都去跟後端與資料庫請求&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;cache hit
&lt;ul&gt;
&lt;li&gt;需要的資料能在快取中找到 🉐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;cache miss
&lt;ul&gt;
&lt;li&gt;需要的資料無法在快取中找到 🈚&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;content delivery network (CDN)
&lt;ul&gt;
&lt;li&gt;一種第三方服務，扮演的角色就像快取，為什麼呢 ? 請往下看&lt;/li&gt;
&lt;li&gt;越來越多服務的據點散布全球🌏，若 server 只有在幾個國家，其他國家的使用者可能會遇到網頁轉很久等問題⌛，中間網路傳輸耗時太長導致 latency 長，此時若有散布全球的 CDN server，請求就能先傳送到 CDN server 處理，縮短 latency&lt;/li&gt;
&lt;li&gt;舉例一些 CDN 廠商，如 Cloudflare 與 Google cloud CDN&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-個使用快取的目的&#34;&gt;3 個使用快取的目的&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;利用前端快取，減少請求到後端&lt;/li&gt;
&lt;li&gt;減少對資料庫的請求，降低資料庫壓力&lt;/li&gt;
&lt;li&gt;避免 long compute operation，增加系統速度&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;快取更新機制&#34;&gt;快取更新機制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;write through cache
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;同時&lt;/strong&gt;更新資料庫與快取的資料&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;write back cache
&lt;ul&gt;
&lt;li&gt;先更新快取，再以&lt;strong&gt;非同步&lt;/strong&gt;的方式更新資料庫的資料&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;快取替換機制-cache-eviction-policy&#34;&gt;快取替換機制 Cache eviction policy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Least &lt;strong&gt;Recently&lt;/strong&gt; Used (LRU)
&lt;ul&gt;
&lt;li&gt;依照&lt;strong&gt;最近使用時間&lt;/strong&gt;來排序&lt;/li&gt;
&lt;li&gt;思路:
&lt;ul&gt;
&lt;li&gt;最近使用時間最接近，表示近期內使用到的可能性也越高&lt;/li&gt;
&lt;li&gt;優先替換掉最近使用時間距離當下最遠的那組數據&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Least &lt;strong&gt;Frequently&lt;/strong&gt; Used (LFU)
&lt;ul&gt;
&lt;li&gt;依照&lt;strong&gt;使用頻率&lt;/strong&gt;來排序&lt;/li&gt;
&lt;li&gt;思路:
&lt;ul&gt;
&lt;li&gt;使用次數越高⬆️，表示近期內使用到的可能性也越高⬆️&lt;/li&gt;
&lt;li&gt;優先替換掉使用次數最低的那組數據&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;First in First out (FIFO)
&lt;ul&gt;
&lt;li&gt;顧名思義，&lt;strong&gt;先進先出&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;思路: 最先進去快取的資料，越早會被淘汰&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;參考資料-&#34;&gt;參考資料 👐&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;System expert&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🍀 最後，若喜歡我的分享，可以幫我拍拍手👏，是對我最大的鼓勵!✨&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>系統設計基礎筆記(一) Security And HTTPS</title>
        <link>https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B8%80-security-and-https/</link>
        <pubDate>Mon, 16 Jan 2023 12:35:00 +0800</pubDate>
        
        <guid>https://yue-jenny.github.io/2023/01/%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E5%9F%BA%E7%A4%8E%E7%AD%86%E8%A8%98%E4%B8%80-security-and-https/</guid>
        <description>&lt;h2 id=&#34;security-and-https&#34;&gt;Security And HTTPS&lt;/h2&gt;
&lt;h3 id=&#34;前言&#34;&gt;前言&lt;/h3&gt;
&lt;p&gt;除了了解前/後端語言與框架如何使用外，也希望能對 Http/Https 的原理與安全機制有所了解。&lt;/p&gt;
&lt;h3 id=&#34;prerequistites&#34;&gt;Prerequistites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;IP Packet&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;透過 IP 傳送的最小數據的單位，通常會包含 IP Header 與 payload&lt;/li&gt;
&lt;li&gt;IP Header 包含來源與目的地的 IP Address&lt;/li&gt;
&lt;li&gt;payload 就是你要傳送的資料&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Man-In-The-Middle Attack (又稱呼為 MITM)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;意思是攔截 client 與 server 間傳送的訊息 💬&lt;/li&gt;
&lt;li&gt;若 client 與 server 間傳送訊息有透過&lt;code&gt;加密&lt;/code&gt;與 &lt;code&gt;Https&lt;/code&gt; 可防止資料被竊取&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Symmetric Encryption (對稱加密)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;加密與解密資料都使用&lt;strong&gt;同一把 key&lt;/strong&gt; 🔑&lt;/li&gt;
&lt;li&gt;缺點是安全性會有所疑慮，key 通常會被分享到一個點或多個點&lt;/li&gt;
&lt;li&gt;優點是速度比非對稱加密快 🐇&lt;/li&gt;
&lt;li&gt;最廣泛使用的演算法是 Advanced Ecryption Standard(AES)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Asymmetric Encryption (非對稱加密)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;加密與解密資料會利用到&lt;strong&gt;兩把 key&lt;/strong&gt; 🔑🔑，分別為 public key 與 private key&lt;/li&gt;
&lt;li&gt;public key 負責加密資料，只能利用相對應的 private key 解密資料&lt;/li&gt;
&lt;li&gt;所以 public key 分享給需要加密資料的一端，而 private key 則需要 &lt;strong&gt;安全地保存&lt;/strong&gt; ㊙️&lt;/li&gt;
&lt;li&gt;速度會比對稱加密慢 🐢&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Advanced Ecryption Standard(AES)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最廣泛&lt;/strong&gt;使用的&lt;strong&gt;加密標準&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;三種對稱演算法分別為 AES-128、AES-192、AES-256&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Transport Layer Security (TLS)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在&lt;strong&gt;傳輸層&lt;/strong&gt;的一種協定，目的是為了網路通訊時的安全，確保沒有第三方能竊聽或者竊取任何資訊&lt;/li&gt;
&lt;li&gt;衍生於另一種安全協定 Secure Socket Layer (SSL)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SSL certificate&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;由 certificate authority (CA) 頒發給 server 的數位憑證&lt;/li&gt;
&lt;li&gt;內容包含 server 端的 public key，因為在 TLS Handshake 過程中會使用到&lt;/li&gt;
&lt;li&gt;目的是確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;http-vs-https&#34;&gt;Http vs Https&lt;/h3&gt;
&lt;h4 id=&#34;http&#34;&gt;Http&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;全名為 HyperText Transfer Protocol&lt;/li&gt;
&lt;li&gt;一種常見的網路通訊協議&lt;/li&gt;
&lt;li&gt;流程是 client 送出 http request，而 server 送出回應&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;https&#34;&gt;Https&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;全名為 HyperText Transfer Protocol &lt;strong&gt;Secure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;顧名思義是為了可於網路上🔐&lt;strong&gt;安全地&lt;/strong&gt;通訊而出現的一種網路通訊協議&lt;/li&gt;
&lt;li&gt;為了達到上述要求，因此 server 被要求須具備以下兩項
&lt;ul&gt;
&lt;li&gt;須獲得可信任的憑證(&lt;code&gt;SSL certificates&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;Transport Layer Security (TLS)&lt;/code&gt; 加密 client 與 server 端的數據。TLS 如何運作，請往下看。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;tls-連接是透過-tls-handshake-來啟動&#34;&gt;TLS 連接是透過 TLS Handshake 來啟動&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;流程
&lt;ul&gt;
&lt;li&gt;client 送出 &lt;code&gt;client hello&lt;/code&gt; (隨機的 bytes) 給 server&lt;/li&gt;
&lt;li&gt;server 回應 &lt;code&gt;server hello&lt;/code&gt; (也是隨機的 bytes) 以及 SSL certificate&lt;/li&gt;
&lt;li&gt;client 驗證 CA 頒發的憑證，確認憑證正確屬於此 server 擁有&lt;/li&gt;
&lt;li&gt;client 接著會送出一組用 public key 加密的 &lt;code&gt;premaster secret&lt;/code&gt; 給 server&lt;/li&gt;
&lt;li&gt;client 和 server 將會使用 &lt;code&gt;client hello&lt;/code&gt;, &lt;code&gt;server hello&lt;/code&gt;與 &lt;code&gt;premaster secret&lt;/code&gt; 產生對稱加密的 &lt;code&gt;session keys&lt;/code&gt;，用於後續的通訊內容的加密與解密 🔐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;tcp-利用-handshake-方式來連接與斷連&#34;&gt;TCP 利用 Handshake 方式來連接與斷連&lt;/h3&gt;
&lt;h4 id=&#34;tcp-三次握手建立連線&#34;&gt;TCP 三次握手(建立連線)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;流程&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一次握手：
&lt;ul&gt;
&lt;li&gt;客戶端傳送請求 SYN 報文給服務端，傳送完畢之後，客戶端處於 SYN_Send 狀態。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第二次握手：
&lt;ul&gt;
&lt;li&gt;服務端收到請求報文之後，&lt;strong&gt;如果同意連線，會回傳 SYN + ACK 應答報文&lt;/strong&gt;，服務端為SYN_Receive狀態&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第三次握手：
&lt;ul&gt;
&lt;li&gt;客戶端接收到服務端的 SYN + ACK ，然後&lt;strong&gt;傳送確認報文作為應答&lt;/strong&gt;，客戶端轉為Established狀態&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;為什麼一定要三次?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;為了防止已失效的連接請求報文段突然又傳送到了服務端，因而產生錯誤&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;tcp-四次握手結束連線&#34;&gt;TCP 四次握手(結束連線)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;流程
&lt;ul&gt;
&lt;li&gt;第一次分手
&lt;ul&gt;
&lt;li&gt;客戶端傳送FIN=1告訴服務端，客戶端所有的資料&lt;strong&gt;全部發送完畢&lt;/strong&gt;，服務端可以關閉接收了。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第二次分手
&lt;ul&gt;
&lt;li&gt;服務端接收到客戶端的釋放請求連線之後，知道客戶端沒有資料傳送給自己了，然後&lt;strong&gt;服務端傳送ACK=1告訴客戶端接收到你發給我的訊息&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第三次分手
&lt;ul&gt;
&lt;li&gt;告訴客戶端，&lt;strong&gt;服務端的所有資料傳送完畢&lt;/strong&gt;，客戶端你也可以關閉接收資料連線了。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第四次分手
&lt;ul&gt;
&lt;li&gt;客戶端接收到了服務端傳送完畢的訊息之後，就&lt;strong&gt;傳送ACK=1，告訴服務端，客戶端已經接收到你的訊息&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;參考資料-&#34;&gt;參考資料 👐&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;System expert&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.cloudflare.com/learning/ssl/what-happens-in-a-tls-handshake/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;what-happens-in-a-tls-handshake&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🍀 最後，若喜歡我的分享，可以幫我拍拍手👏，是對我最大的鼓勵!✨&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
