
pushserver的架构设计
1.推送服务器介绍
推送业务信息到手机端
始终保持连接
2.推送服务器要求
高并发
可靠性
高性能
支持水平扩展
无单点故障
3.语言特性
静态的、编译的
自动内存回收
命令式编程
函数可以作为值
面向并发
内置RPC支持
4.推送服务器要求应对
高并发
- goroutine
可靠性
- 使用Redis暂存消息
高性能
- 静态编译语言
支持水平扩展
- 使用RPC组成集群
无单点故障
- 使用Redis实现数据共享
5.并发模型
事件驱动,共享线程池
runtime.GOMAXPROCS(runtime.NumCPU())
使用“go”命令创建goroutine
go sockstore.Start()
goroutine使用channel交换消息
异步场景,直接往指定channel发送数据
同步场景,往channel发送的数据中,包含一个获取返回值的channel
6.去中心化设计
客户端随机连接
Redis集中存储地址表
信息发送2跳到达
7.消息缓存设计
消息预存(Redis)
尝试发送
发送成功后删除
8.串行场景-Socket Server
在主程序启动时启动
所有请求都用一个goroutine响应
对外提供API,实质是往goroutine发送消息
9.并行场景-TCP Server
在有socket连接时创建
为每个socket创建一个goroutine
用心跳维持,超时关闭socket,同时退出goroutine
用全局字典,查找clientID对应的socket
10.actor model
Actor通过消息传递的方式与外界通信,而且消息传递是异步的。每个Actor都有一个邮箱,邮箱接收并缓存其他Actor发过来的消息,通过邮箱队列
mail queue来处理消息。Actor一次只能同步处理一个消息,处理消息过程中,除了可以接收消息外不能做任何其他操作。每个Actor是完全独立的,可以同时执行他们的操作。每个Actor是一个计算实体,映射接收到的消息并执行以下动作:发送有限个消息给其他Actor、创建有限个新的Actor、为下一个接收的消息指定行为。这三个动作没有固定的顺序,Actor会根据接收到的消息进行不同的处理。
Actor是由状态(state)、行为(behavior)、邮箱(mailbox)三者组成的。
- 状态(state):状态是指actor对象的变量信息,状态由actor自身管理,避免并发环境下的锁和内存原子性等问题。
- 行为(behavior):行为指定的是actor中计算逻辑,通过actor接收到的消息来改变actor的状态。
- 邮箱(mailbox):邮箱是actor之间的通信桥梁,邮箱内部通过FIFO消息队列来存储发送发消息,而接收方则从邮箱中获取消息。
Actor模型描述了一组为避免并发编程的公理:
- Actor内部单线程
- 所有的Actor状态是本地的,外部是无法访问的。
- Actor必须通过消息传递进行通信
- 一个Actor可以响应消息、退出新Actor、改变内部状态、将消息发送到一个或多个Actor。
- Actor可能会堵塞自己但Actor不应该堵塞自己运行的线程
11.golang CSP
CSP(Communicating Sequential Process)
worker1 ——->Channel ——->worker2M:是内核线程
P : 是调度协调,用于协调M和G的执行,内核线程只有拿到了 P才能对goroutine继续调度执行,一般都是通过限定P的个数来控制golang的并发度
G : 是待执行的goroutine,包含这个goroutine的栈空间
Gn : 灰色背景的Gn 是已经挂起的goroutine,它们被添加到了执行队列中,然后需要等待网络IO的goroutine,当P通过 epoll查询到特定的fd的时候,会重新调度起对应的,正在挂起的goroutine。

12. push server

