 用Go语言实现推送服务器用Go语言实现推送服务器 陈叶皓 chen.yh@ctrip.com 议程 • 推送服务器介绍 • Golang特点 • 推送服务架构 • 部分代码 • 上线效果 议程 • 推送服务器介绍 • 推送服务架构 • 部分代码 • 上线效果 什么是推送服务器 • 推送业务信息到手机端 • 始终保持连接 推送服务器要求 • 高并发 • 可靠性 • 高性能 • 支持水平扩展 • 无单点故障 无单点故障 Go语言特性 • 静态的、编译的 • 自动内存回收 • 命令式编程 • 函数可以作为值 • 面向并发 • 内置RPC支持 推送服务器要求的应对 • 高并发 – goroutine • 可靠性 – 使用Redis暂存消息 • 高性能 – 静态编译语言 • 支持水平扩展 – 使用RPC组成集群 • 无单点故障 – 使用Redis实现数据共享 Go语言的并发模型 • 事件驱动,共享线程池 包含一 个获取返回值的channel 议程 • 推送服务器介绍 • 推送服务架构 • 部分代码 • 上线效果 逻辑架构 去中心化设计 • 客户端随机连接 • Redis集中存储地址表 • 信息发送2跳到达 消息缓存设计 • 消息预存(Redis) • 尝试发送 • 发送成功后删除 客户端注册时序图 议程 • 推送服务器介绍 • 推送服务架构 • 部分代码 • 上线效果 串行场景-Socket0 码力 | 25 页 | 260.04 KB | 1 年前3 用Go语言实现推送服务器用Go语言实现推送服务器 陈叶皓 chen.yh@ctrip.com 议程 • 推送服务器介绍 • Golang特点 • 推送服务架构 • 部分代码 • 上线效果 议程 • 推送服务器介绍 • 推送服务架构 • 部分代码 • 上线效果 什么是推送服务器 • 推送业务信息到手机端 • 始终保持连接 推送服务器要求 • 高并发 • 可靠性 • 高性能 • 支持水平扩展 • 无单点故障 无单点故障 Go语言特性 • 静态的、编译的 • 自动内存回收 • 命令式编程 • 函数可以作为值 • 面向并发 • 内置RPC支持 推送服务器要求的应对 • 高并发 – goroutine • 可靠性 – 使用Redis暂存消息 • 高性能 – 静态编译语言 • 支持水平扩展 – 使用RPC组成集群 • 无单点故障 – 使用Redis实现数据共享 Go语言的并发模型 • 事件驱动,共享线程池 包含一 个获取返回值的channel 议程 • 推送服务器介绍 • 推送服务架构 • 部分代码 • 上线效果 逻辑架构 去中心化设计 • 客户端随机连接 • Redis集中存储地址表 • 信息发送2跳到达 消息缓存设计 • 消息预存(Redis) • 尝试发送 • 发送成功后删除 客户端注册时序图 议程 • 推送服务器介绍 • 推送服务架构 • 部分代码 • 上线效果 串行场景-Socket0 码力 | 25 页 | 260.04 KB | 1 年前3
 Go Web编程求 DNS服务器,通过DNS获取相应的域名对应的IP,然后通过IP地址找到IP对应的服务器后,要求建立TCP连接,等浏览 器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包,服务器调用自身服务,返回HTTP Response(响应)包;客户端收到来自服务器的响应后开始渲染这个Response包里的主体(body),等收到全部的内 容随后断开与该服务器之间的TCP连接。 一个Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。这个客户端通常指的是Web浏览器(其实手机端 客户端内部也是浏览器实现的)。 Web服务器的工作原理可以简单地归纳为: 客户机通过TCP/IP协议建立到服务器的TCP连接 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档 服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言 动态语言 的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端 客户机与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果 一个简单的HTTP事务就是这样实现的,看起来很复杂,原理其实是挺简单的。需要注意的是客户机与服务器之间的通 信是非持久连接的,也就是当服务器发送了应答后就与客户机断开连接,等待下一次请求。 URL和DNS解析 URL和DNS解析 85 我0 码力 | 295 页 | 5.91 MB | 1 年前3 Go Web编程求 DNS服务器,通过DNS获取相应的域名对应的IP,然后通过IP地址找到IP对应的服务器后,要求建立TCP连接,等浏览 器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包,服务器调用自身服务,返回HTTP Response(响应)包;客户端收到来自服务器的响应后开始渲染这个Response包里的主体(body),等收到全部的内 容随后断开与该服务器之间的TCP连接。 一个Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。这个客户端通常指的是Web浏览器(其实手机端 客户端内部也是浏览器实现的)。 Web服务器的工作原理可以简单地归纳为: 客户机通过TCP/IP协议建立到服务器的TCP连接 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档 服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言 动态语言 的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端 客户机与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果 一个简单的HTTP事务就是这样实现的,看起来很复杂,原理其实是挺简单的。需要注意的是客户机与服务器之间的通 信是非持久连接的,也就是当服务器发送了应答后就与客户机断开连接,等待下一次请求。 URL和DNS解析 URL和DNS解析 85 我0 码力 | 295 页 | 5.91 MB | 1 年前3
 Go 入门指南(The way to Go)协程和恢复(recover) 14.7 新旧模型对比:任务和worker 14.8 惰性生成器的实现 14.9 实现 Futures 模式 第 15 章 网络,模板和网页应用 15.1 tcp服务器 15.2 一个简单的网页服务器 15.3 访问并读取页面 15.4 写一个简单的网页应用 第 16章 常见的陷阱与错误 16.1 误用短声明导致变量覆盖 16.2 误用字符串 16.3 发生错误时使用defer关闭一个文件 Go 语言的官方网站是 golang.org,这个站点采用 Python 作为前端,并且使用 Go 语言自带的工具 godoc 运 行在 Google App Engine 上来作为 Web 服务器提供文本内容。在官网的首页有一个功能叫做 Go Playground,是一个 Go 代码的简单编辑器的沙盒,它可以在没有安装 Go 语言的情况下在你的浏览器中编译并运 行 Go,它提供了一些示例,其中包括国际惯例 的编程语言,这不仅体现在它可以处理使用 UTF-8 编码的字符串,就连它的源码文件格 式都是使用的 UTF-8 编码。Go 语言做到了真正的国际化! Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。对于高性能 分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服 务端的开发而言是再好不过了。 Go 语0 码力 | 466 页 | 4.44 MB | 1 年前3 Go 入门指南(The way to Go)协程和恢复(recover) 14.7 新旧模型对比:任务和worker 14.8 惰性生成器的实现 14.9 实现 Futures 模式 第 15 章 网络,模板和网页应用 15.1 tcp服务器 15.2 一个简单的网页服务器 15.3 访问并读取页面 15.4 写一个简单的网页应用 第 16章 常见的陷阱与错误 16.1 误用短声明导致变量覆盖 16.2 误用字符串 16.3 发生错误时使用defer关闭一个文件 Go 语言的官方网站是 golang.org,这个站点采用 Python 作为前端,并且使用 Go 语言自带的工具 godoc 运 行在 Google App Engine 上来作为 Web 服务器提供文本内容。在官网的首页有一个功能叫做 Go Playground,是一个 Go 代码的简单编辑器的沙盒,它可以在没有安装 Go 语言的情况下在你的浏览器中编译并运 行 Go,它提供了一些示例,其中包括国际惯例 的编程语言,这不仅体现在它可以处理使用 UTF-8 编码的字符串,就连它的源码文件格 式都是使用的 UTF-8 编码。Go 语言做到了真正的国际化! Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。对于高性能 分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服 务端的开发而言是再好不过了。 Go 语0 码力 | 466 页 | 4.44 MB | 1 年前3
 Go 入门指南(The way to Go)价值的。 Go 语言的官方网站是 golang.org,这个站点采用 Python 作为前端,并且使用 Go 语言自带的工具 godoc 运行在 Google App Engine 上来作为 Web 服务器提供文本内容。在官网的首页有一个功能叫做 Go Playground,是一个 Go 代码的简单编辑器的沙盒,它可以在没有安装 Go 语言的情况下在你的浏览 器中编译并运行 Go,它提供了一些示例,其中包括国际惯例 UTF-8 编码的字符串,就 连它的源码文件格式都是使用的 UTF-8 编码。Go 语言做到了真正的国际化! 1.2.6 语言的用途 Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并 行的支持,这对于游戏服务端的开发而言是再好不过了。 Go 语 org/cmd/gofmt/。 3.6 生成代码文档 go doc 工具会从 Go 程序和包文件中提取顶级声明的首行注释以及每个对象的相关注释,并生成相关文 档。 它也可以作为一个提供在线文档浏览的 web 服务器,http://golang.org 就是通过这种形式实现的。 一般用法 go doc package 获取包的文档注释,例如: go doc fmt 会显示使用 godoc 生成的 fmt0 码力 | 380 页 | 2.97 MB | 1 年前3 Go 入门指南(The way to Go)价值的。 Go 语言的官方网站是 golang.org,这个站点采用 Python 作为前端,并且使用 Go 语言自带的工具 godoc 运行在 Google App Engine 上来作为 Web 服务器提供文本内容。在官网的首页有一个功能叫做 Go Playground,是一个 Go 代码的简单编辑器的沙盒,它可以在没有安装 Go 语言的情况下在你的浏览 器中编译并运行 Go,它提供了一些示例,其中包括国际惯例 UTF-8 编码的字符串,就 连它的源码文件格式都是使用的 UTF-8 编码。Go 语言做到了真正的国际化! 1.2.6 语言的用途 Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并 行的支持,这对于游戏服务端的开发而言是再好不过了。 Go 语 org/cmd/gofmt/。 3.6 生成代码文档 go doc 工具会从 Go 程序和包文件中提取顶级声明的首行注释以及每个对象的相关注释,并生成相关文 档。 它也可以作为一个提供在线文档浏览的 web 服务器,http://golang.org 就是通过这种形式实现的。 一般用法 go doc package 获取包的文档注释,例如: go doc fmt 会显示使用 godoc 生成的 fmt0 码力 | 380 页 | 2.97 MB | 1 年前3
 1.6 resource scheduling & container technology for financial service_yujunScheduling)算法就是以轮询的方式依次将请求调度不同的服务器,即每次调度执行i  =  (i  +  1)  mod  n,并选出第i台服务器。轮叫调度算法假设所有服务器处理性能均相同,不管服务器的当前连接数和响 应速度。该算法相对简单,不适用于服务器组中处理性能不一的情况,而且当请求服务时间变化比较大时,轮询调 度算法容易导致服务器间的负载不平衡。  Gopher  China0 码力 | 21 页 | 27.20 MB | 1 年前3 1.6 resource scheduling & container technology for financial service_yujunScheduling)算法就是以轮询的方式依次将请求调度不同的服务器,即每次调度执行i  =  (i  +  1)  mod  n,并选出第i台服务器。轮叫调度算法假设所有服务器处理性能均相同,不管服务器的当前连接数和响 应速度。该算法相对简单,不适用于服务器组中处理性能不一的情况,而且当请求服务时间变化比较大时,轮询调 度算法容易导致服务器间的负载不平衡。  Gopher  China0 码力 | 21 页 | 27.20 MB | 1 年前3
 2.3 用golang写一个操作系统功能 模拟ssh登录各server, 采集所有请求的数据 根据服务器、⽇日期、请求,显⽰示所选请求的性能⾛走势图,包括平均和最⼤大响应时间。 选定时期,显⽰示这⼀一天所有请求的请求数⺫⽬目,平均响应时间中,最⼤大响应时间。 可以根据请求数、平均响应时间,最⼤大响应时间对数据时⾏行排序。 代码 1个⽂文件服务器、5个webapi、6个goroutine 部署简单,可以同时在windows和linux上运⾏行 源 现有互联⺴⽹网的⼤大部分服务形态,都可以在Leither上快速构造出来。 可以构造视频⺴⽹网站、微博、微信、IM。。。。。 所有这些应⽤用,⽤用户体验基本不变的情况下 不需要中⼼心服务器存在 Leither是什么? 数 据 层 底 层 ⺴⽹网 络 层 应 ⽤用 层 数 据 库 系 统 接 ⼝口 邮 件 模 块 前 端 架 构 WEB Server RPC 1毫=1K流量信⽤用 1K=1G流量信⽤用 Leither的-货币 阿⾥里云2万台服务器 新开的北京中⼼心1万台 http://server.zol.com.cn/452/4522831.html 09年,Google9万台服务器(另说06年45万台) 构建同⾏行规模(⺴⽹网络,存储)⼤大约只需要数千万⼈人民币 类⽐比: ⼀一个0 码力 | 33 页 | 1014.12 KB | 1 年前3 2.3 用golang写一个操作系统功能 模拟ssh登录各server, 采集所有请求的数据 根据服务器、⽇日期、请求,显⽰示所选请求的性能⾛走势图,包括平均和最⼤大响应时间。 选定时期,显⽰示这⼀一天所有请求的请求数⺫⽬目,平均响应时间中,最⼤大响应时间。 可以根据请求数、平均响应时间,最⼤大响应时间对数据时⾏行排序。 代码 1个⽂文件服务器、5个webapi、6个goroutine 部署简单,可以同时在windows和linux上运⾏行 源 现有互联⺴⽹网的⼤大部分服务形态,都可以在Leither上快速构造出来。 可以构造视频⺴⽹网站、微博、微信、IM。。。。。 所有这些应⽤用,⽤用户体验基本不变的情况下 不需要中⼼心服务器存在 Leither是什么? 数 据 层 底 层 ⺴⽹网 络 层 应 ⽤用 层 数 据 库 系 统 接 ⼝口 邮 件 模 块 前 端 架 构 WEB Server RPC 1毫=1K流量信⽤用 1K=1G流量信⽤用 Leither的-货币 阿⾥里云2万台服务器 新开的北京中⼼心1万台 http://server.zol.com.cn/452/4522831.html 09年,Google9万台服务器(另说06年45万台) 构建同⾏行规模(⺴⽹网络,存储)⼤大约只需要数千万⼈人民币 类⽐比: ⼀一个0 码力 | 33 页 | 1014.12 KB | 1 年前3
 使用Go与redis构建有趣的应用repl := client.Cmd("PING") content, _ := repl.Str() fmt.Println(content) // "PONG" } 连接服务器器 连接客户端 package main import ( "fmt" "github.com/mediocregopher/radix.v2/redis" ) func main() repl := client.Cmd("PING") content, _ := repl.Str() fmt.Println(content) // "PONG" } 连接服务器器 执⾏行行命令并获取回复 连接客户端 package main import ( "fmt" "github.com/mediocregopher/radix.v2/redis" repl := client.Cmd("PING") content, _ := repl.Str() fmt.Println(content) // "PONG" } 连接服务器器 执⾏行行命令并获取回复 将回复转换为字符串串 锁 lock 锁 锁是⼀一种同步机制, 它可以保证⼀一项资源在任何时候只能被⼀一个进程使⽤用, 如果有其他进程想要 使⽤用相同的资源, 那么它们就必须等待,0 码力 | 176 页 | 2.34 MB | 1 年前3 使用Go与redis构建有趣的应用repl := client.Cmd("PING") content, _ := repl.Str() fmt.Println(content) // "PONG" } 连接服务器器 连接客户端 package main import ( "fmt" "github.com/mediocregopher/radix.v2/redis" ) func main() repl := client.Cmd("PING") content, _ := repl.Str() fmt.Println(content) // "PONG" } 连接服务器器 执⾏行行命令并获取回复 连接客户端 package main import ( "fmt" "github.com/mediocregopher/radix.v2/redis" repl := client.Cmd("PING") content, _ := repl.Str() fmt.Println(content) // "PONG" } 连接服务器器 执⾏行行命令并获取回复 将回复转换为字符串串 锁 lock 锁 锁是⼀一种同步机制, 它可以保证⼀一项资源在任何时候只能被⼀一个进程使⽤用, 如果有其他进程想要 使⽤用相同的资源, 那么它们就必须等待,0 码力 | 176 页 | 2.34 MB | 1 年前3
 4 seata-golang 分布式事务框架driver 原理 03 Mysql driver 接⼊ 04 TODO & QA 05 分布式事务就是指事务的参与者、⽀持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系 统的不同节点之上。简单的说,就是⼀次⼤的操作由不同的⼩操作组成,这些⼩的操作分布在不同的服务器 上,且属于不同的应⽤,分布式事务需要保证这些⼩操作要么全部成功,要么全部失败。本质上来说,分布 式事务就是为了保证不同数据库的数据⼀致性。0 码力 | 14 页 | 3.23 MB | 1 年前3 4 seata-golang 分布式事务框架driver 原理 03 Mysql driver 接⼊ 04 TODO & QA 05 分布式事务就是指事务的参与者、⽀持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系 统的不同节点之上。简单的说,就是⼀次⼤的操作由不同的⼩操作组成,这些⼩的操作分布在不同的服务器 上,且属于不同的应⽤,分布式事务需要保证这些⼩操作要么全部成功,要么全部失败。本质上来说,分布 式事务就是为了保证不同数据库的数据⼀致性。0 码力 | 14 页 | 3.23 MB | 1 年前3
 1.5 Go 语言构建高并发分布式系统实践具有go语⾔言特⾊色的运维: 配置管理 具有go语⾔言特⾊色的运维 Æ 配置⽂文件管理与监控 后台->⽣生成配置⽂文件->全部服务器->调⽤用deployd接⼝口,重启或者reload zookeeper-> 动态修改配置⽂文件 -> 各个服务器上实例通过sdk订阅 profiling 接⼝口 —> 后台定期获取->调⽤用go pprof⽣生成⽂文件->存储 通信库实时数据http接⼝口->0 码力 | 39 页 | 5.23 MB | 1 年前3 1.5 Go 语言构建高并发分布式系统实践具有go语⾔言特⾊色的运维: 配置管理 具有go语⾔言特⾊色的运维 Æ 配置⽂文件管理与监控 后台->⽣生成配置⽂文件->全部服务器->调⽤用deployd接⼝口,重启或者reload zookeeper-> 动态修改配置⽂文件 -> 各个服务器上实例通过sdk订阅 profiling 接⼝口 —> 后台定期获取->调⽤用go pprof⽣生成⽂文件->存储 通信库实时数据http接⼝口->0 码力 | 39 页 | 5.23 MB | 1 年前3
 2.7 Golang与高性能DSP竞价系统Reserved • Nginx做前端 • 开多个Go进程 • Nginx的upstream做负载均衡 • Nginx的upstream记得开 keepalive 部署:web服务器 Nginx Go竞价服务 Go竞价服务 Go竞价服务 专业DSP解决⽅方案 © ⼲⼴广州舜⻜飞信息科技有限公司 All Right ReservedAll Right Reserved • 三个多⽉月 第⼀一版正式上线 专业DSP解决⽅方案 © ⼲⼴广州舜⻜飞信息科技有限公司 All Right ReservedAll Right Reserved • 30台竞价服务器,CPU为8核16线程 • 每天100多亿竞价请求 • 峰值20万QPS • 98%响应在10ms以内 • 稳定 线上运⾏行情况 专业DSP解决⽅方案 © ⼲⼴广州舜⻜飞信息科技有限公司0 码力 | 51 页 | 5.09 MB | 1 年前3 2.7 Golang与高性能DSP竞价系统Reserved • Nginx做前端 • 开多个Go进程 • Nginx的upstream做负载均衡 • Nginx的upstream记得开 keepalive 部署:web服务器 Nginx Go竞价服务 Go竞价服务 Go竞价服务 专业DSP解决⽅方案 © ⼲⼴广州舜⻜飞信息科技有限公司 All Right ReservedAll Right Reserved • 三个多⽉月 第⼀一版正式上线 专业DSP解决⽅方案 © ⼲⼴广州舜⻜飞信息科技有限公司 All Right ReservedAll Right Reserved • 30台竞价服务器,CPU为8核16线程 • 每天100多亿竞价请求 • 峰值20万QPS • 98%响应在10ms以内 • 稳定 线上运⾏行情况 专业DSP解决⽅方案 © ⼲⼴广州舜⻜飞信息科技有限公司0 码力 | 51 页 | 5.09 MB | 1 年前3
共 22 条
- 1
- 2
- 3














