2017 JavaOne參會感想
國慶期間有幸作為代表和另外 6 位同學去舊金山參加 JavaOne 大會,本次大會我關注的幾個關鍵的 points:
AJDK 在 Java 9 的 Keynote 主場公開亮相,Kingsum 為全場聽眾講解了 AJDK 如何與 Intel 等硬件商場深度合作,支撐了雙 11 全球最大的購物節。
Java 9 的新特性,以模塊化為代表。
Serverless、Cloud Native 架構。
微服務和 DevOps 的結合。
下麵記錄一些感覺相對有啟發的 info 帶著我個人的一些想法:
Java Keynote
Alibaba JDK
這一場應該是本次大會對 Java 9 和 Java 生態而言最光鮮的亮相,三紅提前劇透了說會有驚喜,結果真的是個大驚喜,Kingsum 代表阿裏巴巴把 AJDK 在這個 Keynote 上公開 show 了一把,包括實例數、性能改進、多租戶、WISP 協程、JITWarmUp 等特性簡直亮瞎了,比較自豪。
Intel
看讚助商列表的時候看到 Intel 是 TOP 1,剛在想作為一個硬件廠商和 Java 9 發布有什麼關係時,Intel 的 VP 就解答了這個疑問,Intel 還是比較有危機感,除了芯片還在做非常多和軟件特別是語言底層緊密結合的事情,10 年來 Intel 使得 Java 的性能提升了 73 倍,比如 Intel 也在搞 AI 戰略,他們的思路是要做 AI 的 infrastructure,例如 AVX512 指令集,針對向量計算相比上一代有 8~16 倍的提升,還不僅於此,Intel 直接發布了 Vector API SDK 讓 Java 程序員可以用 Java API 去充分壓榨硬件的向量計算性能,在過去是需要用 JNI 去調用 low-level API 實現的事情,現在可以用 PureJava 了。
Intel 在存儲上也有不少創新,非易失內存 3D-XPoint 和 Optane SSD 的發布(對於二者的區別 Session 結束後問了下,前者是基於 byte 裸訪問的,後者還是麵向 Block 和文件係統),結合 pmem 庫的支持(還在 pilot flight 開發階段),對未來幾年的存儲軟件有很大的利好,褚霸團隊的 PolarDB 似乎也是用的 Optane。
針對深度學習開源了 BigDL 框架,Scala/Python 也都支持,Intel 決心還是有的。
其它
Spotify 分享了下如何從 Python 遷移到 Java,背了個書。
Kubernetes 已經成為容器調度實際的主流,發布了 Wercker 在線性能診斷工具,相比 Cloud Native 提出了 Container Native 的概念,有一係列的本地工具提高對開發者的友好度。
Java 9 開始提供了 jlink 這個新工具,需要結合 module 一起用,能夠隻打包用到的 JRE 模塊,大幅縮小容器鏡像的大小(對 Container 微服務比較有用)。
Java 9 引入了 AOT,不過目前還非常 experimental 的階段,生產環境還為時尚早。
JUG 社區氛圍
國內在 Java 社區這一塊的氛圍感覺遠不如 Go/Node.JS/Python/Ruby 等語言的社區,一定程度上是因為 Java 程序員數量比較多,比較少抱團,另一方麵 Java 程序員一般都在做企業級的應用,平時和社區交流的機會也少一些。不少講師都有一個 Java Champion 的頭銜,查了一下,這個冠軍程序員不光要求技能過關,而且要在社區上投入足夠多的精力和時間,得到社區認可的人才可以獲此殊榮。
國外的 JUG 發展非常火熱,幾乎每個城市甚至一個城市會有 2 個以上的 JUG,聽了一場芝加哥 JUG 的負責人的 Session,大家都在談 JCP,關於建設社區的一些 points:
尊重社區裏的 members,不要泄露別人隱私 like email,不然會被懲罰
傳播信息時要精確的信息(比如不要用『第一個工作日、這周的休息日』這樣的描述),每個成員來自不懂的地域,習俗不同,比如有些地方是周一休息
冷啟動 JUG 比較好的方式:參加別的會議看是否有同城來的,social 拉攏一下
lightening talk,每個人 5 到 10 分鍾,讓每個人都有表達的機會
整體感覺雖然是技術社區,但很 social beings,雖然工程師都比較 nerd
內部認同感很強,有種巫師秘密集會的感覺
後來我也跟坤穀聊了下這個問題,有機會的話後麵希望能為我們自己的 JUG 做一些貢獻。
關於 Java 未來發展
這一場找了一些 Java 社區中的活躍者,基本上是一些 Java 生態創業公司的技術負責人的角色,例如 Azul JVM,也有 Oracle/IBM/Google 這樣巨頭的 TL 來參加。
挑選幾個有價值的信息:
Oracle 向社區捐贈 JavaEE,同時最新的 JavaEE 8 也發布了,社區比較興奮,準備大幹一場,例如 Eclipse MicroProfile 等社區,我們平時用 Spring 比較多,這塊其實關注度不太高,整體上 JavaEE 未來的發展會比過去更快
Google 目前在 JVM 生態上的投入,主要是維護 CMS GC(Oracle 一定會推 G1,CMS 的代碼太老太複雜,維護成本太高,但是 Google 有需要),以及一些 OpenJDK 的 patch
Java 在 AI 方麵,Mahout 和 Spark 這些基礎設施都是運行在 JVM 之上,社區的人認為 Java 在 AI 方麵相比 Python 更成熟穩定,所用的東西都是經過 5 年以上考驗的(這個麼聽聽就好了:D)
對於 G1 的使用,Oracle 的同學表示還是要看具體 case,從他們的經驗看,目前對於 large heap 的場景 G1 還是有優勢的,另外對於使用 G1 的公司,建議一定要保持用最新的 JDK,因為 G1 還在不斷修複優化(是不是聽起來不太靠譜,這也是 Google 還要維護 CMS 的原因之一吧)
Java 對 GPU 計算的支持,目前 Project Sumatra 在試圖解決這個問題,但是不太活躍,他們也請求大家能夠一起進來 contribute(多個 Session 的分享人都講到了希望大家一起來改善和貢獻,有非常強的社區味道,這點國內還比較弱)
有人問到了 JNI 2 的問題,Project Panama 正在嚐試更好地解決 Pure Java 和 Native Code 之間互通的問題
關於並發編程,社區不斷地提高線程模型的抽象程度,例如 ForkJoin、Actor 等,但對於協程依然沒有 official 的說法,JVM 的協程在開源界已經有部分支持了,但 runtime 還是比較少,不過回來以後看三紅講協程已經被 proposal 了(https://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html)
Java 作為一門不那麼年輕的語言,今天有什麼優勢,大家還是比較有共識:生態,你想要的一切,在這個生態裏幾乎都有,這一點是 Python、Go 很難追上的
JavaEE 8 開始在 GitHub 開源,社區做 contribute 效率更高了(https://github.com/javaee)
JVM 研發相關
Azul 是一家比較有特色的 JVM 公司,一般我們講 JVM 都是什麼 Oracle、IBM、Google、Alibaba 這些大廠在搞,但是 Azul 獨樹一幟做到了 latency 極低的 GC 時間。
Azul CTO 講了下他們在做 JVM 過程中的一些思路,有一個印象比較深刻的點,和阿裏雲銷售的思路是比較像的。Azul 重新審視『快』的問題,快到底是吞吐高、延遲低、還是別的,他們給客戶特別是交易係統推銷的時候,不會講我這個東西技術上多牛逼,GC 延遲相比 Oracle JVM 低多少,而是一套業務解決方案,告訴客戶用了我的你可以比別的券商快幾個毫秒完成交易,這也是客戶最看重的。
對於技術底層知識的用途,平時很多同學也會有疑問,好像了解底層的東西對於業務開發並沒有什麼幫助,Azul 的 CTO 是這麼看的:也許你不懂也能幹活,但是懂的人 keep it in mind,在關鍵時刻能讓你有思路解決別人解決不了的問題。我覺得講的已經很到位了。
還有一些細節,例如 volatile 在編譯器中的作用:不要 cache value。對於壓測預熱,我們壓測中有一些代碼是 if(EagleEye.getUserData("t")) 判斷是否壓測流量的,然後某些下遊就不壓了,這個被稱為 fake msg,他認為這類預熱對於 JIT 優化沒有效果,不過我看也沒這麼絕對,做係統很多時候是一種權衡和妥協。
Docker相關
分享人是 k8s team 的,台灣人。
介紹了一些 dockerfile 的 tips:
寫到一行縮減 layer size
指定 user 不要用 root
公共鏡像的安全性目前無法很好保證(即便是 official 的),最好是自己 build 出來
https://stacksmith.bitnami.com/ 這個網站很實用,有點像 SpringBoot 那個 start 的網站,選你要用的組件,自動生成 Dockerfile 下載下來 build
文件讀寫用 volume 掛載避免 layer 不斷增長最後磁盤爆掉,
容器內存限製和 jvm heap size 不聯動(JVM 默認會用宿主機的內存大小),包括 CPU 也是,一般用 Runtime.getRuntime() 拿到的數據在 Docker 中已經不準了,可以用-XX:+UseCGroupMemoryLimitForHeap 這個 8u141 開始的試驗性特性
從 Functional Programming 到 Reactive Programming
函數式編程以前 Java 程序員比較陌生,從 Java 8 引入 lambda 開始慢慢 popular 了。這次幾個 Session 都提到了 Reactive 即響應式編程,簡單來說就是麵向異步數據流的編程。
這個思想在目前我們的工作中實際已經在部分使用了,隻是還沒上升到理論級別,例如將線程池的並發計算改造為基於消息的分布式並發計算,Reactive 的範式我相信和分布式計算一樣會給研發協作方式帶來一些改變,過去是靠同步 RPC 解耦,時間維度還是耦合的,現在是靠異步數據間進一步在時間上也解耦。
我個人是比較喜歡這種方式的,但對於麵向終端用戶的 UI 請求而言,很多時候還是要退化到同步模型去做。
最重要的是,它背後依賴的一個真實而殘酷的現實是,在分布式係統下,一切都隻能為最終一致性而設計,如果你沒意識到這個問題,要麼是別人在給你兜底,要麼是還沒出故障。
分享另外一場 Session 的兩張圖,說得非常到位:
關於 Serverless
Serverless 也是本次大會很多講師在布道的東西,我的感覺是 Serverless 目前比較實用的場景和過去 nginx 中的 lua 腳本很類似,特別在 CDN 等 Edge 節點上,比如 CDN 回源、圖片縮放、水印等,但是對於業務邏輯開發的場景還是不太適用,需要理性對待。
講師總結的這個 drawbacks 我個人覺得還是比較中肯,在企業級開發中 Serverless 還有很長的路要走:
最後更新:2017-10-25 16:05:01