腾讯开源了很多自己内部久经考验的框架代码,这里对C++及大前端相关的开源框架进行一些探索,有类似需求的可以参考一下。
GitHub:https://github.com/Tencent
官网:https://opensource.tencent.com
1、Tars:https://github.com/TarsCloud/Tars
首先必推Tars框架,Tars 是将腾讯内部使用的微服务架构 TAF(Total Application Framework)多年的实践成果总结而成的开源项目,成熟度及稳定性高。支持多语言的高性能 RPC 开发框架和配套一体化的服务治理平台。
毫无疑问,微服务的核心框架采用C++编写,跨语种的RPC采用类似protobuf通信模式。源码安装部署请参考:
https://tarscloud.github.io/TarsDocs/installation/source.html,不得不说他们的文档写的还是非常详细的。
安装完成是这样的:
管理平台:
服务的开发及框架解析,后续继续研究~
2、libco协程(coroutine)
https://github.com/Tencent/libco 非常轻量的C++协程框架,2k~3k行代码量,采用epool+hook实现。libco是微信后台大规模使用的c/c++协程库,2013年至今稳定运行在微信后台的数万台机器上。
使用方式如下:
单线程下的生产者、消费者模式(自带的demo)
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include "co_routine.h"
using namespace std;
/**
* 本实例是对条件变量的展示,其作用类似于pthread_cond_wait
*/
struct stTask_t
{
int id;
};
struct stEnv_t
{
stCoCond_t* cond;
queue<stTask_t*> task_queue;
};
void* Producer(void* args)
{
co_enable_hook_sys();
stEnv_t* env= (stEnv_t*)args;
int id = 0;
while (true)
{
stTask_t* task = (stTask_t*)calloc(1, sizeof(stTask_t));
task->id = id++;
env->task_queue.push(task);
printf("%s:%d produce task %d\n", __func__, __LINE__, task->id);
co_cond_signal(env->cond);
poll(NULL, 0, 1000);
}
return NULL;
}
void* Consumer(void* args)
{
co_enable_hook_sys();
stEnv_t* env = (stEnv_t*)args;
// consumer会一直消费,直到为空后,调用co_cond_timedwait切出协程,等待再次不为空
while (true)
{
if (env->task_queue.empty())
{
co_cond_timedwait(env->cond, -1);
continue;
}
stTask_t* task = env->task_queue.front();
env->task_queue.pop();
printf("%s:%d consume task %d\n", __func__, __LINE__, task->id);
free(task);
}
return NULL;
}
int main()
{
stEnv_t* env = new stEnv_t;
env->cond = co_cond_alloc();
stCoRoutine_t* consumer_routine;
co_create(&consumer_routine, NULL, Consumer, env);
co_resume(consumer_routine);
stCoRoutine_t* producer_routine;
co_create(&producer_routine, NULL, Producer, env);
co_resume(producer_routine);
co_eventloop(co_get_epoll_ct(), NULL, NULL);
return 0;
}
运行结果:
Producer:49 produce task 0
Consumer:69 consume task 0
Producer:49 produce task 1
Consumer:69 consume task 1
Producer:49 produce task 2
Consumer:69 consume task 2
Producer:49 produce task 3
Consumer:69 consume task 3
Producer:49 produce task 4
Consumer:69 consume task 4
Producer:49 produce task 5
Consumer:69 consume task 5
Producer:49 produce task 6
Consumer:69 consume task 6
......
(调试模式查看仅一个工作线程)3、跨平台App开发 https://github.com/Tencent/Hippy 跨平台App开发框架,支持 React 和 Vue 两种主流前端框架。C++为主开发。
https://github.com/Tencent/VasSonic 基于Hippy,专门提升H5首页加载速度。
https://github.com/Tencent/Taitank Taitank 是一个支持 Flex 的跨平台的轻量级的 C++ 排版引擎。
4、微信UI框架
https://github.com/Tencent/wepy 微信小程序组件化开发框架,js为主开发。
https://github.com/Tencent/omi Omi 打造的跨框架、跨主题 UI 组件库,js为主开发。
5、运维/运营:
https://github.com/Tencent/bk-cmdb 蓝鲸智云配置平台(BlueKing CMDB),是一个面向资产及应用的企业级配置管理平台。(Go编写)
https://github.com/Tencent/matrix Matrix 是一款微信研发并日常使用的应用性能接入框架,支持iOS, macOS和Android。 Matrix 通过接入各种性能监控方案,对性能监控项的异常数据进行采集和分析,输出相应的问题分析、定位与优化建议,从而帮助开发者开发出更高质量的应用。当前工具监控范围包括:崩溃、卡顿和爆内存。
6、分布式及事务:
https://github.com/Tencent/phxpaxos PhxPaxos:微信自研生产级paxos类库,C++编写。
(Raft协议相对Paxos容易理解一些,Raft偏工程实践一些,Paxos偏科学理论一点)
https://github.com/Tencent/Phxqueue PhxQueue是微信开源的一款基于Paxos协议实现的高可用、高吞吐和高可靠的分布式队列,保证At-Least-Once Delivery。在微信内部广泛支持微信支付、公众平台等多个重要业务。
https://github.com/Tencent/phxsql PhxSQL是由微信后台团队自主研发的一款数据强一致、服务高可用的分布式数据库服务。PhxSQL提供Zookeeper级别的强一致和高可用,完全兼容MySQL。
https://github.com/Tencent/phxrpc PhxRPC是微信后台团队推出的一个非常简洁小巧的RPC框架,编译生成的库只有450K。
https://github.com/Tencent/flare Flare是广泛投产于腾讯广告后台的现代化C++开发框架,包含了基础库、RPC、各种客户端等。主要特点为易用性强、长尾延迟低。
https://github.com/Tencent/3TS Tencent Transaction Processing Testbed System(简称3TS),是腾讯公司CynosDB(TDSQL)团队与中国人民大学数据工程与知识工程教育部重点实验室,联合研制的面向数据库事务处理的验证系统。该系统旨在通过设计和构建事务(包括分布式事务)处理统一框架,并通过框架提供的访问接口,方便使用者快速构建新的并发控制算法;通过验证系统提供的测试床,可以方便用户根据应用场景的需要,对目前主流的并发控制算法在相同的测试环境下进行公平的性能比较,选择一种最佳的并发控制算法。目前,验证系统已集成13种主流的并发控制算法,提供了TPC-C、PPS、YCSB等常见基准测试。3TS还进一步提供了一致性级别的测试基准,针对现阶段分布式数据库系统的井喷式发展而造成的系统选择难问题,提供一致性级别判别与性能测试比较。
7、消息中间件(MQ):
https://github.com/Tencent/TubeMQ TubeMQ是腾讯大数据在2013年开始研发的分布式消息中间件系统(MQ),专注服务大数据场景下海量数据的高性能存储和传输。经过近7年上万亿的海量数据沉淀,较之于众多的开源MQ组件,TubeMQ在海量实践(稳定性+性能)和低成本方面有一定的优势。(Java为主开发)
8、全文检索:
https://github.com/Tencent/wwsearch wwsearch微信后台自研的全文检索引擎,为海量用户下的全文快速检索而设计,底层支持可插拔的lsm tree存储引擎。业界有被广泛使用的开源全文检索引擎,比如:lucene、sphinx等,它们适用于站内检索的场景。而在海量用户、大规模数据量的实时检索场景下,存在明显缺点: 1. 无法支持细粒度切分索引,只能对全局数据构建索引 ,检索过程需要过滤冗余数据。 2. 不支持实时检索,有几十秒~分钟级延迟。 3. 实际部署机型要求高,需要大内存机型才能支撑T级别的数据存储。wwsearch则是针对已有方案的不足,并结合企业级应用场景,重新设计和实现一套通用的全文检索引擎。
9、数据库:
https://github.com/Tencent/CMONGO 腾讯自研MongoDB内核,它是TEG基础架构部在开源MongoDB源码的基础上进行了一系列优化的内核版本,目前包括腾讯云MongoDB和公司内部很多业务的MongoDB服务(如:ckv冷数据,微信账单等)都在使用这个内核版本。
https://github.com/Tencent/DCache DCache是一个基于TARS框架开发的分布式NoSQL存储系统,数据采用内存存储,支持连接后端DB实现数据持久化。DCache采用集群模式,具有高扩展、高可用的特点。
https://github.com/Tencent/MMKV MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今在微信上使用,其性能和稳定性经过了时间的验证。
https://github.com/Tencent/Tendis 高性能的分布式存储系统,兼容redis协议,C++编写。
TenDB Cluster是腾讯游戏CROS DBA团队提供的MySQL分布式关系型数据库解决方案,主要特点包括:透明分库分表、高可用的MySQL集群服务,透明及在线的扩容及缩容;使得开发者可以仅专注于业务逻辑的开发及运营,无需编写数据分片逻辑,在海量用户并发情况下,也无须关心DB存储层的负载压力。
https://github.com/Tencent/TenDBCluster-TSpider 接入层,是腾讯游戏CROS DBA基于MariaDB 10.3.7开发定制的版本,主要完善并定制spider这一分布式MySQL存储引擎。
https://github.com/Tencent/TenDBCluster-TenDB 存储层,是腾讯游戏CROS DBA基于Percona Server 5.7.20开定制的MySQL分支,主要提供一些更贴近游戏特点的基础能力,包括在线加字段、大字段压缩、binlog压缩及限速等。
https://github.com/Tencent/TenDBCluster-Tdbctl 集群的中控节点,是腾讯游戏CROS DBA团队基于TenDB开发(主要复用TenDB自身的SQL解析能力及MGR能力),主要提供集群路由管理、集群变更、集群监控等能力。