大型分布式C++框架《一:框架简介》

  首先名字要取得霸气才能吸引人气,哈哈~~

  下面简单介绍下情况。框架是腾讯电商平台的分布式框架。虽然腾讯拍拍已经玩完了。但是这套框架还是很不错的。而且据原腾讯同事说微信也是用的这套框架。源码肯定是不能说的。但是介绍大体的思想我想应该没问题。虽然在这个框架下写了一年多的业务代码。但是平台框架的代码一直没怎么看。最近有开始看平台代码虽然没看完。但是大体的思想已经清楚。可以分享下我看的心得。具体细节我琢磨下看哪些能分享。

 

  现在我们框架依然是用来做电商业务。框架可以分布式部署。

  简单来说是多进程+协程   并没有用到网上一直说的多线程。

 

下面来具体介绍下框架的内容

一、框架总体介绍

框架总体分4个部分。 config_center、netio2、back_netio2、container3

config_center: 作用是 获取命令字并通知netio2、back_netio2、container3

netio2: 收取网络包  发给container3 去执行

container3:执行具体的业务

back_netio2:如果是跨机调用。则需要back_netio2来转发包

二、这里我先介绍下一个包的基本流程。

首先 先简单介绍一下我们框架的基本常识。后面会详细介绍

a)我们是使用的rpc接口远程调用的模式, 每个接口都有一个命令字。  

b)然后 每个container进程就是一个服务。每一个负责具体的不同业务。   一个服务里会用很多个接口。 

c)每个服务  会分为  ao  和 dao 。  ao做业务逻辑。但是是非阻塞的 ,dao 专门用来存取数据可以是阻塞的。

 

接下来我们说下包的流转过程

 

1) 前端 发送一个 调用接口的请求过来 比如调用GetShopName接口

2) netio  收到包以后。  做一些处理。比如打上时间戳等。  然后把包丢到消息队列里。  netio是一个单线程的进程。 可以起多个netio来收包。

3)container服务 在消息队列里发现有包。  就取出来处理。然后切换协程。 它会把包丢给具体的AO业务服务去处理。

4)Ao服务  发现 需要取数据。  它会生成一个请求包。把数据丢到消息队列里去。然后会切回主进程。继续监听消息队列

5)container 从消息队列里接收到了  函数A处理完的结果。  就会立马在切到服务Ao里去,继续执行。

6) 在掉到 函数B的时候  发现需要去别的进程取数据。  然后跟函数A的处理一样。这里就不说了。  

打字好累。。。

7)container处理完了所有数据。  生成一个返回包。然后把它丢到消息队列里。

8)netio  拿到返回包。 找到请求时的socket发送回去。

 

到这里一个基本的流程完了。

由于很多东西都没有介绍。所以图话的比较简陋、说明的也比较泛泛。 等后面慢慢介绍完细节。就明白了。

光看一个图。很多东西看不出来的

 

 

下面先介绍下贯穿整个框架两个比较核心的东西。

一个是消息队列还有一个是协程。

这两个东西 支持了系统的分布式部署。以及大并发的处理能力。以及无锁编程

 

三、消息队列

有比较才能看的更清晰

这里首先我们看下多线程编程下怎么处理包的。

由于我没有接触过像腾讯、阿里这样大型的多线程框架所以我这里只说以前公司写的多线程处理模式。

 

在多线程模式下。服务端会生自己成一个任务队列。然后对这个队列进行加锁操作。

然后服务每次收到一个请求包。就把请求包扔到任务队列里。 然后继续收包。仍包。   

然后线程池会去 任务队列里取任务 并处理

 

我们现在的这个框架中的消息队列。就相当于 一个任务队列。

 

1)  因为我们用系统消息队列。   然后我们限制了消息队列的大小。所以即使并发往消息队列里塞消息。顶多也就是赛不进去。对系统影响不到。 而且不用不用给队列上锁之类的操作。速度杠杠的。

2) netio 进程起来的 时候会有一个消息队列。  专门用来接收处理完的请求。然后把这些请求发送回给前端。

