天天看點

月光寶盒-未來時間可測性解決方案

月光寶盒-未來時間可測性解決方案
阿裡QA導讀:火箭發射、奧運會開幕式、雙十一0點大促(或視訊、OTA等網站的關鍵營銷活動),面臨這些極其重要的時刻,負責人總是會想法設法保證穩定,最理想情況是可以真實模拟演練。衆所周知,發射和開幕式無法模拟或者成本很高,但在軟體領域這卻成為可能,阿裡巴巴技術品質的星斬、靖北、晟楓、成章同學為我們帶來“安全、便捷、0入侵的未來可測解決方案”。

1 未來時間可測性的基本原理

以商品優惠為例(如下圖)

  • 正常情況下,因為目前時間和活動時間不重疊,自然看不到該活動;
  • 穿越邏輯:設法修改目前時間(java中大部分場景展現在new Date())和活動時間重疊;可實作的手段有:修改系統時間、修改業務代碼邏輯(通過入參方式擷取等);
月光寶盒-未來時間可測性解決方案

邊界和限制(風險)

如果某功能鍊路是通過緩存查詢活動(且穿越使用者第一次通路),則存在以下兩種風險:

暫且稱類似鍊路為風險鍊路(文章後續也會用到該概念,請關注,文章尾部有一幅圖檔詳細介紹了風險鍊路的各種分支情況)

  1. 目前活動丢失,線上真實的營銷活動不生效;
  2. 如果上層代碼使用營銷活動的邏輯未進行嚴格時間校驗,則會變成提前享受活動
月光寶盒-未來時間可測性解決方案

2 現有解決方案和優缺點分析

2.1 隔離環境方案

通過鍊路路口路由到一個特定環境中,該環境隻有特定的白名單才能調用進來,不影響線上普通使用者。通過類似修改jvm時間并重新開機的方式,起到穿越的效果。

月光寶盒-未來時間可測性解決方案

好處:對業務系統無入侵;

缺點:

  1. 會對所有的new Date()進行時間修改,在風險路徑下會影響線上功能;
  2. 每次使用準備較長,且如果測試不同的時間點,需要重新開機多個應用,成本較大;
  3. 保證環境隔離性有較大的成本和風險,包括異步消息和任務等;且除了入口沒有在各應用上做白名單校驗;

2.2 零售通二方庫解決方案

以二方庫的形式提供給原本需要改伺服器時間的應用,隻需引入二方庫并用其中的futureUtils.getdate()替代new Date()方法即可,通過diamond控制白名單和指定時間(下圖紅色背景部分)

diamond注釋:管理持久配置的系統,應用不僅可以在啟動時從diamond擷取相關的配置,而且可以在運作中對配置資料的變化進行感覺并擷取變化後的配置資料

優點:隻需要操作鍊路中關鍵節點,無流量隔離風險和其他風險,易用性有所提升。

缺點:對業務代碼有少量的入侵。

月光寶盒-未來時間可測性解決方案

3 未來時間可測的3大要求

月光寶盒-未來時間可測性解決方案

4 月光寶盒解決方案

月光寶盒目前已解決上述3大難點中的8個問題點,原理如下,過程中會用到一個關鍵的工具:jvm_sandbox,它實作了一種在不重新開機、不侵入目标JVM應用的AOP解決方案,是阿裡已經開源的一個軟體。

具體原理:有以下兩個調用鍊路,其中鍊路2是風險鍊路,穿越後會影響線上功能。應用3中包含了兩個hsf方法即需要代碼注入(含new date() 的關鍵邏輯),其中鍊路中應用2是不需要做任何處理。

月光寶盒-未來時間可測性解決方案

整體思路如下圖:

1)通過位元組碼增強方式解決上表3.1問題,即把所有new Date()傳回值mock到穿越時間。但是會碰到2個安全問題(即上表中1.1和1.2)

  • 如何隻對某個賬号的進行mock(白名單過濾),即不能影響非穿越測試賬号;
  • 如何隻對鍊路1的new Date()進行mock,而鍊路2的不mock,即不能影響功能;

2)在前置鍊路中做特定辨別并向下透傳

  • 在鍊路中某一處可以通過固定的方式取到使用者id,如果跟預期的測試id相一緻,則标記染色後通過中間件向後續鍊路透傳。(不同公司不同架構,是以如何取到使用者id的方式也不同)
  • 對應用3的接口1進行标記染色,并向下透傳。

3)對步驟1中的new Date()增加邏輯判斷,隻有符合白名單的、且從期望鍊路過來的,才進行mock。

