天天看點

常用的軟體技術思想-池化技術等

池化技術

實際案例

今天去公司食堂吃早點,排了一隊人,先是包子饅頭,然後是韭菜盒子,各種餅,最後是喝的,比如小米粥,黑米粥,豆漿等,

發現隊伍阻塞在最後那一段(小米粥,黑米粥,豆漿)了,這個說要黑米粥,阿姨忙不疊地去打黑米粥,那個說要小米粥,阿姨趕緊去打小米粥。。。

阿姨已經沒有功夫來決定打哪個了。

那麼我們看看另外一種情況,阿姨提前做好囤貨的工作,比如小米粥,黑米粥,豆漿各打10碗放着,誰要誰自己拿。阿姨的工作就不用圍着顧客團團轉了,而是看哪個少了,就打哪個,比如發現黑米粥還剩下3碗了,那麼就多打黑米粥。

簡單來說就是提前儲存大量的資源,以備不時之需

核心是複用

池化技術作用

  1. 複用相同的資源,減少浪費,減少建立和銷毀的成本;
  2. 減少單獨管理的成本,統一交由"池";
  3. 集中管理,減少"碎片";
  4. 提高系統響應速度,因為池中有現成的資源,不用重新去建立;

使用池化技術的例子

java線程池

java中所有的池化技術都有一個好處,就是通過複用池中的對象,降低系統資源消耗。設想一下如果我們有n多個子任務需要執行,如果我們為每個子任務都建立一個執行線程,而建立線程的過程是需要一定的系統消耗的,最後肯定會拖慢整個系統的處理速度。而通過線程池我們可以做到複用線程,任務有多個,但執行任務的線程可以通過線程池來複用,這樣減少了建立線程的開銷,系統資源使用率得到了提升!

通俗一點,線程池,就是提前建立 n 個線程在池中等待執行,當有任務過來時,直接從池中撈一個線程負責執行這個任務,執行完成之後,再放回池中,等待執行新的任務。

池中的線程可以多次利用,提高了資源使用率。

因為會預制 n 個線程,是以提高了響應速度。

資料庫連接配接池

資料庫連接配接池基本的思想是在系統初始化的時候,将資料庫連接配接作為對象存儲在記憶體中,當使用者需要通路資料庫時,并非建立一個新的連接配接,而是從連接配接池中取出一個已建立的空閑連接配接對象。使用完畢後,使用者也并非将連接配接關閉,而是将連接配接放回連接配接池中,以供下一個請求通路使用。而連接配接的建立、斷開都由連接配接池自身來管理。同時,還可以通過設定連接配接池的參數來控制連接配接池中的初始連接配接數、連接配接的上下限數以及每個連接配接的最大使用次數、最大空閑時間等等,也可以通過其自身的管理機制來監視資料庫連接配接的數量、使用情況等

java 記憶體池

如果每次需要記憶體時都是重新申請,會産生很多記憶體碎片,影響記憶體的使用率。

如果一開始就申請一大塊記憶體,按需使用,那麼就會減少記憶體碎片。

計算系統池化技術

不同類型資源之間也存在生命周期不同步的問題。譬如,CPU 是發展速度最快的,每兩三年就性能翻倍,然而存儲的技術發展相對緩慢,進而會造成CPU性能和功耗的浪費。  伺服器資源池化技術,除了能夠帶來靈活、彈性的資源部署,提高資源使用率這個優勢,還能夠更有效的提高伺服器的故障修複能力,提升伺服器營運效率。硬碟是故障率最高的部件之一,在實作存儲池化技術後,多盤存儲資源池為單體硬碟提供了很好的備援設計能力。當單個硬碟出現故障後,可以及時使用其他硬碟資源進行無損恢複,無需立即現場更換硬碟

常用的軟體技術思想-池化技術等

虛拟化技術

虛拟化技術和雲服務都是基于虛拟化技術,将單個伺服器硬體虛拟成多個虛拟機VM,其目的也是在于提高伺服器資源的使用率

