OWenT's blog
  • Introduction
  • About Me
  • 2020
    • 近期对libatapp的一些优化调整(增加服务发现和连接管理,支持yaml等)
    • xresloader转表工具链增加了一些新功能(map,oneof支持,输出矩阵,基于模板引擎的加载代码生成等)
    • 在游戏服务器中使用分布式事务
    • libcopp接入C++20 Coroutine和一些过渡期的设计
    • libatbus 的大幅优化
    • nftables初体验
    • 容器配置开发环境小计
  • 2019
    • PALM Tree - 适合多核并发架构的B+树 - 论文阅读小记
    • 跨平台协程库 - libcopp 简介
    • C++20 Coroutine 性能测试 (附带和libcopp/libco/libgo/goroutine/linux ucontext对比)
    • 尝鲜Github Action
    • 一些xresloader(转表工具)的改进
    • protobuf、flatbuffer、msgpack 针对小数据包的简单对比
    • 协程框架(libcopp) 小幅优化
    • Excel转表工具(xresloader) 增加protobuf插件功能和集成 UnrealEngine 支持
    • Anna(支持任意扩展和超高性能的KV数据库系统)阅读笔记
    • C++20 Coroutine
    • libcopp merge boost.context 1.69.0
    • Google去中心化分布式系统论文三件套(Percolator、Spanner、F1)读后感
    • Rust玩具-企业微信机器人通用服务
  • 2018
    • 使用ELK辅助监控开发测试环境服务质量和问题定位
    • Webpack+vue+boostrap+ejs构建Web版GM工具
    • 2018年的新通用伪随机数算法(xoshiro / xoroshiro)的C++(head only)实现
    • Rust的第二次接触-写个小服务器程序
    • 理解和适配AEAD加密套件
    • atsf4g-co的进化:协程框架v2、对象路由系统和一些其他细节优化
    • 协程框架(libcopp)v2优化、自适应栈池和同类库的Benchmark对比
    • 可执行文件压缩
    • 初识Rust
    • 使用restructedtext编写xresloader文档
    • atframework的etcd模块化重构
    • C++的backtrace
  • 2017
    • ECDH椭圆双曲线(比DH快10倍的密钥交换)算法简介和封装
    • protobuf-net的动态Message实现
    • pbc的proto3接入
    • atgateway内置协议流程优化-加密、算法协商和ECDH
    • 整理一波软件源镜像同步工具+DevOps工具
    • Blog切换到Hugo
    • libcopp v2的第一波优化完成
    • libcopp(v2) vs goroutine性能测试
    • libcopp的线程安全、栈池和merge boost.context 1.64.0
    • GCC 7和LLVM+Clang+libc++abi 4.0的构建脚本
    • libatbus的几个藏得很深的bug
    • 用cmake交叉编译到iOS和Android
    • 开源项目得一些小维护
    • atapp的c binding和c#适配
    • 对象路由系统设计
    • 2016年总结
    • 近期的一个协程流程BUG
  • 2016
    • 重写了llvm+clang+libc++和libc++abi的构建脚本
    • atsf4g完整游戏工程示例
    • atframework基本框架已经完成
    • 游戏服务器的不停服更新
    • 对atbus的小数据包的优化
    • Android和IOS的TLS问题
    • pbc的一个陈年老BUG
    • boost.context-1.61版本的设计模型变化
    • 接入letsencrypt+全面启用HTTP/2
    • 理解Raft算法
    • libatbus基本功能及单元测试终于写完啦
    • 博客文章和文档迁移到gitbook
  • 2015
    • 博客文章和文档迁移到gitbook
    • 给客户端写得LRU缓存
    • 近期活动比较零散
    • 关于BUS通信系统的一些思考(三)
    • 针对Java JIT的优化(转表工具:xresloader)
    • libcopp更新 (merge boost 1.59 context)
    • 小记最近踩得两个C++坑
    • Redis全异步(HA)Driver设计稿
    • Vim常用命令
    • 关于firewalld和systemd的一些命令速记
    • Jenkins(hudson)插件记录
    • 我们的Lua类绑定机制
    • LLVM+Clang+Libcxx+Libcxxabi(3.6)工具链编译(完成自举编译)
    • 回顾2014
    • Android NDK undefined reference to ___tls_get_addr 错误
    • gitlab腾讯企业邮箱配置
  • 2014
    • 回顾2013
    • C++11动态模板参数和type_traits
    • C++又一坑:动态链接库中的全局变量
    • tolua++内存释放坑
    • [转]类似github的框架
    • Lua性能分析
    • 集成Qt Webkit 到cocos2d-x
    • Gitlab环境搭建小计
    • 近期研究VPN的一些记录(OpenVPN,pptp,l2tp)
    • LLVM + Clang + Libcxx + Libcxxabi 工具链编译
    • 关于BUS通信系统的一些思考(二)
    • 关于BUS通信系统的一些思考(一)
    • [libiniloader] Project
    • 记录一些在线编辑器
    • [WP Code Highlight.js] Project
    • 再议 C++ 11 Lambda表达式
    • 基于Chrome插件的开发工具链
    • [ACM] HDU 1006 解题报告
    • Linux 编译安装 GCC 4.9
    • 又碰到了这个解谜游戏,顺带记下地址
    • 简单C++单元测试框架(支持一键切到GTest或Boost.Test)
    • 捣鼓一个协程库
  • 2013
    • std和boost的function与bind实现剖析
    • 不知道是哪一年的腾讯马拉松题目 照片评级 解题报告
    • Lua 挺好用的样子
    • VC和GCC成员函数指针实现的研究(三)
    • VC和GCC成员函数指针实现的研究(二)
    • VC和GCC内成员函数指针实现的研究(一)
    • 一个C++关于成员变量偏移地址的小Trick
    • ptmalloc,tcmalloc和jemalloc内存分配策略研究
    • POJ 2192 Zipper HDU 2059 龟兔赛跑
    • 从Javascript到Typescript到Node.js
    • 网络编程小结
    • 试试Boost.Asio
    • Lnmp yum 安装脚本 (for CentOS)
    • ARM 交叉编译环境搭建
    • Linux 编译安装 GCC 4.8
    • [记录]虚拟硬盘的压缩|磁盘写零
  • 2012
    • Boost.Spirit 初体验
    • “C++的90个坑”-阅读笔记
    • AC自动机
    • C++ 标准过渡期
    • 程序员修炼之道 -- 阅读笔记
    • [转载]狼与哈士奇
    • C++ 新特性学习(八) — 原子操作和多线程库[多工内存模型]
    • C++ 新特性学习(七) — 右值引用
    • 理解Protobuf的数据编码规则
    • 忆往昔ECUST的ACM时代
    • Linux编译安装GCC 4.7
    • JSON显示库 -- showJson (Javascript)
    • C++ 新特性学习(六) — 新的字符串编码和伪随机数
    • C++ 新特性学习(五) — 引用包装、元编程的类型属性和计算函数对象返回类型
    • C++ 新特性学习(四) — Bind和Function
  • 2011
    • C++ 新特性学习(三) — Regex库
    • C++ 新特性学习(二) -- Array、Tuple和Hash库
    • C++ 新特性学习(一) -- 概述+智能指针(smart_ptr)
    • Linux 和 Windows PowerShell 常用工具/命令 记录
    • 非常帅气的Linq to sql
    • 2011 Google Code Jam 小记
    • C++总是很神奇
    • 大学生创新项目[国家级]经费使用记录
    • 常用官方文档整理
    • 我们学校的IPV6很不错嘛
  • 2010
    • 线段树相关问题 (引用 PKU POJ题目) 整理
    • 2010 ACM 赛前笔记
    • POJ PKU 2596 Dice Stacking 解题报告
    • POJ PKU 3631 Cuckoo Hashing 解题报告
    • POJ PKU 1065 Wooden Sticks 3636 Nested Dolls 解题报告
    • HDU 3336 Count the string 解题报告
    • Hash模板 个人模板
    • ZOJ 3309 Search New Posts 解题报告
    • POJ PKU Let's Go to the Movies 解题报告
    • 注册表常用键值意义
    • PKU POJ 1724 ROADS 解题报告
    • 《神奇古今秘方集锦》&《民间秘术大全》
    • PKU POJ 1720 SQUARES 解题报告
    • POJ PKU 2155 Matrix 解题报告
    • PKU POJ 1141 Brackets Sequence 解题报告
    • PKU POJ 2728 Desert King 解题报告
    • PKU POJ 2976 Dropping tests 解题报告
    • PKU POJ 3757 Simple Distributed storage system 解题报告
    • GCD Determinant 解题报告
    • Southeastern European 2008 Sky Code 解题报告
    • HDU HDOJ 3400 Line belt 解题报告
    • 线性筛法求质数(素数)表 及其原理
    • HDU HDOJ 3398 String 解题报告
    • 树状数组模块(个人模板)
    • 浙江理工 省赛总结 team62 By OWenT of Coeus
    • POJ PKU 3659 Cell Phone Network 解题报告
    • USACO 2008 March Gold Cow Jogging 解题报告
    • C#格式化输出(记录)
    • 参加有道难题笔记
    • POJ PKU 2446 Chessboard 解题报告
    • POJ PKU 1986 Distance Queries 解题报告
    • 计算几何算法概览[转载]
    • 关于差分约束(转载)
    • POJ PKU 2826 An Easy Problem?! 解题报告
    • 数论模板(个人模板)
    • 简易四则运算(ACM个人模板)
    • Catalan 数
    • The 35th ACM/ICPC Asia Regional Tianjin Site —— Online Contest 1009 Convex 解题报告
    • JQuery扩展插件--提示信息
    • ACM 计算几何 个人模板
    • 解析网站字符串型参数 Javascript QueryString 操作 TQueryString类
    • POJ PKU 1474 Video Surveillance 解题报告
  • 2009
    • 模式匹配(kmp)个人模板
    • 并查集 模板
    • POJ 3267 The Cow Lexicon 解题报告
    • C/C++语言常用排序算法
    • POJ 2606 Rabbit hunt 2780 Linearity 1118 Lining Up 解题报告
    • 打造最快的Hash表(转) [以暴雪的游戏的Hash为例]
    • ECUST 09年 校赛个人赛第六,七场总结
    • ECUST 09年 校赛个人赛第三场部分解题报告(A,D,F,I)
    • 牛顿迭代解方程 ax^3+bX^2+cx+d=0
    • 09年8月9日 ECUST ACM 练习赛总结
    • 连接最多点直线 (OWenT 个人模板)
    • 点到直线距离 和 线段间最短距离 (OWenT 模板)
    • ECUST 09年 校赛个人训练赛第五场总结
    • ECUST 09年 校赛个人赛第八场(最后一场)总结
    • 09年8月14日 ECUST ACM 练习赛总结
    • 矩阵相关 (增强中)
    • Prime最小生成树(个人模板)
    • 最长单调子序列 复杂度nlog(n)
    • POJ PKU 2549 Sumsets 解题报告
    • POJ PKU 3277 City Horizon 解题报告
    • 我的ACM生涯
    • POJ PKU 2528 Mayor's posters 解题报告
    • POJ PKU 2378 Tree Cutting 解题报告
    • POJ PKU 1990 MooFest 解题报告
