skynet学习笔记【skynet multicast服务的实现】

云风博客上有篇文章已经对multicast的实现讲解的很清楚:http://blog.codingnow.com/2014/04/skynet_multicast.html。

下面是自己对着源码以及博客对multicast的理解,

(1)为了实现一个整个skynet网络的广播服务(可能包括很多个skynet节点),每个skynet节点都得启动一个multicastd服务模块,由multicast.lua中的init()函数里的multicastd = skynet.uniqueservice "multicastd"可知,每个multicastd服务模块的实现文件为multicastd.lua,在同一个节点下,别的服务不能直接给multicastd服务的消息队列发送消息,也就是不能直接向multicastd服务提出请求,只能通过使用multicast.lua文件中提供的接口来请求multicastd的服务,multicast.lua然后通过向multicastd服务的消息队列发送消息来达到目的。

如果skynet网络中有一个服务A和一个服务B,这样在服务A中multicast = require "multicast.lua" ,A服务就可以使用multicast.lua中提供的接口来使用该节点multicastd服务模块,同样multicastd服务模块可以为服务B提供服务。

由于是实现整个skynet网络的广播服务,而不仅仅是实现单个节点内的广播服务,所以每个skynet节点需要知道别的skynet节点下的multicastd服务的handle,这样不同的multicastd服务之间才能进行通信,这样我们就得依靠一个datacenterd服务,该服务为整个skynet网络提供了一个共享数据库。

当启动一个multicastd服务时,由multicastd.lua中的skynet.start中的datacenter.set("mulcast", id, self)向数据库中写入db[multicast][harbor_id] = multicastd_handle,这样任何一个multicastd服务就可以通过调用datacenter.get("multicast", harbor_id)而取得harbor节点下的multicastd服务的handle了。

一个multicastd服务中的局部表格有command,channel,channel_n,channel_remote,channel_id。

channel_n[channel_id] 保存订阅了频道channel_id的服务的数量;

channel[c][source] = true,保存所有订阅了频道c的服务;

channel_remote[channel][node] = true,保存所有订阅了频道channel的别的harbor节点;

command中是别的服务通过调用multicast.lua接口而调用的方法。

command.NEW(),创建一个新的chanel_id,低8位和该skynet节点的harbor_id相等。


multicast.lua向multicastd服务提出各种请求采用的协议为lua协议,而multicastd服务向所有订阅了该频道的服务广播消息时采用的协议是multicast协议。

multicast.new(conf)

如果conf.channel为空,则新建一个频道,否则就是绑定这个频道。绑定这个频道后,可以往频道发布消息,但是不能接收这个频道的消息,如果想要接收这个频道的消息就得

先调用subscribe订阅这个频道的消息,只有这样,multicastd服务,才会当有服务向频道发布消息时,multicastd服务向订阅了该频道的服务的消息队列下发multicast协议类型的消息。而凡是需要使用广播服务的的服务,都会require multicast.lua,从而会把multicast协议注册到该服务,这样该服务就可以处理别的服务发送来的消息,由于发送方会把频道id也发送过来,这样接收方就可以根据频道id找到这个频道对应的处理函数,从multicast.lua的dispatch[channel]中可以找到。

lua-multicast.c

广播消息的结构

struct mc_package {

int reference;//引用该消息的数量

uint32_t size;//data的长度

void *data;

};

如果一个服务要通过publish(...)发布消息,首先会调用skynet.pack,skynet.pack会给消息申请一块内存,然后把消息放入内存中,在栈中保存执向这块内存的指针以及内存的长度,然后再调用lua-multicast.c中的mc_packlocal(),分别给mc_package结构中的字段赋值,这样就生成了一个广播消息。

未完待续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值