後臺伺服器框架中的瑞士軍刀——MCP

来源:https://www.cnblogs.com/htkfsy/archive/2019/11/20/11853467.html
-Advertisement-
Play Games

上篇介紹了一個簡單的UDP服務框架,但是面對海量的請求,同步框架顯然有點力不從心。於是在我接手好友系統的介面服務的時候,就採用了一個強大的非同步框架——MCP框架。 MCP框架是一個多進程非同步框架,支持UDP、TCP和http,結構很靈活,可以根據需要將各組件像搭積木一樣組裝。下麵是MCP最基礎的進程 ...


上篇介紹了一個簡單的UDP服務框架,但是面對海量的請求,同步框架顯然有點力不從心。於是在我接手好友系統的介面服務的時候,就採用了一個強大的非同步框架——MCP框架。

MCP框架是一個多進程非同步框架,支持UDP、TCP和http,結構很靈活,可以根據需要將各組件像搭積木一樣組裝。下麵是MCP最基礎的進程結構。分為3種進程:CCD、MCD和DCC。

CCD是面向客戶端的進程,是服務的入口,負責處理前端的請求,維護連接,收發數據,並向MCD轉發。其內部使用線程池實現對TCP請求的listen和accept。伺服器內部進程之間使用flow(實際上是一個數字)來表示連接,因此CCD負責維護前端請求句柄和flow之間的映射關係。CCD一般根據埠和協議設置多個。

DCC是面向後端的進程,負責向其他服務發出請求。使用跟CCD類似實現方法,只是面向的是伺服器。在經過協程改造的MCP框架中,DCC被去掉了,因為MCD通過協程就可以實現與後端的交互了。DCC跟後端的連接一般採用長連接,避免頻繁創建和釋放連接導致大量TIME_WAIT的情況。

MCD是伺服器的核心進程,負責處理業務邏輯,通過epoll和回調函數實現非同步。

進程之間通過MQ進行通信,MQ採用共用記憶體隊列傳輸數據,而通過管道傳輸讀寫信號。如下圖所示,進程首先把數據寫入隊列,當隊列中的數據達到一定長度(避免每個請求都讀取數據)時,MQ會通過管道傳輸一個字元。MQ的使用者只要通過epoll監聽管道句柄,就可以及時地獲得讀寫信號。

瞭解了MCP的基本原理,就可以根據業務的需要進程個性化的定製。例如因為MCD單進程可能有性能瓶頸,我們對其進行了擴展,改造成多MCD進程版本。如圖所示,MCD後端派生出多個SUBMCD進程,SUBMCD進程負責處理真正的業務邏輯;而MCD進程退化成一個業務分發的程式,同時負責一些公共的業務邏輯,例如負責管理全局哈希表數據的超時清理(定期掃描超時節點,表太大的情況可以分次掃描,只要保持好掃描位置信息即可)。

SUBMCD直接跟CCD和DCC通信(圖中省略了SUBMCD和CCD之間的MQ),通過配置文件設置,在服務初始化的時候就在各個需要通信的進程間創建好共用記憶體MQ。這樣可以避免MCD成為通信瓶頸。

另外還派生出一個MONITOR進程,負責日誌的收集和輸出,還可以做其他一些耗時的操作,避免業務進程阻塞。

MCP框架兼有功能強大和性能卓越的優點。具體壓測數據不太記得,在一個數據包轉發服務中,QPS也在30W+。在使用上,有一定的學習成本,但是適用面非常廣,可以說一個框架走天下。


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

-Advertisement-
Play Games
更多相關文章
  • 遇到的問題 這兩天在開發一個病歷的對外展示頁面,設計稿上label是左右拉伸對齊的,顯示效果如下: 怎麼實現這種效果呢? 首先想到的是文字中間加空格,但是這種方式太low了,而且不太容易控制。網上查資料,發現用justify可以實現。 但是加上上述樣式後,文字依然沒有左右對齊。 justify為什麼 ...
  • 現實的場景中很經常遇到表格el-table數據過多,為了更好的用戶體驗,所以我們需要用到分頁,一般分頁可以視數據量的大小可分為前端控制和後端控制。 先看下效果(已做脫敏處理) 圖1 前端el-table分頁效果 這裡就把ElementUi官方的例子進行修改來說明 <template> <el-tab ...
  • 1.position的值, relative和absolute分別是相對於誰進行定位的? § absolute :生成絕對定位的元素, 相對於最近一級的 定位不是 static 的父元素來進行定位。 § fixed (老IE不支持)生成絕對定位的元素,通常相對於瀏覽器視窗或 frame 進行定位。 ...
  • * ++ -- 都是運算符 * ++ 和 -- 可以分為:前+ 和後+ and 前- 和後- * 如果++在後面:如: num++ +10參與運算 * 先參與運算,運算結束後自身再加1 * 如果++在前面:如: ++num+10參與運算 * 先自身加1,然後再參與運算 * Ctrl+/可以把選中的代 ...
  • 為了加強項目的介面安全程度,需求如下 1 var options = { 2 // 前端需要傳送的數據加密 3 data: { 4 abc: 123, 5 bcd: 123, 6 cds: '撒旦教付貨款12313', 7 }, 8 // 模擬後端返回base64碼 9 key: 'NWxCZUZ3 ...
  • 獲取兩個數字中的最大值 用if-else語句 var num1 = 10; var num2 = 100; if (num1 > num2) { console.log(num1); } else { console.log(num2); } 兩個分支,最終的結果是兩個分支中的一個,像這種情況可以使 ...
  • 一、頁面佈局 ​ 預設九宮格圖 九宮格占點陣圖 HTML頁面代碼: 二、頁面樣式 九宮格佈局相關CSS頁面樣式: 三、代碼邏輯 Luck幸運抽獎函數方法: 獎品列表DOM拼接: javascript / 獎品列表排序 / let sortList = function(data, el) { var ...
  • 開始學些Html的時候主要進行一些簡單的靜態網頁的處理: 1、HTML 標題 HTML 標題(Heading)是通過 h1-h6 加中括弧<>等標簽進行定義的。 2、HTML 段落 HTML 段落是通過 標簽進行定義的。 3、HTML 鏈接 HTML 鏈接是通過《a》標簽進行定義的。 4、HTML ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...