skynet的内容学习笔记01
强一致性和最终一致性。
最终一致性 强调的是通知
强一致性 强调的处理结果
zookeeper 服务协调问题
1 配置项目管理
2 集群管理 redis 哨兵
redis使用setnx()实现分布式锁。 + 过期时间 (执行逻辑时间)
setnx(key,唯一标识,timeout);
问题。如果中间服务断了,对链路不敏感,需要用超时时间或是另外的进程或线程轮询。
zookeeper可以解决此问题。如果其中一个服务挂了,马上会知道。是完备的实现分布式锁问题
多进程 隔离性强,统一性差
多线程特点 锁类型,应用,锁粒度,隔离性关,统一性强
平衡隔离性和统一性的问题
多进程 隔离性强,统一性差 进程
多线程特点 锁类型,应用,锁粒度,隔离性关,统一性强 线程
a)消息队列
b)pipe
c)锁
并发模型
1 actor 模型 erlang (语言层面),skynet 用框架来解决actor
从语言层面抽象出进程的概念。隔离性强,统一性差
1) 用于并行计算
2) actor是最基本的计算单元
3) 基于消息计算 skynet的回调函数
4)actor相互隔离 (内存块+lua虚拟机) 通过消息进行沟通
actor模型示意图
2 csp go 语言为代表 goroutine 以协程为并发实体
3 skynet actor
actor组成
1 隔离的环境
2 回调函数 (消费我们消息队列的)
3 消息队列
skynet c语言 + lua
1 c actor 服务
__init
__create
__release
__callback (回调函数)
2 lua actor 服务
lua虚拟机
actor的运行环境及消息调度
1 全局消息队列 存储的是, 有消息的actor消息队列指针
2 actor消息队列 存储的是专属actor的消息队列
worker线程
1) 取出actor消息队列
2)取出消息
3)通过回调函数(消息) 执行actor
3 消息的生产和消费
1)actor之间消息生产
2)网络中的消息生产
3)定时器生产
消费通过callback
隔离环境实现
lua 隔离环境
互斥锁会做切换,会执行其它任务
自旋锁,不会做切换,一直等到可用,在原地方死等 ,适应用简单,不复杂的业务逻辑
读写锁
1 读状态加锁,为共享锁。其它线程以读的模式进入临界区,不会发生阻塞,直接访问
2 写状态加锁,此时为独享锁 ,其它线程访问此临界区,都会发生阻塞。 等待
适应用,读远大于写的情景中
条件变量
虚假唤醒问题
while(条件不满足) 可以解决虚假唤醒
如果用 if (条件满足) 会产生虚假唤醒
代码启动
权重的设定,充分的利用我们的cpu,打乱cpu线程消息速度。因为不能确保每个actor都是一样量的数据,让其满载负荷运行。
1 从消息队列取消息,并通过回调函数调用,自旋锁 (粒度小,减少切换) 几个核心几个worker线程
woker执行我们的逻辑,尽量不要休眠,不要切换。
并发性,做逻辑比较强
2 当没有消息的时候,通过条件变量 休眠
3 唤醒只有在网络和定时器时才产生