Powered by GitBook
On this page
  • 服务发现
  • 连接管理
  • 关于Service Mesh

Was this helpful?

  1. 2020

近期对libatapp的一些优化调整(增加服务发现和连接管理,支持yaml等)

Previous2020Nextxresloader转表工具链增加了一些新功能(map,oneof支持,输出矩阵,基于模板引擎的加载代码生成等)

Last updated 4 years ago

Was this helpful?

最近给 增加了一系列改造,非常多且琐碎,这里简单记录下吧。

首先是重构了配置管理。原来是手写在代码里的,因为原来上层的 是不依赖 的,现在 既然已经依赖 了就转为 管理了。同时现在还支持YAML配置,使用 来解析YAML文件,这个库也被一些其他知名的大型项目使用了,比如 。 原来的conf/ini模式的配置也是支持的,现在加载配置的时候会尝试猜测以下配置文件是yaml还是conf/ini模式。 并且增加了统一的 YAML转 、 conf/ini转 和 指定层级配置导出到 的接口来方便使用。比较特殊的是自定义日志配置后端的接入接口有了一些小变化,问题也不大。

另外增加了统一的服务发现组件,并且增加了简单的对端管理和连接管理。并且支持自定义接入层实现,只要地址符合 协议名://地址[:端口] 这种形式即可。这些改动一方面是根据我们目前项目中一些结构和设计的变化,另一方面是为了未来可能接入 做准备。

