騰訊線上教育的小程式雲開發實踐

Tencent_TCB發表於2020-06-08

作者簡介

陳天忱,IMWEB團隊成員,騰訊前端開發工程師, 主要負責騰訊課堂小程式,騰訊課堂直播間等業務模組。

首先介紹下騰訊線上教育下的3個主要業務

  • 針對成人職業化,興趣化學習的騰訊課堂;
  • 針對小學,初高中k12領域的企鵝輔導;
  • 針對少兒英語學習的ABCMouse。

這3塊業務都在Web端、小程式端和客戶端都有落地產品,以滿足不同端的使用者需求。

隨著業務的高速發展,在小程式端,我們部門對應的小程式有十幾個,而且還可能推出更多工具類、平臺類的小程式。眾多的小程式業務,意味著頻繁的業務需求,為了保障業務的穩定及效率,我們團隊在小程式的同構、CI、雲開發等領域都進行了積極的嘗試,並取得了不錯的成果。

面對頻繁的業務需求,我們作為一個前端團隊,一直在思考否能有更多的發揮空間,而云開發的出現,恰恰助力我們擴充前端的邊界。

下面以騰訊課堂小程式為例,為大家介紹我們在小程式雲開發上的實踐。

如何實現多個小程式,多端共用同一個雲開發環境

2018年,微信小程式和雲開發ClouBase兩個團隊深入合作推出小程式雲開發,為每一個小程式都提供了一個非常簡潔方便的小程式雲開發的入口,弱化後端和運維概念,無需搭建伺服器。

但是我們在開始使用雲開發的時候遇到了一個問題:我們多個小程式需要使用同一個雲開發環境,這樣一些通用的平臺能力可以複用。但是在小程式雲開發中,每個小程式使用內建的sdk只能呼叫小程式賬號自身關聯的雲開發環境,這樣的話,雲函式的程式碼就要維護多套。顯然這並不是我們想要的,內建的sdk並不能滿足我們的需求。況且我們的H5和PC端要用雲開發的話,又得另外維護一個環境。

我們有想過通過Node走http呼叫,但是通過閘道器-node-具體服務,自行搭建又會面臨容災、運維、擴容,這又失去了雲開發的意義。

當然,我們的H5和PC也可以使用小程式賬號的雲開發環境,但依然不能解決不同小程式之間公用雲開發環境的問題。

所以在最初,我們嘗試用serverless來解決這個問題,即把接入層換成API閘道器,就可以滿足需求。但是,當我們接入API閘道器來使用雲開發的能力時,走閘道器呼叫,這時鑑權這一塊就得走業務自身鑑權了,無法使用小程式雲開發天然免鑑權的便利。

所以我們和雲開發團隊深度合作,推出了用於小程式端的Web SDK,這樣多端呼叫得以實現。事實上,tcb-js-sdk-mp和內建sdk一樣,提供了免鑑權等多種鑑權方式,我們可以像使用內建sdk那樣拿到使用者的openid,節約開發成本。

如果你們的業務也有同樣的問題,可以參考下。 這裡是我們使用tcb-js-sdk-mp的一部分程式碼演示

初始化略有不同,初始化這裡要跟tcb-js-sdk一樣,呼叫對應的api去校驗登入態。然後函式呼叫這裡因為不是直接訪問內建的環境,還是需要做一個域名限制,防止被刷。封裝了雲函式呼叫方法,進行了初始化,後續的操作就跟使用內建的sdk沒什麼區別了。

通過雲開發CLI工具構建函式自動化部署管理(CI)流程

涉及到一個新的環境,就要面對部署的問題。 常用的雲函式部署方式是通過開發者工具,但是通過工具右鍵部署會有一些問題,比如手動選擇環境,容易出錯,嚴重的可能造成現網事故;依賴環境,內網包無法線上安裝,本地上傳可能有些包有平臺特性 ( docker掛在安裝特定環境依賴)。

