如何利用MongoDB打造TOP榜小程序

歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~javascript

本文由騰訊雲數據庫 TencentDB發表於雲+社區專欄java

今天我分享的主題內容大概是兩部分,最主要的仍是小遊戲和小程序,第一部分就是跟你們分享下咱們在現網運營中服務小遊戲以及爆款小遊戲積累的經驗。在現網運維中咱們作了一些改動,幫助爆款小遊戲可以穩定運行。第二部分咱們推出了一套新的解決方案,適合小白開發者,適合初創公司,能夠在微信開發小程序的同時,可以使用騰訊雲的資源,享受騰訊雲的各類服務。數據庫

img

先講第一部分的內容,剛纔鄒鵬最後講的一段的時候,一直有一個圖片,那個圖片就是各類數據庫的排名,可能你們沒有注意到,MongoDB的排名其實已是第五名,再說一下MongoDB爲何適合遊戲開發場景。咱們知道遊戲開發中一個最主要的特色是需求變化很是快的,由於在遊戲不一樣的階段會加入一些新的元素黏住用戶,例如道具,在遊戲上線的不一樣階段加不一樣道具,這種用傳統的關係型數據庫難免對錶進行結構修改的DDL的操做,可能有些開發者說不須要,以前作的就是把全部的字段打包成一個字段塞進一個庫表就能夠了。使用MongoDB不須要改變表結構,對開發者是很是Nice的。另外,大多數遊戲會添加社交元素加強用戶的活躍度,黏住用戶。咱們提供了地理位置索引以及配套的API,不須要在業務層作操做,數據庫層已經原生支持了。海量數據的支持,咱們提供了分片的功能,其實數據最開始,在業務上線最開始階段,並不知道到底未來是什麼樣的量級。使用關係型數據庫的話,後期避免不了進行分庫分表,擴容,MongoDB這邊提供了分片集羣,能夠在不影響業務的同時進行水平的擴容,這個對運維來講是很是好的解決方案。小程序

運營分析,如今是大數據時代,每一個業務都會根據數據分析的結果支持運營策略,咱們是原生支持MapReduce的,開發者能夠直接使用。還有一點很是重要,假如你是小程序開發的話,用JS語言寫,存在javascript技術棧MEAN和MERN,MongoDB和Nodejs二者是伴隨成長起來的。總之,MongoDB特別適合遊戲開發場景。後端

我想問一下如今在座的有沒有用咱們騰訊雲MongoDB的?或者是有沒有用MongoDB的?自建也能夠。大家用MongoDB存什麼數據?(目前蒐集用戶行爲日誌)是自建的嗎?(對,原本想用雲上,後來發現自建會便宜一點)一主兩從仍是一主一從?(作副本集,三個部分,沒有固定說哪一個是主)實例多大?(如今幾十G的數據量)大家買的CVM是多大?(500G空間,咱們前期使用起來,如今一個方向還不太明確,就是一個試探,我在以前用的都是阿里的比較多,騰訊是今年纔開始接觸)我大概瞭解了,因此說我以爲今天能站在這分享,跟這麼多用戶見面,對我我的來講是很是高興的一件事,至少我知道你們如今怎麼使用以及有沒有用,不用我一一拜訪了。緩存

小遊戲的調用棧,不少開發者都很是清楚,我只須要簡單的帶過,通常會在前面加負載均衡,而後經過虛擬機搭建服務器,後面連數據庫。安全

我剛纔跟你們提了咱們其實在現網服務過不少爆款小遊戲了,最主要的一個目的就是可以讓客戶的遊戲穩定運行,咱們在服務他們的過程當中,累積了一些運維經驗,作了一些鏈接參數的調優,幫客戶實現實例價值的最大化。服務器

首先跟你們簡單分享一下MongoDB的鏈接模型,分兩部分,第一部分是Mongos對客戶端的鏈接,第二是Mongos對後端的鏈接,第一部分鏈接採用的是很是古老的方式,叫one-Thread-per-connection,每一個鏈接分配一個線程,每一個線程棧1MB內存,1000個鏈接是1G內存,因此,MongoDB對鏈接是很是敏感的。對後端鏈接的模型就是每一個Mongos會綁定一個Worker池,假如你有三分片,每一個分片是一主兩從,那就是9個Mongod,每一個worker就會有9個鏈接。微信

這裏有一個參數,若是這個參數設計的不合理,業務體量比較高的狀況下,後面鏈接池子的線程是不夠用的,就會進行頻繁的線程調度和切換,由於線程的切換和調度的開銷是比較大的,因此運維人員比較關心的就是minConnection這個參數,這個參數咱們是單獨提出來可以給運維人員直接修改的,這個參數的設置有一個公式,這個公式就是你須要根據,好比當前TPS爲1000,每一個鏈接要求處理10毫秒,2個分片,minConnection=1000/2/(1000/10)。則第二個參數也是運維人員比較關心的,第二就是refreshRequirement,就是每一個業務會有一個估算的鏈接峯值,那麼refreshRequirement設置要超過5分鐘才行。以上是咱們對MongoDB鏈接模型的優化。網絡