最后是重构了构建系统,修复了一些libwebsockets、libcurl和openssl/libressl在modern cmake构建系统下的版本兼容问题,现在还会导入常用压缩库 zlib、lz4 和 zstd。另外还导入了grpc和其依赖的几个组件。可以和 里的构建系统搭配使用。

列举一下openssl相关的主要修订内容:

  • libwebsockets 会直接导入openssl的库文件,而项目中如果有其他组件使用了modern cmake中 OpenSSL::Crypto 或者 OpenSSL::SSL 这两个target会导致重复链接和依赖顺序错乱。所以我对 libwebsockets 的导出target打了patch,把直接的加密库替换成 OpenSSL::Crypto 和 OpenSSL::SSL。

  • libcurl 则是还不支持最新的openssl 的 API Level 3.0 ,所以构建的时候目前只能强制 API Level设置到 1.1.1

  • 使用到了 某些在 API Level 1.1.0及以后deprecated的API,只能通过设置 API Level 到 1.0.2 或以关掉编译openssl的 no-deprecated 选项来解决。我这里是关掉了以前编译openssl的 no-deprecated 选项。

服务发现

服务发现其实是把之前 里的 component 挪到了 中,另外增加了 服务发现组 的模块,并且支持绑定私有数据。这个目的是可以根据项目需要自定义定制化的服务发现功能。考虑到以后可能接入一些更复杂的使用场景,服务发现模块内置了一些和其他系统搭配的预留字段。比如预留了 atapp_metadata 用于可能以后接入 之类的服务治理, 预留了 atapp_area 用于可能以后支持按地域的节点亲和性。

