收藏 分销(赏)

Go语言高并发实战构建千万级在线的实时消息推送服务省名师优质课赛课获奖课件市赛课一等奖课件.ppt

上传人:a199****6536 文档编号:10452284 上传时间:2025-05-28 格式:PPT 页数:46 大小:129.54KB
下载 相关 举报
Go语言高并发实战构建千万级在线的实时消息推送服务省名师优质课赛课获奖课件市赛课一等奖课件.ppt_第1页
第1页 / 共46页
Go语言高并发实战构建千万级在线的实时消息推送服务省名师优质课赛课获奖课件市赛课一等奖课件.ppt_第2页
第2页 / 共46页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,本资料仅供参考,不能作为科学依据。谢谢,Go 语言高并发实战,构建千万级在线实时消息推送服务,.12.12,第1页,关于我,张景埕,网名 diogin(,/dadrn/,),programmer360,Go 语言追随者与实践者,新浪微博:,Go,二、探究 Go 语言实现细节,三、实时消息推送服务特点,四、系统架构及组件细节,五、数据、经验和教训,第3页,一、为何选取,Go,第4页,1.,高并发,一个,Go,进程能够轻易支撑几十万上百万并发运行,Go,例程(只要你内存足够大),O(1),调度,5KiB/goroutine,内存开销,net,包:,pollServer(epoll/kqueue/iocp),支持大量并发连接,fd,事件通知,同时还支持多核并行,(,当前为,8,核,),select/channel,提供卓越例程间通信能力,第5页,2.,高性能,编译为当地机器码,静态链接,(CGO_ENABLED=0),轻量级,runtime,实现,热点代码能够直接编写,C,或,ASM,,一样静态链接进目标文件,第6页,3.,垃圾搜集,不想为内存泄露问题焦头烂额,朴素实现:停顿式、标识,&,去除,还有很大提升空间,资源泄露还得自己处理,第7页,4.,低成本,学习成本低:源自,C,系,大量,C,系程序员能够很快上手(,这很主要,),运维成本低:不需要安装各种让人头疼依赖,不需要搭建各种运行环境,布署非常方便,第8页,5.,够用标准库,net,encoding/gob,strings,bytes,errors,strconv,regexp,os,time,syscall,sync,.,第9页,6.,高移植性,各种操作系统:,Linux,FreeBSD,Darwin,NetBSD,OpenBSD,Windows,各种体系结构:,386,amd64,arm(v5,v6,v7),各种目标文件格式:,elf/pe/macho,第10页,7.,优异背景,Google,BSD License,Ken Thompson,Rob Pike,Robert Griesemer,Russ Cox,Brad Fitzpatrick.,拥有强烈,Plan 9,血统,C,Python,格调,第11页,Alternatives?,Erlang,Node.js,D,Rust,第12页,二、探究,Go,语言实现细节,第13页,WHY?,产品级应用,不是玩具,在国内(甚至国外),仍处于吃螃蟹阶段,我们需要能,hold,住可能出现各种问题,提升团体组员技术水平,回馈,Go,本身,主动为其做贡献,第14页,摘要,代码结构,逻辑结构,实现结构,程序开启,运行视角,深入,runtime,第15页,1.,代码结构,工具,+,标准库,include/,:,Go,基本工具依赖库头文件,src/,:,Go,基本工具、标准库实现,src/cmd/,:,Go,基本工具及其实现,src/lib*/,:,Go,基本工具依赖库实现,src/pkg/,:,Go,标准库实现,第16页,2.,逻辑结构,gc,(Go,编译器,),、,cc(Plan 9 C,编译器,),、,as(Plan 9,汇编器,),、,ld(Plan 9,链接器,),、,pack(Plan 9,目标文件归档工具,),工具链一条龙,支持各种操作系统、体系结构和可执行文件格式,程序,=N,个包合并、组合,包,=const,、,var,、,type,、,func,dist,:引导程序,负责构建,Go,基本工具,go,:管理,Go,各项功效,第17页,3.,实现结构,每个包里能够有,.go,、,.c,、,.s,文件,分别由,gc,、,cc,、,as,编译,最终统一用,ld/pack,链接并打包成静态链接库,(,遵照一致,ABI),每个,Go,程序都包含最底层,runtime,包,,runtime,实现并封装了程序运行时环境,syscall,包封装了操作系统调用,同时与,runtime,协作进行,goroutine,调度,sync,提供了基本并发同时原语(工具包),reflect,为应用层代码提供运行时自省能力,第18页,4.,程序开启,基本概念:,M,内核线程,,Ggoroutine,Go,使用符号“,”分隔包与包内组员名字,准备,runtimem0/runtimeg0-,准备,argc,argv-,调度器初始化,(,内存初始化,-m,初始化,-,注册,args,envs-,设置并行参数,),-,创建并运行,runtimemain,例程,(,开启垃圾搜集器,-maininit()-mainmain(),),第19页,5.运行视角,程序由多个包组成,入口为 main 包,每个包在程序开启时按依赖次序逐一初始化,程序内有多个 goroutine 并发运行,goroutine 经过 channel 进行同时/异步通信,自动化内存管理,不区分堆和栈,第20页,6.深入 runtime,mgc0.c:垃圾搜集器,proc.c:goroutine 管理及调度,hashmap.c:Go map,chan.c:channel 实现,malloc.goc:内存分配器,asm_GOARCH.s:体系结构相关功效,iface.c:Go interface,symtab.c:符号表,cpuprof.c/mprof.goc:Profiling,sys_GOOS.s:操作系统相关功效,thread_GOOS:内核线程统一抽象,panic:panic管理,第21页,三、实时消息推送服务特点,第22页,摘要,长连接(各种接入协议:HTTP、TCP),高并发(=10,000,000),各种发送方式(支持单播、多播、广播),持久,/,非持久,准实时(200ms,2s,),客户端多样性(手机端、PC 端),同一账号多客户端同时接入,接入网络频繁改变(电信、联通),第23页,1.长连接,Server PUSH 基础,HTTP Long Polling(Keep-Alive),基于 TCP 自定义通信协议,采专心跳来侦测对方是否还在线,第24页,2.高并发,C10K?out 了,现在标准是 C1000K,用户众多:各接入产品实时在线人数都在10,000,000 以上,Linux Kernel=2.6.32,x86-64,sysctl-w fs.file-max=1000,sysctl-w fs.nr_open=11000000,limit.conf:nofile=10000000,TCP/IP,协议栈参数调优,第25页,3.各种发送方式,点对点聊天(单播),定点推送(多播),全网推送(广播),第26页,4.持久/非持久,持久消息必须确保不丢失(需要离线存放),非持久消息仅发给当前在线用户,第27页,5,.准实时,发一条消息,另一个人必须能很快收到,2,00ms 2s,GC,卡顿会造成巨大麻烦,第28页,6,.客户端多样性,手机、PC、平板电脑,不一样产品有不一样需求,提供机制,而非策略,第29页,7,.同一账号多客户端接入,iMessage:iPhone,iPad,MacOSX,QQ:PC、手机、平板、微信,互斥(早期,QQ,),&,共存,策略:怎样控制?,第30页,8.接入网络频繁改变,白天在电信,晚上在联通,一会儿在企业 wifi,一会儿 3G,一会儿 2G,断线,重连,断线,重连,第31页,四、系统架构及实现细节,第32页,摘要,逻辑架构:简单至上,组件:room,组件:register,组件:saver,组件:idgenerator,组件:center,存放:redis,第33页,1.逻辑架构:简单至上,第34页,2.组件:room,客户端所连接进程,类似于一个聊天室,每个客户端一个 server goroutine 进行下推,每个 server 有一个 channel 存消息队列,room 内有 book 统计 user 与 server 映射,一个 http server 负责收消息并将消息路由到接收人所在 room 和 server,manager 负责掌控 room 服务:内部单播、多播、广播,admin 负责 room 进程管理,第35页,3.组件:register,因为 room 分布式与全对称设计,需要有一个地方统计用户当前连到了哪个 room,register 实现该角色,同时需要统计在线时长等信息(业务需求),本质上就是一个 key-value map,value 是个 struct,hash 算法定位 register 进程,能够直接用 redis,但自己实现能够方便地添加业务逻辑,第36页,4.组件:saver,分布式全对称设计,提供存放接口,封装后端分布式存放,接口采取 encoding/gob 编码格式 rpc,第37页,5.组件:idgenerator,全局消息 id 生成器,int64,分布式,每个进程负责一块 id 区域,确保不重合,后台 goroutine 每隔一秒写一次磁盘,统计当前 id,开启时跳过一段 id,预防一秒内未写入磁盘 id 重复生成,第38页,6.组件:center,提供消息操纵接口给应用服务器调用,运行人员后台发消息-应用服务器-center-room-客户端,RESTful API,有些任务(比如广播)需要一段时间,运行人员需要追踪发送进度,可能要暂时停顿,所以需要有“任务”概念,并可管理,提供统计接口,第39页,7.存放:redis,关键数据,db_users:ZSET,存各产品用户集合,db_slots:LIST,存用户离线消息队列,db_buckets:DICT,存消息 id-消息体,第40页,五、数据、经验和教训,第41页,数据,16台机器,标配24个硬件线程,64GB内存,Linux Kernel 2.6.32 x86_64,单机80万并发连接,load 0.20.4,CPU 总使用率 7%10%,内存占用20GB(res),当前接入产品约1280万在线用户,2分钟一次GC,停顿2秒(1.0.3 GC 不给力,直接升级到 tip,再次吃螃蟹),15亿个心跳包/天,占大多数,连续运行一个月无异常,稳定,第42页,经验,勇于尝试新东西,勇于面对新挑战,拿代码说话,拿数听说话,不要凭感觉,要实际去测,对一项新技术要切实了解其优势和劣势,对于感觉含糊地方,追查其实现,做到有备无患,第43页,教训,实时系统对 GC 非常敏感,幸好 tip 上提供了并行 GC,不然这就是一次惨痛教训,需要做架构方面大调整(将大进程拆分成小进程),第44页,Q&A,第45页,Thanks!,张景埕,diogin,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服