3)每个服务  会有两个队列。   一个叫请求队列   一个叫回包队列。  

请求队列是用来接收别的服务发送过来的请求的包。  

回包队列是服务本身请求别的服务。别的服务返回结果则放到这个回报队列里

4) 所以 ipcs -q 的时候 会看到有一堆的消息队列。

 

 

这样的话可以看到  每个服务跟每个服务是相互独立的。  

他们都有自己的任务队列。每个服务即可以是开始  也可以是结束。

但是 消息队列并不是最快的。如果做的复杂可以用共享内存。

但是  平台用系统自带消息队列  给人感觉很清晰。也不会那么复杂。

 

 

四、协程

协程这个东西如果要说的话。还是有挺多东西说的。这里就细说。说些基本的东西

在我没接触协程的时候。  写多线程服务端程序的时候。觉得多线程很牛逼。后台接触了这个框架。慢慢熟悉协程,发现协程更牛逼。。。。

但其实不能说协程比线程更厉害。只是应用场景上不同。

 

多线程的好出我就不说了。这里说下多线程的缺点。

1)多线程  切换的时候 需要陷入内核。切换的成本比较大。而且线程数过多。这个切换的成本会足增

2)多线程 编写代码的时候。常常会用到锁。一来代码没写好会造成死锁,二来用锁会减慢程序执行的速度

 

而协程 刚好解决了这两个问题

1)协程 切换 是在用户空间,不需要陷入内核。有程序员手动控制。所以协程的切换成本非常滴。

可以创建大量协程  而不会对系统有运行有影响

2)写协程代码  其实大体上是顺序思维。 基本上用不到锁。

所以这里其实有个很重要的问题。由与协程相当于顺序执行。所以一定不能阻塞。

 

在我们的平台中。

1)AO服务一般是一个进程。然后起50个协程。具体看业务量。如果业务量大可以起多个AO进程

2)AO由于是用协程的。所以AO服务不能阻塞。任何阻塞的动作。都不会在AO中出现。AO一把做业务处理。 就是 比如参数校验、if else 、赋值  、业务逻辑等等。

3)如果要去db或者缓存里取数据。 AO服务会调用DAO服务。

4)DAO服务  一般起10个进程。主要用来去mysql和redis、等取数据。可以阻塞

 

所以这个模型下。再加上超时处理机制。

可以处理大量并发场景。

 

拍拍虽然没有达到淘宝那样的请求量。

但也是上亿的请求并发。

so ,看完框架代码以后 才发现这个框架写的真是好。

 

但是我反而更好奇  淘宝那种。高并发的框架是什么样的。

是否用到了多线程

    

 

 

先就介绍这么多吧。还有很多细节才组成了这个框架

后面再慢慢说

争取每一个星期更新一篇吧。

努力在两个月内把框架看完

 

时间: 2024-08-06 11:51:15

大型分布式C++框架《一:框架简介》的相关文章

大型分布式C++框架《四:netio之请求包中转站 上》

本来一篇文章就该搞定的.结果要分上下篇了.主要是最近颈椎很不舒服.同时还在做秒杀的需求也挺忙的. 现在不能久坐.看代码的时间变少了.然后还买了两本治疗颈椎的书.在学着,不过感觉没啥用.突然心里好害怕.如果颈椎病越来越重.以后的路怎么走. 现在上下班有跑步,然后坐一个小时就起来活动活动.然后在跟着同时们一起去打羽毛球吧.也快30的人了.现在发觉身体才是真的.其他都没什么意思.兄弟们也得注意~~ 废话不多说.下面介绍下netio. netio在系统中主要是一个分包的作用.netio本事没有任何的业务

大型分布式C++框架《四:netio之buffer管理器 下》

每周一篇又来了.这次主要介绍netio的buffer管理器. 首先buffer管理是每一个网络层不可回避的问题.怎么高效的使用buffer是很关键的问题.这里主要介绍下我们的netio是怎么处理.说实话 这是我见过比较蛋疼buffer管理.  反正我是看了好几天 才看明白的.      最近看了下Qcon2016的视频.里面很多大牛介绍分布式平台. 感觉特别牛逼~~. 感觉我们的分布式相比他们的这些还是简陋了点.感兴趣的同学可以去看看      http://daxue.qq.com/conte

