隨著容器技術的崛起,開發人員的思維也從單主機擴展到了分布式。Bilgin Ibryam在Red Hat官方博客上介紹了什么是分布式原語,以及它與進程內原語之間的聯系。本文已獲得作者翻譯授權,查看原文New Distributed Primitives for Developers。
面向對象的原語(進程內原語)
作為一個Java開發者,我熟悉面向對象概念,比如類、對象、繼承、封裝、多態,等等。除了面向對象,我也熟悉Java運行時,比如它提供了哪些特性,它是如何管理應用程序的,對象和應用程序的生命周期是怎樣的,等等。
十多年來,作為一名開發人員,我使用這些工具、原語和構建塊來創建應用程序。在我的意識里,我把類看成組件,它生成對象,并由JVM來管理它們。不過,這種模型近來在發生變化。
Kubernetes的原語(分布式原語)
我從去年開始在Kubernetes上運行Java應用程序,Kubernetes為我們引入了新的概念和工具。有了Kubernetes,我就不再局限于使用面向對象和JVM原語來實現應用程序功能。雖然我仍然需要使用面向對象的構件塊來創建應用程序組件,但也可以借助Kubernetes原語來實現部分的應用程序功能。
例如,我正在嘗試將應用程序組件單元放入獨立的容器鏡像,讓它們成為主要的構建塊。這樣我就可以使用Kubernetes提供的一系列豐富的組件來實現應用程序功能?,F在,我除了可以使用ExecutorService來實現服務定期作業,還可以使用Kubernetes的CronJob原語來定期運行容器。
Kubernetes的CronJob也提供了一些類似的基于時間的行為,不過它使用的是更加高級的組件,并依賴調度器完成動態配置、執行健康檢查,在作業完成之后關閉容器。這一切讓作業的運行更具彈性,對資源的使用也更加優化。如果我要執行應用程序的初始化操作,除了可以使用對象的構造函數,還可以使Kubernetes的init-container從更高層面來實現初始化。
腦海里的分布式模型
將本地進程內原語(面向對象和JVM特性)和由Kubernetes提供的進程外分布式原語結合起來,開發人員就可以更好地創建應用程序。在構建一個分布式的應用程序時,我的意識不再局限于一個JVM,而是擴散到一組運行著JVM的主機上。
進程內原語與分布式原語有一些共性,但它們之間不具有直接的可比性。它們運行在不同的抽象層之上,有不同的前提條件,并提供了不一樣的保證。有一些原語可以放在一起使用,比如我們使用類來創建對象,并把對象放入容器鏡像。不過有一些原語可以相互替代,比如Kubernetes的CronJob完全可以替代Java里的ExecutorService。以下列出我發現的JVM和Kubernetes之間的部分共性。
新的原語為解決問題提供了新的方式,有些重復性的方案變成了模式。可以參考“Kubernetes模式”這本書了解更多這方面的內容。
關于作者
Bilgin Ibryam是Apache軟件基金會成員,Red Hat的集成架構師,一個軟件工匠和博主。他熱愛開源,熱衷分布式系統、消息傳遞和應用集成。他同時是“Camel設計模式”和“Kubernetes模式”的作者。