自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

范安崇的博客

不积跬步,无以至千里;不积小流,无以成江海。

  • 博客(294)
  • 收藏
  • 关注

原创 使用 Lua 协程处理异步回调函数

通过封装提供 go 函数,可以像 Go 语言一样,提供简易的启动协程界面项目的所有异步均可以封装提供 co_xxx 函数,使得需要回调的 API 均可以顺序编写代码。例如co_sleep等等。

2024-04-14 11:32:14 508

原创 EmmyLuaDebugger介绍与源代码分析

/ 略if (!return 1;可以从以上代码中,学习到如何编写一个 Lua 自定义的模块。

2024-04-06 22:23:53 223

原创 离线 Linux 开发环境搭建

虚拟机可以使用 Windows 自带的 Hyper-V。内网需要啥软件,外网虚拟机下载好安装包,拷贝至内网安装。思路,内网和外网均创建一个环境一样的虚拟机。通常受限网络,网络模式更为复杂。无法连接外面的内网开发。

2024-04-05 11:06:34 523

原创 一种交易行的设计方案

交易行功能可以划分为 3 块:以上功能实现,主要有 2 个难点:为了解决数据一致性问题,这里引入 + 机制:实现细节如下:Redis 中一个事务,至少包括以下信息:,至少包括以下信息:事务的核心在于提交事务是原子的。即提交的一瞬间,能保证所有数据同时更改生效这里设计提交事务的操作为:该操作可以成功提交事务的原因如下:本地进程,均加个定时器,定期检查:本地进程,均加个定时器,定期检查:缺点,是在事务提交成功后,再应用数据。因此数据可能出现负数解决方案 2 种:优点事务细节分解步骤如下:根据以上步骤,很容易设计

2024-04-02 12:30:30 936

原创 EmmyLua 远程调试 Lua 代码

项目中用到 LuaJIT ,正常思路静态链接了 LuaJIT 库。这导致了 EmmyLua 不能用。可以设置 export LD_LIBRARY_PATH=/your_so_path。EmmyLua 可以调试 C++ Lua 混合编程的项目。先启动项目要调试的服务;程序动态链接,需要寻找 so。

2024-03-28 18:23:07 201

原创 思考(九十四)跨服跨区消息处理

future 拿到结果,不会阻塞运行它的线程(协程遇到 IO ,先会被切走;这样,1 区 bfserver1 上的某个玩家 PA,它的公会是 GC ,先与它已经被分配在 1 区 bfserver2。这样,remote_call_v2 函数,对逻辑代码隐藏了架构细节。,很多系统,同样需要消息路由,也会有开头的 2 个问题。先有以上功能,且跑稳定后,可以再讨论进一步优化内容。没有什么黑魔法,就是通过路由表,做消息转发。因此,把角色登录中的分配资源的模块抽象出。接下来,顺着这里的思路,继续深挖。

2024-03-23 14:49:20 57

原创 iguana 库 C++ 反射原理

通过定义 REFLECTION 宏,在编译期,生成结构体/类的元数据信息字段名列表字段地址列表将字段地址列表做成 std::tuple将该 std::tuple 做成 std::map , 其 key 为字段名,其值为 std::variant 类型字段地址不同格式的序列化、反序列,最终要通过字段名给对象的字段赋值或取值通过 std::visit - std::variant 编程技巧使用函数类型特化方式,避免 if else 这种类型分支判断以上。

2024-03-16 13:49:19 1231

原创 doctest 中的编程技巧

官方介绍: The fastest feature-rich C++11/14/17/20/23 single-header testing framework。无独有偶, C++ 无栈协程也是一个 if else 分支组成。能多次重入,每次只执行一部分代码。从这个角度看,它们的核心编程技巧一样的。等等,就可以扩展逻辑功能。

2024-03-13 19:33:11 773

原创 进程间传递 SQL 文的方法

这样 2 个进程间传递 SQL 文还可以进一步适配具体项目,做调整。通常进程间传递数据,可以定义协议。因为是字符串 SQL 语句,因此可以方便的从一个进程传递到另外一个进程。有时,生成 SQL 文的进程和处理 SQL 文的进程,可能不是同一个。因为项目中使用 protobuf ,那么可以使用它,减少重复构造轮子。这里就涉及到如何高效的把 SQL 文从一个进程传递给另外一个进程。单步调试了下 go-sql-driver/mysql 的简易例子。结果,go-sql-driver/mysql 库也无。

2024-02-22 12:21:59 987

原创 简易告警去重设计

方案二:每个服通过 Redis 共享 alarm 信息,自己处理去重。方案一:把告警信息打到 alarm 服,让 alarm 服去重处理。因为 alarm 去重逻辑很简单,方案一显得稍重,需要额外维护服务。粗暴的处理告警,通常会导致刷屏,进而麻木,最后起不到告警的作用。开发环境、生成环境,通常会有很多种告警,用来及时发现问题。这里设计一个简单的去重机制。

2024-02-07 12:27:03 272

原创 protobuf-go pragma.go 文件介绍

自己,其他第 3 方是没办法实现。目录下,对第 3 方不可见。因为第 3 方没有办法实现。接口的第 3 方扩展实现。下面依次说明实现原理。

2024-01-26 23:13:25 605

原创 网络卡问题排查手段

因为遇到这种情况,服务通常是不健康的,线上监控系统通常就已经在告警了。笔者就遇到过这样的问题,最后排查下来,只有韩国棒子用某运营商业务的手机网络出问题。对后端来说,网络卡了问题,本身很难去排查,因为是 App 通过互联网连接服务。如果能让玩家直观的感受到是网络卡而不是其他,这样上报的 bug 就更有针对性。根据这些信息,聚合成图表,对下事发事件,直接就可以排查是否是这个问题。开发过程中,通常就会解决掉了。比如,游戏画面上显示 Ping 延迟,就是一个好方法。特别是出海的游戏,遇到网络问题,首先就是拨测下。

2024-01-20 14:40:53 729

原创 2D 物理引擎调研及游戏中的应用

关注的功能, 2 个库都有。而 Chipmunk2D 的 Golang 版本,目前还积极维护,因此选择 Chipmunk2D。如果是后端需要经常寻路的玩法(通常非常少),那么需要重新选择引擎了,比如可以选用 recastnavigation。Box2D Chipmunk2D 均不具备寻路功能,因为内部使用 AABB tree 组织数据的,便于高效查询。与场景相关的范围搜索、碰撞检测,理论上自己写也优化不出经典的 2D 物理引擎实作了。它们都是基于 AABB 包围盒的空间搜索优化算法。

2024-01-19 11:10:02 408

原创 Golang 使用 AST 获取方法和参数名以及应用举例

有了方法、参数名,加上反射,那么就可以方便生成胶水代码,自动集成进 HTTP 、 gRPC 等。可以把这些信息写入 map 声明,这样代码里就有类似反射参数的功能了。还是基于上面的获取的方法、参数名的 map 实例信息,就可以展开了。在做一些自动生成的代码工作时,有时需要知道方法以及对应的参数名。可以通过 AST 事先获取方法的参数名。如果仅是方法,利用反射机制就可以解决。而参数名,程序编译后,已经丢失。

2024-01-13 15:15:56 663 1

原创 Ubuntu 虚拟机挂接 Windows 目录

如果没有这个参数,Ubuntu 下会无法更改文件目录的权限,导致 chmod 命令执行无效。我这里偷懒直接直接 Everyone ,也可以指定用户啥的。这对于 git 库下的文件会导致都有 diff 差异。然后把刚才的 mount 命令写到。首先 Windows 下共享目录。Ubuntu 默认没开启。这里打印的是已开启的。

2024-01-06 15:43:39 609

原创 思考(九十三):网络加速器简单实现设计

【代码】网络加速器简单实现设计。

2023-12-26 11:15:04 128

原创 go grpc-go 连接变动,导致全服 gRPC 重连 BUG 排查

在构建 resolver.Address 时,字段 Attributes 添加了 NodeNumber 属性;addrConn.tryUpdateAddrs 内用的是 DeepEqual ,这里 Addresses 字段又是起作用的。项目中遇到一个问题,每当有节点变更时,整个 gRPC 网络连接会重建。即,不考虑属性字段内容,即只要 ip port 一样就是同个连接。加了 Address.Equal 统一了 Address。操作的定义(说明官方也发现了这个问题 = =|)因此,项目中的代码还是写错的。

2023-12-20 17:59:21 354

原创 Kubernetes Pod 网段与主机内网网段互通

查看 pod busybox-deployment-86d4bf5956-d4xlv 的 ip : 10.244.0.61。主机 ping pod busybox-deployment-86d4bf5956-d4xlv。pod busybox-deployment-86d4bf5956-d4xlv ping 主机。开发环境部署 K8s 后,服务器会部署在 K8s 里,通常 Pod 网段被隔离,主机无法访问。实际开发需求,往往需要当前开发调试的服务主机本地部署,其他服则在 K8s 内。

2023-12-16 21:47:45 378

原创 Kubernetes 开发环境使用 Helm Charts 快速安装开源软件

Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata,以便于应用程序的分发。这是 helm 安装,唯一需要自己处理的地方,要给 Redis 分配挂接目录的资源。开源社区提供了 Helm Chart Hub ,方便共享 Helm Chart。上面 Redis 建立了一个 1 master 3 slave。然后先删掉之前安装的(安装阶段随意,不需要考虑数据安全等问题)以下目录,可以实现建好,并有写权限。

2023-12-16 14:51:22 235

原创 Kubernetes sample-controller 例子介绍

sample-controller 是 K8s 官方自定义 CDR 及控制器是实现的例子通过使用这个自定义 CDR 控制器及阅读它的代码,基本可以了解如何制作一个 CDR 控制器网上有更好的文章,说明其运作原理:官方文档: https://kubernetes.io/zh-cn/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/controller.go 关键代码分析Informer 监听事件fooI

2023-12-02 21:33:33 123

原创 Kubernetes 使用插件扩展 kubectl

看 Readme.md 中有介绍,该库是 K8s 官方提供的与。

2023-12-01 12:29:03 294

原创 Kubernetes v1.28.4 安装笔记

成为 init 后,会有不少信息输出,按这些信息提示操作。Kubernetes v1.28 默认已经是。K8s 集群的每个 node 上都要安装的。

2023-11-30 20:18:22 295

原创 思考(九十二):DBProxy实现多级存储和事务处理

加载时,可以不加载到 Redis (看作一种优化)。游戏逻辑不像静态网页应用,数据很快就会被业务逻辑修改,然后写 Redis 成热数据。

2023-11-05 00:00:45 390

原创 Gossip - hashicorp/memberlist 介绍(一):基本定义

根据配置 BindAddrs 字段,同时在这些地址上监听 TCP UDP 端口。本系列介绍 hashicorp/memberlist 相关实现。是 Gossip 协议的一个 Golang 语言实现版本。集群,平时节点间,不会有 socket 连接。先从一些基本定义开始。

2023-07-30 21:29:14 378

原创 Nats 消息总线相关介绍(五):发送消息相关

函数内,通过 Sublist.match 获取 SublistResult;进而遍历 psubs 或随机 qsubs ,使用 client 发送。在 INFO 命令、 SUB 命令、 RS+ 命令,处理过程种,对应填充了不同连接对象。Nats 节点均有所有订阅信息,存在 Sublist 中。

2023-07-10 22:36:16 336

原创 Nats 消息总线相关介绍(四):Topic 相关

通过 INFO 命令,一个节点加入 Nats 集群后,订阅信息会集群内全量同步。

2023-07-10 22:34:57 305

原创 Nats 消息总线相关介绍(三):协议相关

Nats 为了高效解析字符串协议,因此用了字典树解析的方式,依次遍历字符,进到具体协议的分支里。Nats 使用的是字符串协议,有协议头、协议体、协议结尾符, 3 部分字符串组成。协议定义在 parser.go:54 - parser.go:132。协议解析在 client.parse(parser.go:134)协议与协议解析相关,均在 parser.go 文件里。

2023-07-10 22:33:24 287

原创 Nats 消息总线相关介绍(二): 拓扑相关

普通节点,连接初始路由节点,函数 Server.connectToRoute 内,会发送 INFO 消息给初始路由节点。INFO 消息处理,会把该 INFO 消息进一步广播给所有其他节点。Nats 启动时,启动参数 routes 指定了初始路由节点。每个节点,都会去连接所有 routes 指定的路由节点。如果有连接到这个监听端口,则会下发 INFO 协议。即最终,Nats 集群内,都是路由节点,网状互连。其他节点进而把它作为路由节点进行连接。用于路由节点的监听端口。

2023-07-10 22:31:27 130

原创 Nats 消息总线相关介绍

即,所有 Nats 节点,均知晓所有 Topic 的订阅信息。Topic 在 Nats 内部起路由转发规则作用。Topic 订阅信息,由路由节点维护。Nats 内部节点有不少类型。

2023-07-10 22:26:57 308

原创 dnsmasq 调优与压测

修改 /etc/dnsmasq.conf ,然后重启服务。dnsmasq 是一个 dns 服务器。可以使用 dnsperf 工具。

2023-05-13 16:47:47 584 1

原创 UnrealGameSync 介绍与部署

把 UnrealGameSync.sln 里所有 .net sdk 版本改为 5.0 后,再重新编译。它能醒目的告知团队成员,哪些版本是可以使用的,极大的提高生产力。UnrealGameSync 有图中的,划线的 5 部分组成。编译完,点击 exe ,如果提示 .net 环境未安装。在多人合作开发的大团队中,每时每刻都有成员在提交版本。使用 UE5 生成 1 个项目,提交到 P4 仓库。要找到一个可用版本,通常是困难的。CI/CD 流程中,也可以使用。可以使用类似以下命令,查看。对版本设置状态、标签。

2023-03-26 20:39:58 1949

原创 vscode proto 格式化配置(备忘)

【代码】vscode proto 格式化配置(备忘)

2023-01-13 17:25:21 752

原创 zsh 安装(备忘)

修改 .zshrc ,设置: ZSH_THEME=“powerlevel10k/powerlevel10k”配置,终端输入: p10k configure。

2022-12-27 20:17:31 175

原创 思考(九十一):C++线上内存泄漏检测机制

常见的内存泄漏分析器,如: tcmalloc heap-profiler 、 valgrind 、 asan 、 bcc/memleak 等,要么比较重、要么需要 -O0 ,没法在线上使用。笔者使用的是 tcmalloc ,这里介绍下 tcmalloc 的 hook 方法。这样,就可以在 malloc/free 时,处理一些自己的埋点逻辑。有了以上的技术支持,同时需要考虑线上性能问题,需要轻量处理。而线上的内存泄漏问题,没有分析工具,会造成排查问题困难。因为没有合适的工具,导致排查问题,没有方向。

2022-12-18 21:17:57 618 1

原创 思考(九十):熔断器介绍

gobreaker star 数虽然多些,但是看过实现,比 circuitbreaker 差不少。生活中,当用电电流过载时,直接熔断,避免火灾等事故的发生。也使用了 circuitbreaker 包,因此质量是可以保证的。软件开发中,也需要引入熔断器,避免服务器过载。

2022-12-11 17:12:20 592

原创 VSCode dlv 远程调试(备忘)

【代码】VSCode dlv 远程调试(备忘)

2022-11-26 15:04:29 342

原创 gdb 调试(备忘)

在 ~/.gdbinit 中,添加 gdb-stl-views 脚本。通常代码使用智能指针等,编码很灵活,不一定用全局容器去维护。可以事先对比较重要的对象,在构造时, log 其地址。会造成 gdb 调试时,得到想要的对象信息比较难。这样, gdb 调试时,随时可以打印它,方便调试。gdb 中,执行命令。

2022-11-26 11:52:27 636

原创 思考(八十九):WAL 实现

WAL(Write Ahead Log) 预写日志,是数据库系统中常见的一种手段,用于保证数据操作的原子性和持久性。甚至可以在游戏框架层: DB 框架级别、事务框架级别,引入 WAL 重底层保证其可靠性。在游戏开发中,某些重要模块,如邮件、充值、商城等,都可以引入 WAL 保证其可靠性。

2022-09-18 12:58:52 479

原创 Etcd 2G 磁盘容量问题(备忘)

上面粗暴执行 compact ,遇到 ttl 已为 0 的 KV 直接被删除。但是有时,某些应用,希望 Etcd 2G 故障时,不要粗暴马上清除。因此,最好不要手动执行 compact 到最新 revison ,或者 compact [ revison - N ] 版本。网上搜了下, Etcd 后端存储 boltdb 超过 2G 容量,会提示。异常,导致 Etcd 无法正常提供服务。,保留最近 1 小时历史记录。

2022-09-15 23:31:01 460

原创 Ectd Raft 模块介绍(二):目录文件介绍

Etcd Raft 模块代码位于 Etcd 源代码库的 raft 目录下.├── log.go├── quorum├── raftpb。

2022-09-12 21:49:48 330

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除