【推荐】微服务大型分布式企业框架 dubbo + springmvc + mybatis + ehcache + redis Jeesz分布式架构

框架简介--主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件.数据权限组件.数据字典组件.核心工具 组件.视图操作组件.工作流组件组件.代码生成等.采用分层设计.双重验证.提交数据安全编码.密码加密.访问验证.数据权限验证.平台简介 是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. 本身集成Dubbo服务管控.Zookeeper注册中心.Redis分布式缓存技术.FastDFS分布式文件系统.A

大型分布式C++框架《二:大包处理过程》

本来这一篇是打算写包头在分布式平台中的具体变换过程的.其实文章已经写好了.但是想了这个应该是不能随便发表的.毕竟如果知道了一个包的具体每个字节的意义.能伪造包来攻击系统.其次来介绍一个包的具体变换过程意义不大.在每个分布式系统的里.包的扭转应该是个有不同.我们着重的应该是一种思想.一种共性.而不是个体的具体实现. 这里打算就介绍下大包的处理.其实这个更多的是介绍了下TCP切包.跟分布式没啥关系....  不过这也算是系统的一部分 下面介绍下一个大包的具体处理过程 一.发送请求并分析 1)首先我们

【推荐】Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa微服务大型分布式企业框架

摘要: Jeesz主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件.数据权限组件.数据字典组件.核心工具 组件.视图操作组件.工作流组件.代码生成等.采用分层设计.双重验证.提交数据安全编码.密码加密.访问验证.数据权限验证. 平台简介 Jeesz是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. Jeesz本身集成Dubbo服务管控.Zookeeper注册中心.Redis分布式缓存技术.Fast

Java大型互联网架构-分布式系统服务框架Zookeeper介绍与原理实现

分布式系统服务框架Zookeeper介绍与原理实现 Zookeeper基本概念 zk角色 Zookeeper中的角色主要有以下三类,如下表所示: zookeeper角色 zk service网络结构 Zookeeper的工作集群可以简单分成两类,一个是Leader,唯一一个,其余的都是follower,如何确定Leader是通过内部选举确定的. zookeeper服务 Leader和各个follower是互相通信的,对于zk系统的数据都是保存在内存里面的,同样也会备份一份在磁盘上. 对于每个zk

selenium之多线程启动grid分布式测试框架封装(四)

九.工具类,启动所有远程服务的浏览器 在utils包中创建java类:LaunchAllRemoteBrowsers package com.lingfeng.utils; import java.net.MalformedURLException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set;

分布式服务框架 Zookeeper(一)介绍

一.概述 ZooKeeper(动物园管理员),顾名思义,是用来管理Hadoop(大象).Hive(蜜蜂).Pig(小猪)的管理员,同时Apache Hbase.Apache Solr.LinkedIn Sensei等众多项目中都采用了ZooKeeper. ZooKeeper曾是hadoop的正式子项目,后发展成为Apache顶级项目,与Hadoop密切相关但却没有任何依赖.它是一个针对大型应用提供高可用的数据管理.应用程序协调服务的分布式服务框架,基于对Paxos算法的实现,使该框架保证了分布式

大型分布式电商系统架构是如何从0开始演进的?【转】

本文是学习大型分布式网站架构的技术总结.对架构一个高性能.高可用.可伸缩及可扩展的分布式网站进行了概要性描述,并给出一个架构参考.文中一部分为读书笔记,一部分是个人经验总结,对大型分布式网站架构有较好的参考价值. 一.大型分布式网站架构技术 1.大型网站的特点 用户多,分布广泛 大流量,高并发 海量数据,服务高可用 安全环境恶劣,易受网络攻击 功能多,变更快,频繁发布 从小到大,渐进发展 以用户为中心 免费服务,付费体验 2.大型网站架构目标 高性能:提供快速的访问体验. 高可用:网站服务一直可