{"id":15110255,"url":"https://github.com/bobohume/gonet","last_synced_at":"2025-05-15T14:07:36.581Z","repository":{"id":39615995,"uuid":"123211880","full_name":"bobohume/gonet","owner":"bobohume","description":"go分布式服务器，基于内存mmo","archived":false,"fork":false,"pushed_at":"2024-07-14T14:04:10.000Z","size":16951,"stargazers_count":1557,"open_issues_count":13,"forks_count":354,"subscribers_count":70,"default_branch":"master","last_synced_at":"2025-05-15T14:07:23.698Z","etag":null,"topics":["cluster","etcd","game","game-framework","gogame","golang","golang-server","gommo","mmo","nats","orm","rpc","server","snowflake"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bobohume.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-02-28T01:35:36.000Z","updated_at":"2025-05-08T09:29:57.000Z","dependencies_parsed_at":"2023-02-18T03:31:07.831Z","dependency_job_id":"748f2986-78ff-4498-b07d-a6dfe480e5f1","html_url":"https://github.com/bobohume/gonet","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobohume%2Fgonet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobohume%2Fgonet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobohume%2Fgonet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobohume%2Fgonet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bobohume","download_url":"https://codeload.github.com/bobohume/gonet/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254355335,"owners_count":22057354,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cluster","etcd","game","game-framework","gogame","golang","golang-server","gommo","mmo","nats","orm","rpc","server","snowflake"],"created_at":"2024-09-25T23:43:14.841Z","updated_at":"2025-05-15T14:07:31.526Z","avatar_url":"https://github.com/bobohume.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# go-server\ngonet 游戏服务器架构。\n\n框架优势\n## actor\n每个Actor都是一个独立的计算实体，Actor之间不共享数据，各个Actor只能操作自己的数据，所有的交互全部通过传递消息的方式进行，可以有效避免共享数据带来的并发竞争问题。\n\n## virtual actor\n降低分布式开发的复杂性，Actor总是存在，即不用关心代码在那个进程上运行，比如gm可以运行任一模块org,rank,activity具体模块actor怎么运行参考下面的stub。\n\n## 微服务\nstub模型微服务,解决微服务每个模块是不同的二进制,导致部署麻烦,新加进程会很繁琐,stub更像是插件模式,启用不同模块调用不同的微服务,在rpc通信上也无需区别rpcorg或者rpcrank,\n只需要一个rpcgm即可\n\n## 玩家actor\n每个玩家一个actor,解耦,模块耦合性弱,lease一致性保证分布式一致性问题\n\n## orm\n区别gorm,方便开发,玩家存储类似文档,玩家内存改变了定时同步给db,可以为各种嵌套结构\n\n## 高可用\n无单点服务,raft一致性同步元数组(mailbox(id-\u003eip+port),stub),stub保证virtual actor高可用模式。\n出故障影响部分玩家，高可用在lease内不可用。\n\n## 分布式\n参考下图的stub高可用(hash一致性)\n以及player的mailbox(lease一致性)\n\n## rpc\nrpc模块脱离传统的注册-回调模式，只需要继承actor即可，actor的成员就是消息处理\n\n## uuid\n采用snowflake + etcd动态分配机器码\n\n## 时间轮\n    优势\n    5级时间轮性能更佳O(1)\n    对比timer\n    go的定时器是大小堆,对高精度10毫秒定时器会吃掉大部分cpu\n    \n## 分布式消息队列\n微服务，微服务之间使用分布式消息队列\n\n\n## hotfix(进阶版)\n不需要数据分离,应用更广泛的textcode jmp\n\n## 属性同步(进阶版)\n基于内存对比的属性同步,不需要写orm,a.b=1自动存盘,自动同步\n\n## rpc(进阶版)\n类似grpc,写好回调函数,无需定义proto结构,自动生成rpc代码,无需build\n如回调函数是:func (p *PlayerMgr) PlayerOnUnRegister(head rpc.RpcHead, playerId int64)\n自动生成代码,rpc发起就直接rpcgame.PlayerMgr.PlayerOnUnRegister(rpc.RpcHead{SendType: rpc.SEND_LOCAL}, p.PlayerId)\n\n## 进阶版有偿提供联系群主\n\n## 流程图\n流程图替代一些配表,比如ai,目前在开发一个web段的流程图编辑器\n\n## mailbox\n    actor之间消息队列采用mpsc的mailbox \n    优势\n    actor适合mpsc的模式,消息队列满足邮件思想\n    对比channel\n    1.channel弊端在队列满了,投递消息会阻塞,假如actor处理过慢,大家都等着,谁也别想跑\n\n    2.性能在多生产者消费者急剧下降(内部是锁)\n    基准测试\n    i7 10700 2.9GHZ 16核 执行10万次生产和消费         \n    channel         \n    BenchmarkChanPushPop/100000_1-16             252           4715405 ns/op\n    BenchmarkChanPushPop/100000_2-16             174           6881893 ns/op\n    BenchmarkChanPushPop/100000_4-16             180           6635532 ns/op\n    BenchmarkChanPushPop/100000_8-16             142           8440178 ns/op\n    BenchmarkChanPushPop/100000_16-16            129           9312717 ns/op            \n    mailbox             \n    BenchmarkPushPopActor/100000_1-16            252           4748732 ns/op\n    BenchmarkPushPopActor/100000_2-16            205           5818782 ns/op\n    BenchmarkPushPopActor/100000_4-16            278           4348560 ns/op\n    BenchmarkPushPopActor/100000_8-16            297           3986121 ns/op\n    BenchmarkPushPopActor/100000_16-16           304           3839012 ns/op\n\n[WIKI](https://github.com/bobohume/gonet/wiki)\n\n# 交流\n\nQQ群:950288306\nQQ群2:991398832\n\n# 服务器架构如下：\n![image](框架.jpg)\n\n# gm stub\n![image](gm_stub.jpg)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbobohume%2Fgonet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbobohume%2Fgonet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbobohume%2Fgonet/lists"}