首页 > 系统相关 >skynet框架:跨进程组播实现方案

skynet框架:跨进程组播实现方案

时间:2024-03-23 14:34:57浏览次数:20  
标签:... 组播 end 框架 service skynet 节点 channel

存在业务场景,从单点进程(source)批量向集群内其他节点(target)推送消息,目标节点数量可能达三位数。

提供一个实现方案:

  1. target上开启进程内的组播服务,只负责当前节点的组播推送业务;服务支持接收其他节点的通知消息(目标服务只在所在节点内的组播服务上做订阅等操作,由该组播服务负责管理);
  2. source进程构造组播消息包,做一次循环将消息发送到所有目标节点(这里只是寻常的remote send,multicast消息类型不是必须的,最常用的lua消息类型足够使用);
  3. target上的组播服务将数据包pack成multicast消息类型转发到所有目标订阅服务;

一段代码说明下:

-- source service
for _, skynet_node in ipairs(get_target_nodes()) do
	cluster.send(skynet_node, "multicastd", "lua", "remote_publish", channel, msg)
end

-- multicastd
local subscribes = {
	-- channel = {
	-- 		service,
  -- 		...
	-- },
	-- ...
}

local MULTICAST_CMD = {
	publish = function(channel, msg)
		for service in pairs(subscribes[channel]) do
			skynet.send(service, "multicast", msg)
		end
	end,
    subscribe = function(...)
    	...
    end,
    newchannel = function(...) 
        ...
    end,
    ...
}

local LUA_CMD = {
	remote_publish = function(...)
		local channel, msg = unpack(...)
		MULTICAST_CMD.publish(channel, msg)
	end
}

function init_service()
	...
	skynet.dispatch("lua", function(_, _, cmd, ...)
		LUA_CMD[cmd](...)
	end)
end
skynet.start(init_service)

-- target service
function init_service()
	...
	skynet.dispatch("multicast", function(...)
		...
	end)
end
skynet.start(init_service)

上述方案中multicastd服务核心只做一个事情:当收到组播通知时,将消息推送到订阅的所有服务中去。这个组播通知可以来自包括服务所在节点内的任何集群内节点,我们常常是把channel id跟某个业务玩法绑定,所有节点约定这个id,target service订阅这个channel后,关联的这个玩法(可能跑在当前或其他节点)有组播需求时,会通知到关心该消息的所有target service。

可以看出,方案并没有区分local channel和remote channel。这里发起组播请求的总是单点玩法节点,而multicastd服务只是作为目标节点,等待组播通知,这里通知消息使用的消息类型也并不是multicastd。我们的业务,广播的需求场景基本是从单点节点单向发出,所有目标节点作为接收方进行接收处理。

标签:...,组播,end,框架,service,skynet,节点,channel
From: https://www.cnblogs.com/linxx-/p/18091089

相关文章

  • skynet框架:量级可控的定时任务管理模块
    存在业务玩法,在单个场景内大量使用定时事件用于触发数据更新。skynet的定时器模块实现已经非常高效,一般不必太担心性能问题,事实上玩法的初版实现正是直接使用框架定时器处理触发。几个方面是期望做得更好的:减少外部消息。框架的定时事件是通过消息机制通知到指定service的,而单......
  • skynet框架:全服广播业务
    存在业务场景,对当前在线玩家发送消息通知。这里将消息生产的服务称为source,目标玩家服务称为target。对单个玩家使用独立的lua虚拟机进行代理,称为agent,承载agent的节点称为user。区分source和target是否存在于相同的skynet节点:如果处于相同的节点,那么只是单服内进行一次进程内......
  • 【Java - 框架 - HttpClient】(01) 使用“HttpClient“爬取网页的代码示例 - 快速上手
    使用"HttpClient"爬取网页的代码示例-快速上手;依赖<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.14</version></dependency><dependency>......
  • 【Java - 框架 - Knife4j】(01) SpringBoot整合Knife4j - 快速上手
    “SpringBoot"整合"Knife4j”-快速上手;环境“Knife4j"版本"2.0.9”;“Java"版本"1.8.0_202”;“SpringBoot"版本"2.5.9”;“Windows11专业版_22621.2428”;“IntelliJIDEA2021.1.3(UltimateEdition)”;步骤步骤A说明创建"SpringBoot"项目;图片(1)......
  • java框架漏洞的学习笔记
    网络安全学习之框架漏洞学习框架漏洞的意义一、spring框架常见漏洞spring简介Actuators介绍spring区分默认路径SpringBoot历史漏洞springboot常见端点二丶Shiro框架反序列化漏洞shiro框架介绍Shiro漏洞原理三丶Tomcat任意文件写入(CVE-2017-12615)漏洞原理影响范围总结......
  • Vue框架学习(二)
    一、指令修饰符通过"."指明一些指令后缀,不同后缀封装了不同的处理操作,目的是为了简化代码。1、按键修饰符@keyup.enter 键盘回车监听,一旦回车就对文本框里的数据进行处理。2、v-model修饰符v-model.trim       去除首尾空格v-model.number   ......
  • 我们需要什么样的 ORM 框架
    了解我的人都知道,本人一直非常排斥ORM框架,由于对象关系阻抗不匹配,一直觉得它没有什么用,操作数据库最好的手段是sql+动态语言.但这两年想法有了重大改变.2013年用js实践过一个GUI的开发,结论是对于软件工程来说,静态类型是必须的.但在数据库方面我却一直回避......
  • 2020-2-26-koa框架使用
    快速上手、路由、动态路由、获取get值、中间间、koa-views使用、ejs小结、利用中间体配置公共变量、获取post数据、静态web服务、koa-art-template使用、cookies使用、session使用、mongodb数据库封装、路由模块化案例、快速创建koa项目koa-generator快速上手1安装npminstall......
  • java实验室设备资产管理系统(ssm框架毕业设计)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义标题:实验室设备资产管理系统在科学研究和教学实验中,实验室设备扮演着至关重要的角色。随着科技进步和研究需求的不断增长,实验室内的各种仪器设备变得日益复杂和昂......
  • UE5中简易的UI管理框架(c++版,UE5.1)
    需求说明:在UE项目开发中,当UI界面较多的时候,就需要有一个管理功能出现,负责UI的生成、销毁、禁用等功能。基于此需求,采用栈先进后出的数据接口,编写了一个简易的UI管理框架。功能说明:1.支持UI的自动创建2.支持UI的按开启顺序关闭3.支持一件关闭所有UI4.支持开启当前UI后,禁......