作者:逅弈
來源公眾號:逅弈逐碼
正常我們在做項目時,通常都會有多個環境,本地開發環境,日常測試環境,預發環境,正式環境等等。
一般各個環境之間除了代碼一致之外,其他的或多或少都會有一定的差異,例如配置信息,資料庫信息等,其中最大的差異就是項目實際運行過程中產生的各種數據。
那我們怎樣才能打造一個和線上環境儘可能相同的測試環境呢,我相信應該沒人會願意直接到線上環境去驗證自己修改的 bug,或者新增的功能吧。
即便是實在沒辦法只能到線上環境去驗證時,也是會分批切流,例如先切10%的流量到新發布的環境中,驗證修改或新增的功能有沒有問題,如果有問題就可以直接將流量切回去,對發布的代碼進行回滾,沒有問題的話再慢慢的發布其他的機器。
但是如果我們能夠拿線上環境的數據在日常環境中預先驗證一遍,那豈不是更好?說到底就是讓正式環境中的數據能夠在測試環境中走一遍,能夠發現一些問題,比如一些算法的閾值調優等等。
怎樣獲得線上環境的真實數據
下面我將通過一個實際的例子介紹一種將線上環境的數據切到日常環境的方法,只是介紹一種思路,大家也可能有更好的方法,只要適合自己就是最好的方法。
但是並不是所有的項目都能夠將線上環境的真實數據拿下來的,比如一些涉密數據,一些金融類數據,或者是一些敏感的數據,這裡只針對那些可以直接拿真實數據到測試環境做 「仿真」 測試的項目。
我們做的一個項目是對各種設備採集到的數據進行處理,其中涉及到多種算法以及策略模型,我們需要在系統運行的過程中修改一些閾值,在算法升級時需要對算法進行驗證,這時我們就需要重新跑一遍歷史數據,查看實際的結果,如果我們能將線上的一些歷史數據拿到日常環境,那將會事半功倍。
我們的設備是將數據直接上報到 metaq 中,系統對 metaq 進行監聽,但是線上和日常環境的網絡是隔離的。
從數據源直接切數據
我們的設備是在設備網,他是可以選擇將數據發送到線上環境還是日常環境的,我最初的想法是能否通過修改設備的配置來將數據切到日常環境去,但是很快就否認了該方法,原因有兩點:
一,設備配置修改繁瑣並且需要一台一台的修改
二,數據切到日常環境後,線上環境的數據就停了
通過網關轉發數據
設備實際上是先將數據發到 connector,然後由 connector 將數據寫入 metaq 的,connector 就相當於一個網關,那能否通過 connector 將寫入線上 metaq 的數據也寫一份到日常環境的 metaq 呢?
如果能從這一層來做轉發的話是最簡單的,但是 connector 是所有設備的接入層,承載了所有設備的數據通訊,他是一個通用的模塊,不會為我們加入這種定製需求的。並且代碼不在我們這邊,即便在我們這邊,對 connector 進行改造的成本也是不小的,代價和收益不對等。
通過中間人轉發
其實我們最原始的需求就是將線上 metaq 中的消息,原封不動的轉發一份到日常環境的 metaq 中。
相信使用過 blink (阿里內部基於 flink 開發的框架) 的人,看到這樣的需求會很不屑,因為這對於 blink 來說,這就是一條語句的事:insert into A select * from B
但麻煩的是線上 metaq 和日常的 metaq 是隔離的,網絡是不通的,線上的 blink 可以訪問到線上的 metaq 但是訪問不到日常的 metaq,反之亦然。
那我們就需要有一個線上和日常環境都能夠訪問得到的地方,並且能夠將數據存儲起來,後面通過這個中間人進行數據的轉發。
使用過阿里雲 sls 的人都知道,sls 是一套可以運行在多種網絡環境中的日誌分析服務,這裡我們選擇在公網上創建一個 project,例如叫:tmp-data-hub,這樣的話,線上和日常環境都可以訪問到該 project。
那麼有了這個中間人,我們就可以直接創建 blink 任務來進行數據轉移了。
將線上 metaq 數據寫入 sls
首先我們要在線上環境創建一個 blink 任務,將我們的目標 metaq 中的數據查詢出來寫入到 sls 中,代碼很簡單,大致如下所示:
檢查無誤後,就可以將任務上線了,之後啟動任務,過一段時間到 sls 中查看是否有數據進來,如果有那說明我們創建的 blink 任務是正確的。
將 sls 數據寫入日常 metaq
接下來就是將 sls 中的臨時數據寫入日常的 metaq 了,這一步跟上面一樣,只是需要到日常環境中創建 blink 任務,代碼也相似,不同的是這裡是要從 sls 中查數據,然後插入到日常的 metaq 中,這裡不再贅述了。
通過中間人轉發的方式是最簡單的,現有的業務不受任何影響,不要寫一行代碼,唯一的缺陷是需要創建一個 sls 的 project,並且需要創建兩個 blink 任務,這都是需要資源的。
總結
本文介紹了為什麼要在測試環境使用線上數據進行功能的驗證,然後介紹了幾種獲得線上真實數據的方法,最後選擇了一種最簡單,改造最小的方法。