第二個咱們服務現網不少小遊戲時遇到的慢查詢問題。不少用戶比較瞭解MongoDB的話,由於是一主兩從,就會爲了減小主的壓力,就設置把讀請求打到從,從能夠同步數據,也能夠接收讀請求,主就作接收寫請求,這是理想的方案,可是咱們服務用戶過程當中發現這個方案也會帶來問題,由於從3.2版本,引擎就默認是WT。WT引擎有一個操做就是從在同步數據的時候會加一個全局鎖,這個鎖會把全部的讀請求都鎖住,這樣的話慢查詢就可能會變多,基於這個問題,咱們這邊是搞了一個專利,這個專利就是基於快照的讀的一種方案,就是當你進行從讀的時候,此時讓你讀快照,同步數據完成以後,全部讀請求正常,快照被清掉。最左邊的圖是另一個解決方案,這種解決方案就是咱們提供了一種只讀實例,在主實例上掛只讀實例,主實例負責接收讀寫請求,其餘業務模塊只須要把全部的鏈接請求打到只讀就能夠了。這兩種解決方案在通常狀況下的優點不是很是明顯,可是當你的實例Primary寫入壓力很是大的狀況下,效果是很是明顯的。最後面有一張圖,藍色部分是源生的Mongo,紅色的部分是咱們基於讀快照的方式的一個性能,X軸是寫入大小,Y軸就是從庫讀請求的延時,咱們發如今源生的Mongo中最大的讀延時能達到85毫秒左右。用咱們的解決方案的話,在10毫秒左右,很是快。以上是咱們第二個優化。

img

業務最開始上線的時候其實並不知道後期量級能達到多少,假設開發人員在最開始的時候申請比較大的實例的話,其實會被運維挑戰的。可是假如用分片集羣的話,就會避免這個問題。最開始的時候設置很小的,買一個很小的分片,後面你的業務量大起來以後,再水平擴分片。只須要指定分片的Key,就會把數據分到不一樣的片裏面去,自動作均衡,業務無感知。

img

庫表回檔,在遊戲運維過程當中比較痛苦的一件事就須要回檔。確實很痛苦,有時候我感受有些用戶回檔過程當中很是着急,一旦回檔應該是發生了比較嚴重的事,要回檔到以前的時間段。由於程序是避免不了有Bug的,或者遊戲在上線過程當中有一個Leader手抖,發了不少道具,可能形成不少人民幣的損失,這個時候就要進行回檔。可是僅僅是某個庫表進行回檔,不須要整實例回檔,針對這種狀況,咱們支持庫表回檔,對運維人員是很是nice的功能。

img

個人第二部份內容就是針對小遊戲和小程序的一種解決方案。小程序開發和小遊戲開發特別是小遊戲會遇到一個問題,使用本地緩存30-40M徹底不夠,如何把小程序賦能到雲,咱們提供了方案,不須要到騰訊買CVM、數據庫、函數,只須要在小程序開發IDE上點擊控制檯上的按鈕,開發者只須要關注業務邏輯的實現,後端的服務器的運維知識都不須要再去了解。小遊戲和小程序的特色就是短平快,快速上線,迭代快法,強佔市場,經過一些道具和廣告迅速變現,生命週期不長。

img

咱們這個解決方案在服務層有數據庫的管理、文件的管理、函數的管理,後面還會加一些日誌、觸發器的服務,底層服務有騰訊雲MongoDB、雲函數這一套。也就是說剛纔咱們在服務現網其餘遊戲中的運維經驗的累計都會應用到這個解決方案裏面,因此說你們能夠放心使用。

開發過程當中會有多個環境,開發環境、測試環境、生產環境,在雲上開通這套服務以後咱們默認會包含多個環境,環境之間是相互隔離的。

這種方案特別適合我的開發者、初創團隊,對於成熟團隊須要上一些項目的話,能夠當即使用。如下是咱們的控臺,有三個功能,能夠建立集合,咱們增長了導入和導出功能,能夠把其餘地方的數據導到這裏面讓你的小程序直接運行。第二就是索引,咱們把索引功能優先開出來了,默認給_id字段加了索引,用戶也能夠本身增長單列索引和複合索引。另外,權限管理這裏也很是精細。

我今天的分享差很少是這樣。更多數據庫前沿技術可關注 咱們公衆號:騰訊雲數據庫CDB

img

Q&A:

Q:老師,您好,您剛剛講的關於監控數據,我想問的是關於小程序會讓用戶看到日誌以及監控數據嗎?大家有提供報警機制嗎?

A:我以爲你應該是深刻思考這件事了,確實是,監控和日誌很重要,日誌很快會包到解決方案裏面,用的是ES。如今監控指標跟MongoDB公有云的數據是同樣的。告警咱們作了策略,會對關鍵指標的告警系統進行預值自動設定,自動告警,用戶自定義告警在短時間內尚未提供。

Q: 您好,老師,今天下午辛苦了。我曾經不太瞭解MongoDB,我據說MongoDB有一個安全的事件,應該在一年之內,但具體時間不清楚,我想了解一下,好比說雲上Mongo的安全的這塊,大家是怎麼作的?

A:安全有兩點,第一點是網絡,咱們會有在前面加了安全組,這樣對訪問來源IP進行了第一層過濾,安全組,用戶能夠本身設置。第二咱們加了VPC網絡,在本身虛擬機同一個網絡類的CVM才能訪問咱們的Mongo,這樣就作了網絡隔離。第二方面咱們有數據加密,咱們如今作的是存儲型加密,這個加密功能是用戶在購買的時候能夠選擇的,因此說用咱們騰訊雲MongoDB的安全是徹底能夠放心的,可是你自建的話可能就沒有這麼。

Q:您剛說的VBC,若是自建的話,我們的網絡就是獨立的。

A:自建的話,VBC能夠作到,可是數據層的加密是作不到的。

相關閱讀 【每日課程推薦】機器學習實戰!快速入門在線廣告業務及CTR相應知識

此文已由做者受權騰訊雲+社區發佈,更多原文請點擊

搜索關注公衆號「雲加社區」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!

海量技術實踐經驗,盡在雲加社區

相關文章
相關標籤/搜索