今天終於是鐵人賽的第 30 天了,在這最後一天就來分享開發 Ohara 的心得。在 Ohara 這個 Open Source 專案我主要有做過的部份有 connector 的開發、ohara-testing-util 模組從 Scala code 轉換成 Java code、ohara-agent 模組 Kubernetes 的開發和 Ohara QA 環境的管理,以下就來分享上面列出的每一項工作的心得:
關於 connector 的開發:
Ohara Connector 的開發其實是基於 Kafka Connector 的介面,只是 Ohara 有把 Kafka Connector 的介面加以包裝用起來很更加的簡單,我覺得寫 connector 最困難的地方在於 offset 的控管,如果沒有管好 offset 的話在執行 connector 中途發生 exception 的話,下次在執行 connector 資料有可能再重新撈一次就有可能造成資料重覆的問題,或是 offset 跳過沒有正確寫入到目的端的儲存系統這樣就會導致漏資料的問題。因此測試程式的撰寫就要使用 Mini Cluster 去建立 Zookeeper、Broker 和 Worker 的服務,然後啟動 connector 去測試資料的筆數是否正確,之後再針對不同的使用情境撰寫更多的測試,例如是啟動多個 connector 之後資料筆數是否還正確的情境,這樣才能模擬真實環境的執行。
ohara-testing-util 模組從 scala 轉換成 java code:
Java 的開發者比 Scala 的開發者還要多,因此需要將有些對外的 API 從 Scala code 轉換成 Java code,我主要是做 ohara-test-util 模組的部份。因為 scala 是使用 function 的方式在撰寫程式,有時侯 java 要用三行完成一件事 scala 只要一行就可以完成一件事,因此一定要確實的去了解程式邏輯才有辦法做轉換,還好 Java 8 有支援 lambda 的寫法,不然在做轉換會更加痛苦。另外還好之前有撰寫測試程式,所以在做轉換完可以先執行測試程式確認程式的轉換是沒問題。
ohara-agent 模組實作 Kubernetes 的部份:
在這個部份主要先去了解 Kubernetes 有提供哪些 API,然後再去了解 ohara-agent 的介面是否可以去實作 Kubernetes 的部份,在實作方面主要是使用 Akka Http 去呼叫 Kubernetes 的 API,之後再將資料轉換成 ohara-agent 模組所要的格式。另外 ohara-agent 介面的實作都要求使用非阻塞的方式去實作,因此需要了解 scala 的 Future 的寫法,這個也是我花很多時間才能去適應的程式寫法。
Ohara QA 的管理:
Ohara QA主要提供給開發者進行測試的部份,最值得一提的是整合測試環境的管理,整合測試環境主要是提供外部系統像是 Kubernetes、Oracle Database 給測試程式使用,常遇到的問題就是測試程式在 Kubernetes 的環境上建立 container 之後結果測試程式忘了將 container 刪除,這樣會導致在 Kubernetes 環境啟動的 container 非常多,而造成 server 愈來愈慢,之後的測試全部都會發生 timeout exception 的 failed。因此要解決這個問題,在執行完測試之後 container 一定要刪除,Ohara 提供以下幾個機制來除理刪除 container 的部份:
在測試程式裡面使用 ClusterNameHolder 的 class,在建立 container 的時侯把 container 的名稱加入到 ClusterNameHolder 的 Collection,等最後執行完測試之前走訪 Collection 的 container name 並且將 container 刪除,確保每個 container 都有被刪到。
如果 Container 沒有刪除乾淨 QA 會送通知到 PR 上,讓開發者知道有 container 沒有被刪到。這樣也就沒有辦法把程式碼合併到 master 裡
為了確保 container 不會殘留在整合測試環境上,在 QA 跑完的最後一個階段會去檢查整合測試環境是否還有 container,如果有就直接把跑完測試的 container 刪除掉
在開發 Ohara 學習到很多東西無論是程式撰寫的技巧、QA 環境的管理和 Release 的部份,要感謝的人太多了,我就直接把 ohara 的 github 首頁下方的 ohara team member 截圖如下:
如果對 ohara 有興趣,可以到以下的連結裡,順便按下一顆星:
https://github.com/oharastream/ohara