OpenFaaS實戰之六:of-watchdog(為效能而生)

程式設計師欣宸發表於2021-08-05

歡迎訪問我的GitHub

https://github.com/zq2599/blog_demos

內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;

OpenFaaS實戰系列文章連結

  1. 部署
  2. 函式入門
  3. Java函式
  4. 模板操作(template)
  5. 大話watchdog
  6. of-watchdog(為效能而生)
  7. java11模板解析
  8. OpenFaaS實戰之八:自制模板(maven+jdk8)
  9. OpenFaaS實戰之九:終篇,自制模板(springboot+maven+jdk8)

本篇概覽

  • 本文是《OpenFaaS實戰》系列的第六篇,前文我們們瞭解了watchdog,在懂得原理之後又引發了擔憂:每次響應web請求都要fork一個程式,這種方式可能會有效能問題;
  • 如果每個請求都要建立程式,做為一個Java程式設計師是無法接受的,Java之父馬士兵老師在B站的諄諄教誨猶在耳畔想起:執行緒池、非同步響應、NIO...
  • 前文的文末也劇透過,上述效能問題已被解決,而具體的解決方式就是本文的主要內容:of-watchdog;

上古祕籍的啟示

2020年3月出版的《深入淺出Serverless》一書中,陳耿老師提到為了優化watchdog效能,OpenFasS正在孵化一個全新的watchdog實現:of-watchdog,如下圖:

在這裡插入圖片描述

不要過於樂觀

  • 目前官方對of-watchdog的態度,是樂觀又小心謹慎,因此,要提前把風險暴露出來,請您在決策是否用於生產環境時作為參考;
  • 首先是指出of-watchdog正在變得普及:

在這裡插入圖片描述

  • 以下是支援of-watchdog的模板,如下圖紅框,僅僅是可用於測試(avilable for testing),看來裡生產環境可用還是有段距離的:

在這裡插入圖片描述

初探

在這裡插入圖片描述

  • 雖然欣宸的英語很渣,但還是看懂了上圖紅框裡的意思:of-watchdog是函式微服務之間的反向代理
  • 大多數人和我一樣秒懂了,但我還是想解(mai)釋(nong)一下,先看看典型的反向代理,如下圖,瀏覽器訪問電商網站時,訂單服務和購物車服務的請求都發到同一個Nginx,Nginx根據請求URL將請求轉發到不同的Tomcat上去,瀏覽器只知道Nginx,不知道正真執行任務的是Tomcat,此時的Nginx就是反向代理

在這裡插入圖片描述

  • of-watchdog是函式微服務之間的反向代理,我這邊腦補出的效果如下:

在這裡插入圖片描述

  • 而且官方提到了微服務,我這邊本能的感覺就是:前文的watchdog轉發請求是走STDIN,而of-watchdog這裡應該不走STDIN了,而是http,畢竟martinfowler對微服務的定義中就指出要處理http請求,如下圖紅框:

在這裡插入圖片描述

  • 事實證明,of-watchdog的實際情況比我的腦補結果複雜,因為of-watchdog有模式(mode)的概念,接下來細看各種模式下的of-watchdog到底是什麼?

http mode

  • of-watchdog的預設模式是http模式,部署服務時of-watchdog會fork一個程式(假設為程式A),程式A會監聽一個埠,of-wahtchdog收到的所有請求都會轉發到程式A監聽的埠,官方架構圖如下:

在這裡插入圖片描述

  • 看完上述架構圖有種如釋重負的感覺,我們們寫的程式碼是在右側的child裡面執行的,這個child從3000埠收到of-watchdog轉發過來的外部請求,然後內部處理掉,這不就是tomcat的做法麼,前文留下的擔憂此時煙消雲散了;
  • 官方對of-watchdog的優點描述如下(請原諒我的不入流翻譯):
  • 第一,併發效能和吞吐量最優;
  • 第二,相比watchdog,對記憶體的使用更高效;
  • 第三,建好的資料庫連線可以反覆使用;
  • 第四,容器作業系統的臨時資料夾(/tmp/目錄),是所有請求共用的,例如可以做臨時快取用;
  • 第五,好像是關於Node和Python的,我實在讀不懂,請您自己看原文吧:
Does not require new/custom client libraries like afterburn but makes use of a long-running daemon such as Express.js for Node or Flask for Python
  • 儘管我們們的問題已經找到了答案,但除了http模式,of-watchdog還有其他幾種模式也建議您簡單瞭解,有的場景下還是用得上的;

serializing mode

使用了該模式,of-watchdog就和前面的watchdog沒啥區別了,就是用來和watchdog保持相容的;

streaming mode

  • 該模式下,每收到一個請求,會fork一個程式來處理;
  • 該模式的特點是可以處理比容器記憶體還大的請求body,例如容器記憶體只有512兆,但是能處理上G的請求body(這麼大的body一般是多媒體內容,例如視訊)
  • 從名稱streaming可見,處理檔案流的函式,適合使用此模式;

static mode

afterburn mode

最後一個是afterburn模式,正在我精疲力盡的時候,發現官方宣佈此模式已經廢棄(如下圖),太好了,可以不用關心這個模式了!

在這裡插入圖片描述

  • 嘴上說不關心,但是忍不住多看一眼afterburn模式的架構圖,如下圖,被fork的程式與父程式之間有HTTP通道,並且of-watchdog還能通過STDIN輸入,並且能接收子程式的STDOUT,這個架構有點燒腦,不過可以不用關心了,因為它被廢棄了:

在這裡插入圖片描述

展望

  • 看完of-watchdog的設計後,我們們已經知道,之前的實戰寫的程式碼以微服務的形態提供服務,這一點引起了我的好奇,下一篇文章,欣宸會以一個普通Java開發者的身份去探索這個祕密:OpenFaaS環境下,我們們寫的Java類為何會以微服務形態執行?
  • 這不是刨根問底或者吹毛求疵,而是為了後面可以更加隨心所欲的開發OpenFaaS函式;

你不孤單,欣宸原創一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 資料庫+中介軟體系列
  6. DevOps系列

你不孤單,欣宸原創一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 資料庫+中介軟體系列
  6. DevOps系列

歡迎關注公眾號:程式設計師欣宸

微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos

相關文章