默认的服务发现组提供了一些基本的查询策略,包含 按名字 、 按ID 、 随机 、 Round-Robin 和 一致性Hash 。整个索引构建也是 lazy-evolution 的,即当有节点变化时仅在第一次接口调用的时候才会重建索引。实现的接口在 。在我当前的项目中,自定义的 服务发现组 有4组,分别是 按type id,zone id 、 按type id 、 按zone id 和最后一个和我们当前项目场景相关的 按战斗资源版本号 。

连接管理

增加连接管理模块也是为了支持多种连接组件。原来只有内置的 连接,现在增加了一个 connector 的概念,connector可以在atapp启动前注册协议。无论是listen还是connect一个地址的时候都会按协议分发到对应的connector上去,如果正常发起了连接需要connector去保存handle,并在连接成功后调用 set_ready()。 中内置了 的connector,然后为了向前兼容,默认开启了找不到connector的时候会fallback到使用 。

连接发起是按需的,并且是和服务发现组件搭配的。当第一次对一个指定名字或者ID的节点发消息的时候, 会先新建一个 endpint 。 然后缓存这个消息,按服务发现里的信息发起连接。如果服务发现里的节点信息有配置网关,则是连向网关。如果发起连接是成功的 connector 需要保存 handle ,等发起连接成功以后需要 set_ready() 。当然也可以直接 set_ready() 表示服用已有连接或者不需要等待已经连接成功。 如果服务发现节点下线或者handle被释放,系统会自动通知pending的消息发送失败然后清理 endpint 和 handle 。整个模型关系大致如下:

关于Service Mesh

最后,希望有兴趣的小伙伴们可以一起交流。

