正常咱們在作項目時,一般都會有多個環境,本地開發環境,平常測試環境,預發環境,正式環境等等。算法
通常各個環境之間除了代碼一致以外,其餘的或多或少都會有必定的差別,例如配置信息,數據庫信息等,其中最大的差別就是項目實際運行過程當中產生的各類數據。sql
那咱們怎樣才能打造一個和線上環境儘量相同的測試環境呢,我相信應該沒人會願意直接到線上環境去驗證本身修改的 bug,或者新增的功能吧。數據庫
即使是實在沒辦法只能到線上環境去驗證時,也是會分批切流,例如先切10%的流量到新發布的環境中,驗證修改或新增的功能有沒有問題,若是有問題就能夠直接將流量切回去,對發佈的代碼進行回滾,沒有問題的話再慢慢的發佈其餘的機器。網絡
可是若是咱們可以拿線上環境的數據在平常環境中預先驗證一遍,那豈不是更好?說到底就是讓正式環境中的數據可以在測試環境中走一遍,可以發現一些問題,好比一些算法的閾值調優等等。框架
下面我將經過一個實際的例子介紹一種將線上環境的數據切到平常環境的方法,只是介紹一種思路,你們也可能有更好的方法,只要適合本身就是最好的方法。測試
可是並非全部的項目都可以將線上環境的真實數據拿下來的,好比一些涉密數據,一些金融類數據,或者是一些敏感的數據,這裏只針對那些能夠直接拿真實數據到測試環境作 「仿真」 測試的項目。ui
咱們作的一個項目是對各類設備採集到的數據進行處理,其中涉及到多種算法以及策略模型,咱們須要在系統運行的過程當中修改一些閾值,在算法升級時須要對算法進行驗證,這時咱們就須要從新跑一遍歷史數據,查看實際的結果,若是咱們能將線上的一些歷史數據拿到平常環境,那將會事半功倍。阿里雲
咱們的設備是將數據直接上報到 metaq 中,系統對 metaq 進行監聽,可是線上和平常環境的網絡是隔離的。spa
咱們的設備是在設備網,他是能夠選擇將數據發送到線上環境仍是平常環境的,我最初的想法是可否經過修改設備的配置來將數據切到平常環境去,可是很快就否定了該方法,緣由有兩點:3d
一,設備配置修改繁瑣而且須要一臺一臺的修改
二,數據切到平常環境後,線上環境的數據就停了
設備其實是先將數據發到 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 任務來進行數據轉移了。
首先咱們要在線上環境建立一個 blink 任務,將咱們的目標 metaq 中的數據查詢出來寫入到 sls 中,代碼很簡單,大體以下所示:
-- 目標數據源:metaq
create table target_metaq (obj VARCHAR) with (
type = 'metaq',
topic = 'xxx',
pullIntervalMs = '100',
consumerGroup = 'xxx',
tag = 'xxx',
fieldDelimiter = ',',
columnErrorDebug = 'true'
);
-- 中間人:sls
create table tmp_data_hub (obj VARCHAR) WITH (
type = 'sls',
endPoint = 'xxx',
accessId = 'xxx',
accessKey = 'xxx',
project = 'xxx',
logStore = 'xxx'
);
insert
into tmp_data_hub
select
obj
from
target_metaq;
複製代碼
檢查無誤後,就能夠將任務上線了,以後啓動任務,過一段時間到 sls 中查看是否有數據進來,若是有那說明咱們建立的 blink 任務是正確的。
接下來就是將 sls 中的臨時數據寫入平常的 metaq 了,這一步跟上面同樣,只是須要到平常環境中建立 blink 任務,代碼也類似,不一樣的是這裏是要從 sls 中查數據,而後插入到平常的 metaq 中,這裏再也不贅述了。
經過中間人轉發的方式是最簡單的,現有的業務不受任何影響,不要寫一行代碼,惟一的缺陷是須要建立一個 sls 的 project,而且須要建立兩個 blink 任務,這都是須要資源的。
本文介紹了爲何要在測試環境使用線上數據進行功能的驗證,而後介紹了幾種得到線上真實數據的方法,最後選擇了一種最簡單,改造最小的方法。
歡迎關注「逅弈逐碼」