上篇介绍了一个简单的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+。在使用上,有一定的学习成本,但是适用面非常广,可以说一个框架走天下。

后台服务器框架中的瑞士军刀——MCP的更多相关文章

  1. 后台开发小白必学服务器框架——UDPServer

    毕业后加入了一家大型的互联网公司的音视频产品部门做后台开发,其实我本身是学习自动化的,研究生的方向嵌入式系统,对互联网可是一知半解,因此能进入这样一个大公司还是很幸运的. 刚开始工作的半年应该是在上份 ...

  2. ASP.NET MVC搭建项目后台UI框架—8、将View中选择的数据行中的部分数据传入到Controller中

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  3. springboot框架中集成thymeleaf引擎,使用form表单提交数据,debug结果后台获取不到数据

    springboot框架中集成thymeleaf引擎,使用form表单提交数据,debug结果后台获取不到数据 表单html: <form class="form-horizontal ...

  4. PHP使用frameset制作后台界面时,怎样实现通过操作左边框架,使右边框架中的页面跳转?

    左框架的链接,不仅要指定链接的文件名,还需要通过 target 属性指定要打开的目标框架名(即楼主要求的右框架名). 例:假设右框架为 <frame scr="lx1.htm" ...

  5. 跟着拉大锯大神学Android——网络编程中运行后台服务器端口占用问题

    拉大锯网页地址:https://www.sunofbeach.net/u/1153952789488054272 跟着拉大锯大神学Android,在学到网络编程时,使用了大神搭建的用于学习的后台服务器 ...

  6. ASP.NET MVC搭建项目后台UI框架—5、Demo演示Controller和View的交互

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  7. ASP.NET MVC搭建项目后台UI框架—6、客户管理(添加、修改、查询、分页)

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  8. ASP.NET MVC搭建项目后台UI框架—7、统计报表

    ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NET M ...

  9. Web API应用架构在Winform混合框架中的应用(1)

    在<Web API应用架构设计分析(1)>和<Web API应用架构设计分析(2)>中对WebAPI的架构进行了一定的剖析,在当今移动优先的口号下,传统平台都纷纷开发了属于自己 ...

随机推荐

  1. SQLMAP SSI注入错误解决

    记一次SQL注入 目标地址:https://www.xxxx.com/ 之前补天提交过这个注入  后来貌似”修复了”(实际就是装了安全狗和过滤了一些关键字) 不过今天试了下 还是可以注入 可以看到已经 ...

  2. 爬虫1:html页面+beautifulsoap模块+get方式+demo

    前言:最近公司要求编写一个爬虫,需要完善后续金融项目的数据,由于工作隐私,就不付被爬的网址url了,下面总结下spider的工作原理. 语言:python:工具:jupyter:    概要:说到爬虫 ...

  3. [POJ2248] Addition Chains 迭代加深搜索

    Addition Chains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5454   Accepted: 2923   ...

  4. vue在一个方法执行完后再执行另一个方法

    vue在一个方法执行完后执行另一个方法 用Promise来实现.Promise是ES6的新特性,用于处理异步操作逻辑,用过给Promise添加then和catch函数,处理成功和失败的情况 ES7中新 ...

  5. 提权案例(一)渗透某asp.net网站通过sql server数据库public 提权 思路分享

    先罗列出sql server 角色用户的权限 按照从最低级别角色(bulkadmin)到最高级别角色(sysadmin)的顺序进行描述:1.bulkadmin:这个角色可以运行BULK INSERT语 ...

  6. java-反编译工具(luyten)

    下载地址:https://github.com/deathmarine/Luyten

  7. nuxt.js部署vue应用到服务端过程

    由于seo的需要,最近将项目移植道nuxt.js下采用ssr渲染 移植完成后,一路顺畅,但是到了要部署到服务器端上时候,还是个头疼的问题,但最终还是顺利完成.现在记录一下部署中的过程. 注:部署时候过 ...

  8. leetcode系列---3Sum C#code

    Function: public static List<int[]> SumSet(int[] array) { List<int[]> result = new List& ...

  9. 【MySQL】MySQL忘记密码或修改密码的方法

    MySQL修改新密码方法 记得原密码情况下,修改新密码:登录到数据库后,输入 set password for 用户名@localhost = '新密码';  来设置新的密码,别忘记分号哦.如图所示: ...

  10. (JavaScript) base64 字符串 和 ArrayBuffer 之间转换

    base64 --> ArrayBuffer function base64ToUint8Array(base64String) { const padding = '='.repeat((4 ...