不過這些都可以通過一個現有的工具得到解決。雲開發提供了CLI工具用於雲函式的操作,包括登入、初始化、部署函式、觸發函式等,有了這個工具,我們的雲函式完全可以另起專案單獨開發了,和小程式專案進行分開管理。並且cli提供了靈活的配置,超時時間,環境變數,私有網路,是否安裝依賴等功能。

我們依賴cloudbase-cli配置了一套雲函式部署的CI流程,通過不同的方式來觸發CI,就可以將函式部署到不同的環境中來,減少人工手動部署可能帶來問題的風險。並且這裡可以看到,像我們的業務會希望有一個預釋出環境,不使用小程式內建的雲開發環境,就可以突破兩個環境的限制。

運用雲開發資料庫的事務能力實現以老帶新活動

下面,我就分享一個我們業務中,對於雲資料庫實際的場景應用。

我們有一個大促的活動,需要學員邀請使用者參加,就可以領取一些精品課程,來促使互動的傳播,需要用到小程式一個動態訊息的能力。每個使用者能夠邀請的使用者有限制,如果活動過期了,將會展示一個已結束的狀態。點開可以給活動發起者助力,不能重複,滿員時不能繼續助力。因為這個頁面功能不涉及特別複雜的資料操作,比較簡單。我們覺得這個功能就非常適合前端用雲開發來實現,可以節省一些後端的人力。

先從建表開始。很簡單,一個表,當邀請到使用者參加活動時,往goups裡面新增一個使用者,並更新動態訊息,當使用者數達到上限時則不再新增。但是這種活動往往會伴隨著併發的操作,如何保證併發時資料的準確性,就需要我們對操作的資料上鎖,避免同時操作導致被覆蓋。

所以需要用到雲資料庫的事務能力。 我們另外又維護了一個表,用於記錄被邀請的名額資訊,在事務中對名額進行操作,事務完成則去更新狀態,否做就可能進行事務的回滾。

下面具體看下整個操作的過程 一、在活動頁面,使用者點選開啟活動生成一個活動id。這個生成活動id的方法是小程式端和雲開發這邊都支援的一個生成動態訊息id的方法,可以直接用這個作為一個活動的id了

二、同步建立對應上限人數的人員位,所有的狀態都是空的。這樣一個活動就建立好了

三、如果有人點選進入活動頁面,先通過活動id獲取到對應的活動資料;然後根據雲開發天然無鑑權的特性直接在雲函式裡面拿到使用者的資訊,再根據使用者的資訊及活動資料來判斷是否有助力的許可權。

比如這是你發起的活動,那麼就只會展示已邀請到的人數,如果過期了就展示過期,還有你已經助力過了,或者名額已經滿了等等,這個就是具體的業務邏輯了,不細講,我們就給一個disable的頁面。如果有就給一個正常的頁面。

使用者點選助力,則通過事務從對應的活動位取出一個空的活動位,並對活動位進行更新,這時候這個活動位就被上了事務鎖。這時,如果有另一個使用者同時併發的去修改這個活動位,則會直接失敗,那麼就可以嘗試去佔用下一個空位。

依次嘗試佔用所有的空位都失敗了,就反饋該活動團已滿。

正常的情況下,就可以直接進行更新操作,並將user欄位改為此使用者的資訊,標記為已佔用狀態。 事務跑過後再將使用者的資訊 push到活動資料的groups欄位內,並判斷是否已滿員。 完成更新後就可以結束事務,然後完成後續的動態訊息更新的操作。

在這個過程中如果出現了錯誤,我們都可以對事務進行回滾,來保證資料的準確性。

小程式雲開發的出現,讓我們前端團隊有了更廣闊的發揮空間,也讓我們得以更迅速地響應運營推廣需求。關於小程式雲開發的運用技巧,有許多地方值得我們去挖掘,歡迎大家一起來交流學習。

雲開發CloudBase,一站式後端雲服務,簡單好用快上手

技術文件:cloudbase.net

技術交流加Q群:601134960

最新資訊關注【騰訊云云開發公眾號】

相關文章