Go语言高并发实战:构建千万级在线的实时消息推送服务PPT学习课件_第1页
Go语言高并发实战:构建千万级在线的实时消息推送服务PPT学习课件_第2页
Go语言高并发实战:构建千万级在线的实时消息推送服务PPT学习课件_第3页
Go语言高并发实战:构建千万级在线的实时消息推送服务PPT学习课件_第4页
Go语言高并发实战:构建千万级在线的实时消息推送服务PPT学习课件_第5页
已阅读5页,还剩41页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Go语言高并发实战,构建千万级在线的实时消息推送服务2012.12.12,1,关于我,张景埕,网名diogin(/dadrn/)programmer360Go语言追随者与实践者新浪微博:,2,摘要,一、为什么选用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.够用的标准库,netencoding/gobstrings,bytes,errors,strconvregexpos,timesyscallsync.,9,6.高移植性,多种操作系统:Linux,FreeBSD,Darwin,NetBSD,OpenBSD,Windows多种体系结构:386,amd64,arm(v5,v6,v7)多种目标文件格式:elf/pe/macho,10,7.优秀的背景,Google,BSDLicenseKenThompson,RobPike,RobertGriesemer,RussCox,BradFitzpatrick.拥有强烈的Plan9血统C,Python的风格,11,Alternatives?,ErlangNode.jsDRust,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(Plan9C编译器)、as(Plan9汇编器)、ld(Plan9链接器)、pack(Plan9目标文件归档工具)工具链一条龙支持多种操作系统、体系结构和可执行文件格式程序=N个包的合并、组合包=const、var、type、funcdist:引导程序,负责构建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内核线程,GgoroutineGo使用符号“”分隔包与包内的成员名字准备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:Gomapchan.c:channel实现malloc.goc:内存分配器asm_GOARCH.s:体系结构相关功能,iface.c:Gointerfacesymtab.c:符号表cpuprof.c/mprof.goc:Profilingsys_GOOS.s:操作系统相关功能thread_GOOS:内核线程统一抽象panic:panic管理,21,三、实时消息推送服务的特点,22,摘要,长连接(多种接入协议:HTTP、TCP)高并发(=10,000,000)多种发送方式(支持单播、多播、广播)持久/非持久准实时(200ms2s)客户端多样性(手机端、PC端)同一账号多客户端同时接入接入网络频繁变化(电信、联通),23,1.长连接,ServerPUSH的基础HTTPLongPolling(Keep-Alive)基于TCP的自定义通信协议采用心跳来侦测对方是否还在线,24,2.高并发,C10K?out了,现在的标准是C1000K用户众多:各接入产品实时在线人数都在10,000,000以上LinuxKernel=2.6.32,x86-64sysctl-wfs.file-max=12000000sysctl-wfs.nr_open=11000000limit.conf:nofile=10000000TCP/IP协议栈参数调优,25,3.多种发送方式,点对点聊天(单播)定点推送(多播)全网推送(广播),26,4.持久/非持久,持久消息必须保证不丢失(需要离线存储)非持久消息仅发给当前在线用户,27,5.准实时,发一条消息,另一个人必须能很快收到200ms2sGC卡顿会造成巨大麻烦,28,6.客户端多样性,手机、PC、平板电脑不同的产品有不同的需求提供机制,而非策略,29,7.同一账号多客户端接入,iMessage:iPhone,iPad,MacOSXQQ:PC、手机、平板、微信互斥(早期QQ)&共存策略:如何控制?,30,8.接入网络频繁变化,白天在电信,晚上在联通一会儿在公司wifi,一会儿3G,一会儿2G断线,重连,断线,重连,31,四、系统架构及实现细节,32,摘要,逻辑架构:简单至上组件:room组件:register组件:saver组件:idgenerator组件:center存储:redis,33,1.逻辑架构:简单至上,34,2.组件:room,客户端所连接的进程,类似于一个聊天室每个客户端一个servergoroutine进行下推每个server有一个channel存消息队列room内有book记录user与server映射一个httpserver负责收消息并将消息路由到接收人所在的room和servermanager负责掌控room的服务:内部单播、多播、广播admin负责room进程的管理,35,3.组件:register,由于room的分布式与全对称设计,需要有一个地方记录用户当前连到了哪个room,register实现该角色同时需要记录在线时长等信息(业务需求)本质上就是一个key-value的mapvalue是个structhash算法定位register进程可以直接用redis,但自己实现可以方便地添加业务逻辑,36,4.组件:saver,分布式全对称设计提供存储接口,封装后端的分布式存储接口采用encoding/gob编码格式的rpc,37,5.组件:idgenerator,全局消息id生成器,int64分布式,每个进程负责一块id区域保证不重叠后台goroutine每隔一秒写一次磁盘,记录当前id启动时跳过一段id,防止一秒内未写入磁盘的id重复生成,38,6.组件:center,提供消息操纵接口给应用服务器调用运营人员后台发消息-应用服务器-center-room-客户端RESTfulAPI有些任务(比如广播)需要一段时间,运营人员需要追踪发送进度,可能要临时停止,因此需要有“任务”概念,并可管理提供统计接口,39,7.存储:redis,核心数据db_users:ZSET,存各产品的用户集合db_slots:LIST,存用户离线消息队列db_buckets:DICT,存消息id-消息体,40,五、数据、经验和教训,41,数据,16台机器,标配24个硬件线程,64GB内存LinuxKernel2.6.32x86_64单机80万并发连接,load0.20.4,CPU总使用率7%10%,内存占用20GB(res)目前接入的产品约1280万在线用户2分钟一次GC,停顿2秒(1.0.3的GC不给力,直接升级到tip,再次吃螃蟹)15亿个心跳包/天,占大

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论