skynet源码分析1:开篇明义

skynet云风基于actor模型实现的一个服务器框架,核心七千多行c代码,并提供了一个lua binding。写得比较简明,用起来比较爽快,很合我的胃口,再加之决定在公司最近的一个项目上skynet,所以就决定精读一遍源码,将所思所想所得记录于此,以便用起来心安理得。

skynet的实现基于如下几条actor行为:

  • 能创建,销毁其它actor,actor间为平级关系。
  • 能发送消息给其它actor,能接收其它actor的消息。
  • actor间的交互只能通过消息传递。
  • 能处理自己的消息。

在skynet的世界里,actor用动态库来表示,每个so加载后,都会被赋予一个永不重复([1,4G])的id作为标识,so必须向框架注册一个回调函数用于处理消息。框架只做两件事:

  1. 将发送的消息正确送达目标actor。
  2. 均衡快速的调用so的回调处理消息,这个回调不会并发,且每次只处理一条消息。

未完待续,有不当之处,请各位道友指正。

时间: 2024-08-08 09:29:28

skynet源码分析1:开篇明义的相关文章

skynet源码分析:服务

skynet是为多人在线游戏打造的轻量级服务端框架,使用c+lua实现.使用这套框架的一个好处就是,基本只需要lua,很少用到c做开发,一定程度上提高了开发效率. skynet的例子是怎么调用的 服务器: simpledb.lua: skynet.register "SIMPLEDB" 向skynet里注册一个服务 agent.lua: skynet.call("SIMPLEDB", "text", text) 调用相应的服务 main.lua:

skynet源码分析5:lua绑定之地基

前面四篇已经涵盖了skynet的c层核心,剩下的timer,socket模块本身和actor模型没什么关系,且比较独立,最后再看吧.光用skynet的c接口,是很难在这上面写业务逻辑的,所以要找一种更爽快的方式来使用.官方推荐的是lua,利用lua的协程对skynet的消息分发做了封装,使得actor之间的异步消息通信有同步一样的操作感,并且做了一些的扩展模块来方便使用.lua简洁实用的风格我个人也很钟意. 要想做一个lua binding来使用,要有两个必要条件: 根据skynet的模块契约实

skynet源码分析3:消息调度

消息调度在框架中分为两个层次,一个c层的分配,一个是lua层的分发.本文阐述的是c层,从两个方面来说: 工作线程的控制 信箱的调度 与调度相关的代码实现在/skynet-src/skynet_mq.c,/skynet-src/skynet_start.c,/skynet-src/skynet_server.c三个文件中,整体上是一个m:n的调度器. 工作线程的控制 框架运行后,会启动固定的线程来轮流调度sc(skynet_context),线程数由配置文件中的thread字段定义,默认是4个.那

skynet源码分析之socketchannel

请求回应模式是与外部交互最常用的模式之一.通常协议设计方式有两种:1.每个请求包对应一个回应包,有tcp保证时序,先请求的先回应,但不必收到回应才发送下一个请求,redis的协议就是这种类型:2.每个请求带一个唯一的session标识,回应包也带这个标识.这样每个请求不一定都需要回应,且不用遵循先请求先回应的时序.mongodb的协议就是这种类型.skynet提供socketchannel库封装内部细节,支持上面两种模式.详情参考官方wiki https://github.com/cloudwu

skynet源码分析之cluster集群模式

比起slave/harbor集群模式,skynet提供了用的更为广泛的cluster集群模式,参考官方wiki https://github.com/cloudwu/skynet/wiki/Cluster.cluster模式利用socketchannel库(http://www.cnblogs.com/RainRill/p/8892648.html) 与其他skynet进程进行交互,每个请求包带一个唯一的session值,对端回应包附带session值.cluster集群模式tcp通道是单向的,

NHibernate源码分析

NHibernate源码分析之开篇: 计划和安排 只从使用NHibernate以来,请被其强大的功能和使用的简洁所吸引. 为了进一步研究NHibernate,决定分析其源代码,如有感兴趣者,欢迎一起研究. 这里列出了将要分析的部分: 1.        NHibernate配置和持久对象映射文件 2.        NHibernate架构分析(uml图) 3.        NHibernate源码分析之一: 配置信息 4.        NHibernate源码分析之一(续): 对象映射 5

Java并发(四):并发集合ConcurrentHashMap的源码分析

之前介绍了Java并发的基础知识和使用案例分析,接下来我们正式地进入Java并发的源码分析阶段,本文作为源码分析地开篇,源码参考JDK1.8 OverView: JDK1.8源码中的注释提到:ConcurrentHashMap是一种提供完整的并发检索和对于并发更新有高预测性的散列表,遵循了与HashMap相同的功能性规格,并包含与HashTable每个方法都对应的方法.虽然所有操作都是线程安全的,但检索操作并不牵涉任何锁,不支持任何锁住整个散列表来保护所有的访问. ConcurrentHashM

skynet 框架snax源码分析1---变量注入

skynet为了简化服务的编写,推出了snax框架,源码里也有一个例子pingserver.这是snax原创文章的第一篇,所以先就分析snax框架里的interface.lua源码,它的实现应用了一个闭包中的upvalue注入技巧. 凡是框架都得遵循框架的约定,snax有两个大的约定,一是约定了一组预置的接口init/exit/hotfix:二是accept/response这两组用来编写服务的接口.本文,并不涉及这些,而是谈accept/response是如何注入给snax服务的. snax框

JDK源码分析--HashMap

HashMap为大家常用的java数据结构工具类,下面对HashMap进行源码分析. 类图结构如下: 其中AbstractMap实现了 public V get(Object key) , public V remove(Object key), public Set<K> keySet(), public Collection<V> values()等常用Map操作方法. 下面先分析下HashMap中的常量定义: /** * The default initial capacit