前段时间了一些的东西,这个运维的理念现在比较火。 有个问题代理层级很多 ,我没测试他对延迟带来的影响所以这方面给它打个问号。但是以后或许某些游戏服务器也可以用这套东西,因为并不是所有的业务对对延迟有非常高的要求。现在 已经进入了Linux基金会,现在基本上也是最成熟的平台。现有的最火的 方案 和 微软最近推出的 的网络反向代理用的都是 ,而目前似乎除了tcp、udp等以外支持的协议仅有http即基于http2的 ( 支持的路由协议可以参见 的性能不咋地,生态是真滴好。

对于游戏服务器而言,要要优化性能的话有状态服务是很重要的。而现有现成的 都是对无状态服务比较友好,对有状态服务不太友好。而有状态服务需要根据某些定向发送消息,那如果不裸用http协议的话就只能用 了,目前也没有其他选择。我最早看 文档的时候,它还不支持一致性Hash,虽说现在已经支持了,但是也仅仅只能根据HTTP Header和Cookie来设置Hash策略。(文档: )。另外我还没有深入研究 目前还不知道如果服务器节点变化的话服务器进程多久能感知到,是否必须通过 API去监听这个节点变化。因为在有状态服务里,服务进程是需要感知到其他节点的状态的,因为会触发负载均衡和容灾的变化,而且需要和 层的路由分发保持一致。

其实现在现有的可以部署在 的有状态服务里,基本都是自己维护服务发现和路由转发(比如redis和etcd)。使用的网关也仅仅用于对外提供服务,对外的节点是对等的。我咨询过一些用管理有状态服务的兄弟项目组,目前还都是接入 ,然后使用 的subset功能,一个subset只部署一个节点。这样按subset分发无论什么策略都是分发到一个进程上,服务发现也是不依赖 的。还有另一种方法就是设计一个SideCar的服务进程组,专门用于协调网关收到流量都对内部服务网络的转发,内部服务之间还是走自己的服务发现和连接管理机制。我司有这种设计的组件,不过对外通信好像还是包了一层 ,目前我还没有接触到有项目组用这种方式。

上面提到的后一种方式,我后面会再预研一下看看是否能给 增加这种无状态网关功能,因为要优化性能必须得剥离掉 (的QPS大约比高1到2个数量级),还有一个麻烦的地方是 外和 内的节点通信要走 网关,但是同一组 内通信是不需要走的,这里也需要考虑网络隔离的问题和这个无状态的网关进程组要和内部的所有同 的入口节点 (atproxy) 保持连接,这里还需要解耦 中的connector和endpoint的1对N的绑定关系,改为M对N,还要考虑收敛连接。这些细节都后面再说把,不管怎么说,想要能够灵活得路由分发,目前都是需要接入 的,其实我觉得如果能够优化 的性能(不知道 是不是高消耗在压缩和加密上,不知道是否能关闭压缩和加密,因为内网一般是可信的网络,如果能剥离掉不知道吸能是否会好点)的话,直接使用 是最好的,因为这样就可以直接使用 里的一些其他的组件,比如链路跟踪,故障演练等等。所以现在的 也集成了 的构建和导入,后续我也会增加 的connector,这是目前接入 最简单快捷的方式了。

Service Mesh
Service Mesh
kubernetes
Service Mesh
Service Mesh
istio
Open Service Mesh
Envoy proxy
Envoy proxy
grpc
istio
https://istio.io/latest/docs/reference/config/networking/virtual-service/#VirtualService)。不得不说虽然
grpc
Service Mesh
grpc
istio
https://istio.io/latest/docs/reference/config/networking/destination-rule/#LoadBalancerSettings-ConsistentHashLB
istio
kubernetes
Service Mesh
Service Mesh
kubernetes
Service Mesh
Service Mesh
grpc
istio
kubernetes
grpc
libatbus
grpc
libatbus
grpc
Service Mesh
Service Mesh
Service Mesh
Service Mesh
Service Mesh
libatbus
grpc
grpc
grpc
grpc
Service Mesh
libatapp
grpc
grpc
Service Mesh
libatapp
libatbus
protobuf
protobuf
protobuf
yaml-cpp
Envoy proxy
protobuf
protobuf
protobuf
Service Mesh
atsf4g-co
grpc
atsf4g-co
libatapp
kubernetes
https://github.com/atframework/libatapp/blob/master/include/atframe/etcdcli/etcd_discovery.h
libatbus
libatapp
libatbus
libatbus
libatapp
2007-01.png