ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

goim v2.0:基于 Golang 的高性能 IM 与实时推送服务集群实战指南

goim v2.0:基于 Golang 的高性能 IM 与实时推送服务集群实战指南 后端即时通讯微服务【免费下载链接】goimgoim项目地址https://gitcode.com/gh_mirrors/go/goim点击查看免费下载goim 是一个用纯 Golang 编写的即时通讯IM服务端及实时推送集群支持单推、多推、房间推送与全量广播并内置心跳、鉴权、多协议接入与基于 Kafka 的异步推送链路。本文以项目根目录 README.md 为主线结合仓库内源码与配置完整讲解 goim 的特性、架构、构建启动、配置项、依赖环境、客户端协议、推送 API 与官方基准测试数据帮助读者在真实业务中快速部署并深入理解其工作原理。核心特性一次看懂 goim 能做什么README.md 将 goim v2.0 的特性归纳为以下几点这些特性全部可以在仓库源码中找到对应实现轻量级、高性能、纯 Golang服务端全部由 Go 实现internal/comet、internal/logic、internal/job三个模块不依赖任何重量级框架灵活的推送粒度支持单个推送PushKeys、多个推送PushMids、房间推送PushRoom以及全量广播PushAll对应实现见 internal/logic/push.go一键多订阅者单个 Key用户可以挂载多个订阅连接可通过配置限制最大订阅者数量对应接入层 internal/comet/channel.go完整的心跳机制支持应用层心跳、TCP KeepAlive 与长连接心跳对应协议指令OpHeartbeat见 api/protocol/operation.go安全鉴权未授权的用户无法订阅消息认证指令OpAuth/OpAuthReply负责连接鉴权多协议接入支持 WebSocket、TCPREADME 同时提及 HTTP 长轮询场景可水平扩展的架构comet接入层与 logic逻辑层均为无状态/可动态扩容模块job 可随 Kafka partition 扩展基于 Kafka 的异步推送logic 将推送消息写入 Kafkajob 消费后路由到对应 comet实现推送与业务解耦。系统架构comet、logic、job 三模块如何协同goim v2.0 采用三层架构三个可执行程序各自独立部署、通过 Discovery 服务发现相互协作comet接入层负责维持客户端长连接。它启动 TCP默认:3101与 WebSocket默认:3102可开 TLS:3103监听端口通过Bucket数据结构管理海量 Channel。从 internal/comet/server.go 可以看到NewServer会按配置创建Bucket.Size个 Bucket并通过 cityhash 将订阅 Key 均匀哈希到不同 Bucket 中实现连接的水平切分。每个 Bucket 内部又维护多个 Room 与多路广播协程见 internal/comet/bucket.go配合 internal/comet/ring.go 的环形缓冲区实现高吞吐收发logic逻辑层无状态业务层对外提供 HTTP 推送/查询接口默认:3111与 gRPC 服务默认:3119负责鉴权、在线状态维护、Redis 存储与消息路由决策job推送任务层作为 Kafka 消费者监听推送 topic默认goim-push-topic通过 Discovery 实时感知 comet 节点列表把消息投递到目标 comet。消费与重新平衡逻辑见 internal/job/job.go。三个模块启动时都会将自己注册到 bilibili Discovery注册逻辑见 cmd/comet/main.go 等入口文件comet 还会周期性上报连接数conn_count与 IP 数ip_count等元数据供 logic 完成负载均衡与节点发现。快速上手从构建到启动构建goim 提供了完整的 Makefile见 Makefile一条命令即可完成构建make buildbuild目标会执行以下动作清空并创建target/目录、将三个示例配置复制为target/comet.toml、target/logic.toml、target/job.toml然后分别编译出target/comet、target/logic、target/job三个二进制。也可以通过make test运行全量单元测试go test -v ./...。启动提供了两种启动方式。方式一是使用 Makefile 的run/stop目标后台运行并分别输出到target/comet.log等日志文件make run make stop方式二是手动nohup启动分别指定各自配置文件与运行参数注意三个进程必须带一致的region/zone/deploy.env参数comet 与 logic 还需携带weight负载权重comet 额外需要-addrs声明对外地址nohup target/logic -conftarget/logic.toml -regionsh -zonesh001 -deploy.envdev -weight10 21 target/logic.log nohup target/comet -conftarget/comet.toml -regionsh -zonesh001 -deploy.envdev -weight10 -addrs127.0.0.1 21 target/comet.log nohup target/job -conftarget/job.toml -regionsh -zonesh001 -deploy.envdev 21 target/job.log 提示README 示例中三个进程的日志都写到了target/logic.log这是文档中的笔误实际运行时建议参照 Makefile 的run目标为每个进程使用独立的日志文件便于排查问题。运行环境与命令行参数goim 的所有运行参数都可以通过命令行 flag 或环境变量两种方式注入两者优先级以 flag 为准实现见 internal/comet/conf/conf.go 与 internal/logic/conf/conf.goenv: export REGIONsh export ZONEsh001 export DEPLOY_ENVdev supervisor: environmentREGIONsh,ZONEsh001,DEPLOY_ENVdev go flag: -regionsh -zonesh001 -deploy.envdev常用 flag 及其含义如下环境变量形式REGION/ZONE/DEPLOY_ENV/WEIGHT/ADDRS/OFFLINE/DEBUGFlag默认值说明-conf各模块的*-example.toml配置文件路径-region环境变量REGION区域标识如sh-zone环境变量ZONE可用区标识如sh001-deploy.env环境变量DEPLOY_ENV部署环境如dev/prod-host机器 hostname节点 hostname作为 comet 的 serverID-weight环境变量WEIGHT负载均衡权重comet/logic-addrs环境变量ADDRS对外公网地址列表comet-offline环境变量OFFLINE是否标记节点下线comet-debug环境变量DEBUG开启调试日志comet启动后comet、logic、job 都会监听系统信号收到SIGQUIT/SIGTERM/SIGINT时依次完成注销服务、gRPC GracefulStop、资源关闭与日志 Flush 后优雅退出见 cmd/comet/main.go。配置详解三份示例配置逐项解读README 明确指出“可以通过查看target/comet.toml、logic.toml、job.toml中的注释来理解配置含义”仓库根目录下即提供了三份可直接使用的示例配置。下面结合配置结构体定义逐项说明。comet 配置cmd/comet/comet-example.toml[discovery] nodes [127.0.0.1:7171] [rpcServer] addr :3109 timeout 1s [rpcClient] dial 1s timeout 1s [tcp] bind [:3101] sndbuf 4096 rcvbuf 4096 keepalive false reader 32 readBuf 1024 readBufSize 8192 writer 32 writeBuf 1024 writeBufSize 8192 [websocket] bind [:3102] tlsOpen false tlsBind [:3103] certFile ../../cert.pem privateFile ../../private.pem [protocol] timer 32 timerSize 2048 svrProto 10 cliProto 5 handshakeTimeout 8s [whitelist] Whitelist [123] WhiteLog /tmp/white_list.log [bucket] size 32 channel 1024 room 1024 routineAmount 32 routineSize 1024配置项说明字段定义见 internal/comet/conf/conf.go配置节关键参数作用discoverynodesDiscovery 服务地址列表用于服务注册与发现rpcServeraddr/timeout对外 gRPC 服务监听地址默认:3109与超时rpcClientdial/timeoutcomet 调用 logic 的 gRPC 拨号与请求超时tcpbindTCP 监听端口列表支持绑定多个端口sndbuf/rcvbuf为读写缓冲字节数reader/writer为收发协程数readBuf/writeBuf为缓冲通道容量readBufSize/writeBufSize为单缓冲大小websocketbind/tlsOpen/tlsBindWebSocket 监听端口tlsOpentrue时启用 TLS证书文件取自certFile与privateFileprotocoltimer/timerSize定时器数量与大小svrProto/cliProto为服务端/客户端协议缓冲池容量handshakeTimeout为握手超时whitelistWhitelist/WhiteLog推送白名单按 mid 配置与白名单日志路径由comet.InitWhitelist加载bucketsizeBucket 数量影响连接哈希分片粒度与并发度channel/room为 Channel、Room 初始 map 容量routineAmount/routineSize为每个 Bucket 内的广播协程数量与消息通道容量logic 配置cmd/logic/logic-example.toml[discovery] nodes [127.0.0.1:7171] [regions] bj [北京,天津,河北,山东,山西,内蒙古,辽宁,吉林,黑龙江,甘肃,宁夏,新疆] sh [上海,江苏,浙江,安徽,江西,湖北,重庆,陕西,青海,河南,台湾] gz [广东,福建,广西,海南,湖南,四川,贵州,云南,西藏,香港,澳门] [node] defaultDomain conn.goim.io hostDomain .goim.io heartbeat 4m heartbeatMax 2 tcpPort 3101 wsPort 3102 wssPort 3103 regionWeight 1.6 [backoff] maxDelay 300 baseDelay 3 factor 1.8 jitter 0.3 [rpcServer] network tcp addr :3119 timeout 1s [rpcClient] dial 1s timeout 1s [httpServer] network tcp addr :3111 readTimeout 1s writeTimeout 1s [kafka] topic goim-push-topic brokers [127.0.0.1:9092] [redis] network tcp addr 127.0.0.1:6379 active 60000 idle 1024 dialTimeout 200ms readTimeout 500ms writeTimeout 500ms idleTimeout 120s expire 30m配置项说明字段定义见 internal/logic/conf/conf.goregions区域-省份映射表用于按用户地域路由/加权分配 comet 节点node节点信息模板defaultDomain/hostDomain为域名配置tcpPort/wsPort/wssPort与 comet 各协议端口对应heartbeat/heartbeatMax为下发给客户端的心跳周期与最大尝试次数regionWeight为跨区域权重系数backoff客户端连接失败时的指数退避参数maxDelay最大延迟秒、baseDelay初始延迟、factor增长因子、jitter抖动系数rpcServer/rpcClient/httpServergRPC 服务:3119、gRPC 客户端与 HTTP 服务:3111的监听与超时配置kafka推送 topic 与 broker 地址列表redis在线状态与 Key 映射存储expire 30m表示在线记录的过期时间active/idle为连接池最大活跃/空闲连接数。job 配置cmd/job/job-example.toml[discovery] nodes [127.0.0.1:7171] [kafka] topic goim-push-topic group goim-push-group-job brokers [127.0.0.1:9092]job 的配置最为精简discovery.nodes用于发现 comet 节点kafka节指定消费的 topic、消费者组group与 broker 列表。job 通过sarama-cluster以消费者组方式消费见 internal/job/job.gotopic 的 partition 数量即决定了 job 的可扩展上限。外部依赖Discovery 与 Kafkagoim v2.0 有两个强依赖README 专门列出Discoverybilibili discovery默认地址127.0.0.1:7171承担服务注册与发现职责。comet 与 logic 启动时通过naming.Newresolver.Register注册 gRPC 服务见 cmd/logic/main.gojob 则通过dis.Build(goim.comet)监听 comet 节点变更见 internal/job/job.goKafka异步推送的消息队列。logic 收到推送请求后写入 Kafka topicjob 作为消费者取出PushMsgprotobuf 序列化并路由到对应 comet。这条链路保证了推送高峰期的削峰与解耦。客户端通讯协议与推送 APIcomet 客户端协议comet 支持 WebSocket 与 TCP 两种客户端协议完整定义见 docs/proto.md。WebSocket请求地址为ws://DOMAIN/sub采用 JSON Frame请求与返回结构一致{ ver: 102, op: 10, seq: 10, body: {data: xxx} }其中ver为协议版本号op为指令seq为序列号与响应一一对应body为授权令牌。TCP请求地址为tcp://DOMAIN采用二进制协议包结构为包长度int32 大端 包头长度int16 大端 版本号int16 大端 操作指令int32 大端 序列号int32 大端 body长度 包长度 - 包头长度。指令对照表详见 api/protocol/operation.go指令说明0/1握手 / 握手回复2/3客户端心跳 / 服务端心跳回复4/5发送消息 / 发送消息回复下行消息7/8认证 / 认证回复14/15订阅 / 订阅回复16/17退订 / 退订回复HTTP 推送 APIlogic 对外暴露完整的 HTTP 推送与在线查询接口详见 docs/push.md。统一返回格式为 JSON错误码约定OK 0、RequestErr -400、ServerErr -500。主要接口如下接口方法说明/goim/push/keysPOST按 Key 列表推送参数operation、keysbody 为消息内容/goim/push/midsPOST按用户 mid 列表推送参数operation、mids/goim/push/roomPOST按房间推送参数operation、type房间类型、room房间 ID/goim/push/allPOST全量广播参数operation、speed推送速率限制/goim/online/topGET查询在线人数 Top 房间参数type、limit/goim/online/roomGET查询指定房间在线人数参数type、rooms/goim/online/totalGET查询总连接数与 IP 数返回conn_count、ip_count/goim/nodes/weightedGET获取加权后的节点信息域名、端口、心跳参数、退避策略供客户端选择接入节点/goim/nodes/instancesGET获取全部 comet 实例信息region、zone、地址、连接数、权重等元数据推送请求示例/goim/push/keysPOST /goim/push/keys?operation5keyskey1,key2 Body: {test:1} response: { code: 0 }这些接口分别映射到 internal/logic/push.go 中的PushKeys、PushMids、PushRoom、PushAll实现最终经 Kafka 交给 job 异步分发。示例客户端仓库提供了可直接运行的示例WebSocket 客户端examples/javascript/client.js含 examples/javascript/index.html 网页演示展示如何连接 comet、完成握手/认证并收发消息服务端示例examples/javascript/main.go 演示服务端调用 logic 推送接口第三方 SDKREADME 同时收录了 Android 与 iOS 的社区 SDK 入口可作客户端参考。官方基准测试README 记录了官方在单台服务器上完成的压测数据详细中文报告见 docs/benchmark_cn.md英文版见 docs/benchmark_en.md压测环境1 台实例CPU内存OSIntel(R) Xeon(R) CPU E5-2630 v2 2.60GHzDDR3 32GBDebian GNU/Linux 8压测场景项目数值在线连接数1,000,000压测时长15 分钟广播推送速率40 条/秒房间广播推送消息{test:1}接收统计方式每秒采样 1 次共 30 次资源占用项目数值CPU2000% ~ 2300%内存14GBGC 暂停504ms网络入向 450MBit/s出向 4.39GBit/s压测结果消息接收速率达到35,900,000 条/秒。以上数据为项目官方 README 记录的基准测试结果实际性能取决于机器规格、网络环境与配置调优请以自建压测为准。许可协议goim 基于MIT License开源见根目录 LICENSE可自由用于商业与非商业项目。需要说明的是v2.0 版本同时依赖 bilibili Discovery 与 Kafka 两个外部服务部署前请先准备这两套环境Kafka 快速安装可参考 scripts/kafka.sh 与 scripts/zk.sh。从特性梳理、架构拆解到 Makefile 构建、三份 TOML 配置逐项解读、协议指令与 HTTP 推送接口再到官方压测数据本文已完整覆盖 README.md 的全部核心内容并辅以仓库源码级佐证。按照本文步骤搭建 Discovery 与 Kafka 后依次启动 logic、comet、job 三个进程即可跑通一套可水平扩展的 goim 实时推送集群。赞分享后端即时通讯微服务【免费下载链接】goimgoim项目地址https://gitcode.com/gh_mirrors/go/goim点击查看免费下载相关推荐5分钟掌握SAMKeychainiOS/macOS钥匙串安全存储终极指南5分钟掌握SAMKeychainiOS/macOS钥匙串安全存储终极指南 在iOS和macOS开发中安全存储用户敏感数据一直是开发者面临的重要挑战。SAMK应用安全Goim消息推送终极指南单推、群推、广播性能对比与最佳实践Goim消息推送终极指南单推、群推、广播性能对比与最佳实践 Goim是一个高性能的即时消息推送系统支持单个、多个、单房间以及广播消息推送等多种推送模式能够后端即时通讯微服务Sliver 通知集成实战基于 nikoksr/notify 的 Pushover 推送服务接入指南Sliver 通知集成实战基于 nikoksr/notify 的 Pushover 推送服务接入指南 本篇技术指南以 nikoksr/notify 的 Pus网络安全上一篇boofuzz部署与运维完整指南从开发到生产环境的最佳实践下一篇GitHub Issue Templates Pull Request模板代码贡献管理最佳实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表