惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
B
Blog RSS Feed
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
Recent Announcements
Recent Announcements
A
About on SuperTechFans
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
Google DeepMind News
Google DeepMind News
S
Schneier on Security
S
Secure Thoughts
T
The Exploit Database - CXSecurity.com
Martin Fowler
Martin Fowler
P
Proofpoint News Feed
Security Latest
Security Latest
Jina AI
Jina AI
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Recorded Future
Recorded Future
T
Tor Project blog
有赞技术团队
有赞技术团队
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
News | PayPal Newsroom
博客园 - 三生石上(FineUI控件)
MyScale Blog
MyScale Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
Forbes - Security
Forbes - Security
D
DataBreaches.Net
人人都是产品经理
人人都是产品经理
NISL@THU
NISL@THU
C
Cisco Blogs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Google DeepMind News
Google DeepMind News
Project Zero
Project Zero
IT之家
IT之家
T
Threatpost
Cyberwarzone
Cyberwarzone
O
OpenAI News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
J
Java Code Geeks
P
Proofpoint News Feed
The Last Watchdog
The Last Watchdog
月光博客
月光博客
Latest news
Latest news
MongoDB | Blog
MongoDB | Blog
Apple Machine Learning Research
Apple Machine Learning Research

I'm OWenT

国产大模型(GLM 5.1、Kimi K2.6)真实场景效果和 Coding Plan 额度测试 新版本libatapp的连接管理——从etcd服务发现到拓扑驱动的自动重连 新版本libatbus的设计变更——从树形路由到拓扑驱动 Protobuf又一坑 - C++标准和ABI兼容性 AI真好用-给Blog主题统一加mermaid,chart.js,excalidraw,draw.io的多种引入方式支持 给内网部署Squid-通用HTTP下载缓存 UE使用CodeChecker和clang-tidy生成静态分析报告 找出UE的循环依赖 C++小协程栈和临时变量及作用域的栈溢出问题分析 游戏服务的可观测性能力建设(C++生态) 指标上报的多线程优化和多拉取源点优化 协程(libcopp)的Channel功能和CPU命中率优化 通用RPC代码生成器 实现strong_rc_ptr(比shared_ptr更快的引用计数智能指针) 手夯一个STL allocator和对象内存分析组件 std::condition_variable 的信号丢失问题 踩坑一处(GCC)STL std::async 实现BUG导致的crash问题 GCC 14的一个warning to error BUG 给xresloader(Excel导表工具)增强UE读表支持(包含蓝图,Blueprint) Opentelemetry社区在gRPC的几个链接问题(静态库和动态库混用,musl工具链,符号裁剪) Excel转表工具(xresloader)的新验证器(验证外部Excel和文本数据,唯一性和自定义规则) protobuf v22和gRPC v1.55版本升级的依赖变化和upb适配 关于protobuf近期版本(v20/v3.20+)和 gRPC v1.54版本在某些编译环境下的一些链接和编译问题 xresloader-Excel导表工具链的近期变更汇总 打通游戏服务端框架的C++20协程改造的最后一环 Opentelemetry-cpp的Logs模块标准更新(涉及近期版本:1.8-1.9的BREAK CHANGES) 给cmake-toolset和工具链(curl等)加HTTP/2和HTTP/3支持 又开新坑之 coredns 插件: nftables和filter 关于opentelemetry-cpp社区对于C++ Head Only组件单例和符号可见性的讨论小记 填个转表工具 xresloader 去年的坑(数组尾部裁剪) 集成 upb 和 lua binding 的踩坑小记 libcopp对C++20协程的接入和接口设计 再度优化GCC、LLVM、Clang、libc++、libc++abi等套件的构建脚本 游戏服务的分布式事务优化(二)- 事务管理 游戏服务的分布式事务优化(一)- Write Ahead Log(WAL) 模块 记录一些bazel适配用编译选项 测试现代化硬件C++浮点数性能和一致性 适配Boringssl和OpenSSL 3.0 近期cmake-toolset的一些适配问题 C++20 Text Formatting/fmtlib 适配问题小记 再次重构LLVM+Clang+libcxx+libc++abi+其他相关工具的构建流程 重构基于CMake的构建工具链 新版GCC和LLVM+Clang终于Release啦 折腾一下nftables下的双拨 [C++20] Module partitions和符号交叉引用(声明和实现分离) [Rust] 实现一个线程安全且迭代器可以保存的链表 基于protobuf的代码生成 几个使用protobuf中C++接口的Arena的坑 Amazon Aurora DB存储引擎论文阅读小记 xresloader转表工具链增加了一些新功能(map,oneof支持,输出矩阵,基于模板引擎的加载代码生成等) 在游戏服务器中使用分布式事务 libcopp接入C++20 Coroutine和一些过渡期的设计 libatbus 的大幅优化 nftables初体验 容器配置开发环境小计 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玩具-企业微信机器人通用服务 使用ELK辅助监控开发测试环境服务质量和问题定位 2018年的新通用伪随机数算法(xoshiro / xoroshiro)的C++(head only)实现 Webpack+vue+boostrap+ejs构建Web版GM工具 Rust的第二次接触-写个小服务器程序 理解和适配AEAD加密套件 atsf4g-co的进化:协程框架v2、对象路由系统和一些其他细节优化 协程框架(libcopp)v2优化、自适应栈池和同类库的Benchmark对比 可执行文件压缩 初识Rust 使用restructedtext编写xresloader文档 atframework的etcd模块化重构 C++的backtrace 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 重写了llvm+clang+libc++和libc++abi的构建脚本 atsf4g完整游戏工程示例|I'm OWenT atframework基本框架已经完成|I'm OWenT
近期对libatapp的一些优化调整(增加服务发现和连接管理,支持yaml等)
owent · 2020-10-04 · via I'm OWenT

blog-website

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

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

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

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

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

  • libwebsockets 会直接导入openssl的库文件,而项目中如果有其他组件使用了modern cmake中 OpenSSL::Crypto 或者 OpenSSL::SSL 这两个target会导致重复链接和依赖顺序错乱。所以我对 libwebsockets 的导出target打了patch,把直接的加密库替换成 OpenSSL::CryptoOpenSSL::SSL
  • libcurl 则是还不支持最新的openssl 的 API Level 3.0 ,所以构建的时候目前只能强制 API Level设置到 1.1.1
  • grpc 使用到了 某些在 API Level 1.1.0及以后deprecated的API,只能通过设置 API Level 到 1.0.2 或以关掉编译openssl的 no-deprecated 选项来解决。我这里是关掉了以前编译openssl的 no-deprecated 选项。

服务发现

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

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

连接管理

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

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

2007-01.png

关于Service Mesh

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

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

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

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

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