基于上述思路可手動對某條鍊路功能進行穿越測試,月光寶盒把上述内容進行了産品化,同時過程中通過産品的設計和選型也部分解決了便捷性問題(即上表中的2.2和2.3);整體産品結構和部分demo如下所示;結合上圖的原理及下圖 “月光寶盒”的産品功能和使用步驟可以友善了解。

月光寶盒-未來時間可測性解決方案

4.1 添加鍊路&設定節點資訊子產品

配置鍊路資訊

月光寶盒-未來時間可測性解決方案

鍊路中包含以下節點資訊:

月光寶盒-未來時間可測性解決方案

對應原理圖中,這兩個節點分别分别起到了擷取使用者id和标記鍊路的作用。

4.2 部署月光寶盒的 jvm_sandbox實作子產品

在配置好鍊路和節點資訊後,可直接點選鍊路清單上的“部署”即可滿足把月光寶盒注入代碼部署到到對應節點的應用。可在節點資訊的部署狀态中檢視各節點ip的部署情況。子產品功能特點:

  • 隻影響某個節點,而非整個應用;
  • 每個節點上面都包含了白名單的控制,更加安全可靠;
  • 同一鍊路同一時間點可支援不同賬号測試不同未來時間;同一賬号在不同鍊路,互不影響,互相隔離。

點選“激活測試”後可輸入使用者名和要測試的未來時間,随即可進行功能測試;

月光寶盒-未來時間可測性解決方案

4.3 鍊路梳理成本和緩存問題

從上述原理圖中看出,我們在整條鍊路中隻需要關注少數幾個應用做增強,大量的鍊路是無需關心的,那麼如何識别出需要注入的應用呢?尤其裡鍊路涉及到其他底層BU的時候,梳理和識别會産生一定的使用成本;

如果正好碰到了風險鍊路,是不是隻能做業務系統的改造排除風險,才能使用呢;如果不解決會大大減少月光寶盒的應用場景。

上述兩個問題月光寶盒項目組也已經通用化解決,目前正在融入産品建設中,預計11月底12月初可用,支援雙12的場景。

4.4 鍊路梳理成本和緩存問題

通過上述介紹,月光寶盒可以支援鍊路的提前建立,并提供了api完成鍊路中節點的部署和針對某賬号的激活,筆者便思考能否結合業務系統,提供營運自檢能力。整體解決方案如下,并在零售通的首頁和紅包雨場景下進行應用

步驟如下:

月光寶盒-未來時間可測性解決方案
  1. 技術配置具體業務場景對應的月光寶盒鍊路,建立自動化用例并把觸發連結與前面的鍊路id關聯,最後在業務設定系統上提供“預覽驗證”和“确認正常”的按鈕,與月光寶盒的鍊路id關聯。
  2. 營運配置完成後,可通過預覽驗證看到在未來時間活動生效下的價格、效果等資訊。

PS:原來大促中發現營運配置錯誤時,聽到的最常見的一個說法是這個系統太複雜了,要設定系統1獲得id1然後再設定系統2獲得id2再¥%……&。現在沒有理由了

下圖是零售通紅包雨設定場景,因為配置複雜度較高易出錯,是以優先試點。關聯了零售通無線自動化平台天雀的效果。(部分場景可直接通過自動化斷言)

月光寶盒-未來時間可測性解決方案

4.5 産品最新進展

  1. 目前基礎産品建設已經完成,支援了零售通雙11中導購、互動、營銷等多個場景及B系其他bu的部分場景,産品支援同一鍊路同一時間點下不同賬号測試不同未來時間;同一賬号在不同鍊路,互不影響,互相隔離.針對不可穿越的鍊路(如緩存風險),探索驗證并提供了高效的改造解決方案。
  2. 未來一方面會賦能更多場景支援技術人員的穿越驗證;另一方面 會跟業務系統打通與自動化相關系統打通,讓營運進行關鍵配置時,就能實時檢視并自動驗證未來的效果。

5 結束語

  1. 本文由零售通技術團隊多位作者共同完成,感謝技術風險部、淘寶和企業金融相關同學在過程中多次有建設性的讨論和jvm_sandbox團隊同學相關同學支援。
  2. 歡迎有興趣的小夥伴加入零售通技術團隊,誠招服務端、用戶端、資料算法及工程效能測試工程師和java開發工程師,微信:bondyu001 郵箱:[email protected]
月光寶盒-未來時間可測性解決方案
月光寶盒-未來時間可測性解決方案

關注「阿裡巴巴技術品質」閱讀更多