常用的軟體技術思想-池化技術等

事件驅動開發

Event loop /Event driven development

我們想象現實生活中的例子,

以前去肯德基買吃的,需要排很長的隊,排隊的時候你隻能幹等着,啥也不能幹。

比如你不能去上洗手間,你不能去買汽車票,你甚至不能确定你想買的東西還有沒有。

現在像肯德基這種地方都安裝了自動下單的實體裝置,你可以自己下單買什麼,然後去幹别的事情。

快到你的時候,你的手機會收到提醒,然後你就直接去取餐了。

這兩個場景最大的差別是什麼?

前者是主動的,

後者是被動的,你會收到提醒。後者就是事件驅動的。

例子-支付成功回調

比如我們網上購物,支付訂單時會跳轉到第三方支付系統(比如支付寶),支付成功之後,

支付成功之後,第三方支付系統(比如支付寶)會給業務系統發送消息通知,業務系統受到通知之後,就會進行處理,比如修改訂單狀态,發出發貨提醒等。

比如我們去食堂吃飯,如果刷工卡,刷卡成功之後,從業人員會及時從刷卡裝置看到通知,就知道支付成功了,就不用找我們确認了。-- 事件驅動

如果使用手機去支付,從業人員會過一會問你下有沒有支付成功,還要看你的手機界面。-- 輪詢

java swing

在 java swing 中,每個界面元素(按鈕,下拉框,輸入框),都會綁定一個回調事件,當使用者事件(例如單擊,輸入)發生時,系統會自動調用綁定的回調事件。

常用的軟體技術思想-池化技術等

設計态(開發态)-->使用者态-->自治

現在有一種趨勢:很多以前需要專業人員來操作的東西,現在普通人也可以操作。

比如20年前,一個内容釋出系統裡面的文章是需要網頁程式設計人員來釋出的,可能還需要編寫 HTML,調樣式,

但是現在我們不用會程式設計,也可以随便發表部落格,比如在 簡書,知乎 上發表文章。

很多公司,特别是大公司,緻力于把軟體開發過程中的某個環節,由開發态轉化為使用者态。

比如公司團隊開發了通過拖拽(不用編寫代碼)就可以生成 HTML 頁面的平台,這樣非網頁開發人員(比如後端)就可以自己開發網頁了。

再比如Google blocky,全程使用者态。

生成源代碼的步驟

常用的軟體技術思想-池化技術等

其中"編譯",類似于我們大學課程中的編譯原理。

"代碼自動優化":對生成的代碼進行優化,比如把

if ((amout == 100))

優化為

if (amout == 100)

,當然也有其他更複雜的優化。

模仿 Blockly 的代碼生成

Google Blockly 是一款基于Web的、開源的、可視化程式編輯器。你可以通過拖拽塊的形式快速建構程式,而這些所拖拽的每個塊就是組成程式的基本單元。可視化程式設計完成,Blockly 直接支援 JavaScript、Python、PHP、Lua、Dart 語言源碼的導出。此外,還可以将 Blockly 編輯器快速內建到Web、Android或iOS環境中。

常用的軟體技術思想-池化技術等

下面是參考Blockly 的 java 項目

界面操作(動畫)

常用的軟體技術思想-池化技術等

最終界面

常用的軟體技術思想-池化技術等

儲存生成的 json 格式

常用的軟體技術思想-池化技術等

解析

常用的軟體技術思想-池化技術等

生成的代碼

常用的軟體技術思想-池化技術等

代碼生成工具

常用的軟體技術思想-池化技術等

對應的界面元素

常用的軟體技術思想-池化技術等

說明

代碼生成的過程遠比上述過程複雜,比如涉及到編譯原理,抽象文法樹 AST,代碼優化等

參考

https://github.com/google/blockly/wiki https://developers.google.com/blockly/guides/overview https://developers.google.com/blockly/