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 唤醒只有在网络和定时器时才产生

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值