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

来源:https://www.cnblogs.com/qcloud1001/archive/2018/11/09/9934066.html
-Advertisement-
Play Games

歡迎大家前往 "騰訊雲+社區" ,獲取更多騰訊海量技術實踐乾貨哦~ 本文由 "騰訊雲資料庫 TencentDB" 發表於 "雲+社區專欄" 今天我分享的主題內容大概是兩部分,最主要的還是小游戲和小程式,第一部分就是跟大家分享下我們在現網運營中服務小游戲以及爆款小游戲積累的經驗。在現網運維中我們做了一 ...


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

本文由騰訊雲資料庫 TencentDB發表於雲+社區專欄

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

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 送你一份技術課程大禮包!

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 驗證結果: 寫作時間:2017-11-8 本文只代表本人的見解,可能存在錯誤,僅用於技術交流。如果你喜歡該文,可以掃下麵的二維碼打賞我(打賞敬請備註“博客園打賞”五字)。 ...
  • 轉自 https://www.cnblogs.com/guanjie20/archive/2013/02/17/2914488.html 我們在寫事務時經常遇到的問題如下: 消息 266,級別 16,狀態 2,過程 sp1,第 0 行 EXECUTE 後的事務計數指示 BEGIN 和 COMMIT  ...
  • 為什麼plsql的database下拉為空?我在tnsnames.ora中設置了字元串ORCL,疑惑了我好久,在網上找了許久解決方案,終於是解決了!如下對我的解決過程做一個記錄。 ...
  • 機房意外斷電斷網不得不預防,下麵模擬測試某機房斷電斷網,B機房斷電斷網後A機房可正常提供服務,A機房斷電斷網後可能需要強制重啟繼續提供服務了,目前查看數據都還在,暫時沒驗證是否有數據丟失,小試了一把。。。大概架構A機房192.168.70.214:27017 (為primary,其他節點都是SECO ...
  • 每個人都在說大數據,但是大數據到底是什麼?很多人都沒有搞清楚。所以大數據學習要學什麼知識自然就不是非常清楚了。 什麼是大數據?其實從字面意義上講,我們就可以進行簡單的瞭解,大數據就是大的數據,也可以稱之為海量數據或巨量數據。大數據相對的就是小數據或者普通數據,大數據與小數據或平臺數據的區別在哪裡呢? ...
  • 鎖概述 MySQL的鎖機制,就是資料庫為了保證數據的一致性而設計的面對併發場景的一種規則。 最顯著的特點是不同的存儲引擎支持不同的鎖機制,InnoDB支持行鎖和表鎖,MyISAM支持表鎖。 表鎖就是把整張表鎖起來,特點是加鎖快,開銷小,不會出現死鎖,鎖粒度大,發生鎖衝突的概率高,併發相對較低。 行鎖 ...
  • mysql資料庫連接異常問題(總結) 1.1 前言 最近項目由1個數據源增加至了3個數據源(連接池使用C3P0),結果各種奇葩的資料庫連接問題接踵而至,為防止將來再次遇到同樣的問題不犯同樣錯誤,現總結如下。 1.2 An attempt by a client to checkout a Conne ...
  • 什麼是事務 事務是現代資料庫的核心概念之一,它表示資料庫一系列操作的集合。這些操作必須在一個事務當中,要麼全部執行成功,要麼全部不執行。 ACID原則 原子性(Atomicity) 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...