首页 > 其他分享 >skynet框架:全服广播业务

skynet框架:全服广播业务

时间:2024-03-23 14:12:35浏览次数:25  
标签:场景 单服 source 广播 消息 skynet 全服

存在业务场景,对当前在线玩家发送消息通知。

这里将消息生产的服务称为source,目标玩家服务称为target。对单个玩家使用独立的lua虚拟机进行代理,称为agent,承载agent的节点称为user。

区分source和target是否存在于相同的skynet节点:

如果处于相同的节点,那么只是单服内进行一次进程内广播的操作,所有单服的广播同步进行(场景一);

如果处在不同的节点,那么source为外部节点上的服务,此时,需要将消息派发到当前存在的所有user单服上,即跨进程广播方案(场景二)

下面讨论几个问题:

  1. 单次广播操作是否稳定可靠

我们将业务上的广播动作(单服内)看做一次遍历所有agent发送消息的同步操作:

function CMD.broadcast()
		for _, addr in ipairs(online_agents) do
    		skynet.send(addr, "broadcast", cmd)
  	end
end

对于上述场景一二,广播的消息量级是相同的,那么我们只讨论在单服上做一次广播是否安全。一次广播的消息总数量是单服当前登录中的玩家数量,即当前存在的agent数量。这里需要评估的点在于:

(1)瞬间产出的消息量级是否可控;(2)单次广播的CPU占用时间;

对于滚服架构,绝大多数的业务实现在相同的skynet进程上,单服容纳的agent上限不高(相对大服架构而言),我们认为单次广播生产的消息数量可控,占用CPU的时间也在可控范围,不会造成内存暴涨和卡顿问题;

对于大服架构,我们将非单独玩家的逻辑独立出来跑在公共进程上,为user释放出更多系统资源。大服架构下单台服(user)的承载上限更高,瞬间产出的消息可能引起内存较大波动,此时source服务处于分发广播消息的动作上,如果有后续的消息(比如另一个发起广播的请求)到来,可能会造成消息处理的卡顿延迟,source服务繁忙中。

事实上,业务上我们对在线玩家的广播动作,很多时候是在0点跨天5点跨天(比如玩法的阶段切换通知),此时批量的广播请求同时发起进行,上述的卡顿延迟现象会比较明显。

  1. 优化全服广播

上面提到的全服广播带来的性能压力,讨论记录以下几个处理思路:

(1)内存压力:通过提高单服机器硬件配置;卡顿延迟问题:扩展单点source服务为批量服务,为每个广播请求分配一个source服务进行处理,提高并发性能;

(2)组播方案代替;大部分情况下,在线的玩家只在指定场景下关心这个广播消息,比如主场景下需要实时刷新玩法入口的信息,但在其他玩法场景内并不需要接收到这个消息(进入主场景时通过请求回应的方式获取此时的数据进行更新),针对此类业务场景,可以使用组播的实现方案代替全服的广播:我们抽象出各类scene,对source服务实现支持区分scene消息推送,通过订阅的方式标记关心scene内关联的组播消息,当source发起组播请求时(此时消息携带scene信息),只发送给订阅了该消息的target,实现更精准的消息推送;

(3)客户端定时请求刷新;这里是异步代替同步的思路。业务开发上服务器避免全服广播的动作,由客户端定时请求获取数据更新。将单个广播动作变成多个请求回应的动作,通过skynet的消息队列异步消费。这里消息的数量并没有减少,服务器会在瞬间接收到所有在线玩家的请求,但此时agent的消息队列、source的消息队列会进行调度,发挥出skynet的协调能力。

标签:场景,单服,source,广播,消息,skynet,全服
From: https://www.cnblogs.com/linxx-/p/18091050

相关文章

  • QT网络编程之实现UDP广播发送和接收
    一.UDP广播介绍UDP广播地址固定IP地址为:XXX.XXX.XXX.255。如果向全网段发送广播消息,那么广播地址为:255.255.255.255;如果向单个网段发送广播消息,例如你的IP是192.168.31.104,那么广播地址为192.168.31.255。广播消息接收方需要绑定0.0.0.0地址并监听指定端口即可收到广播的群......
  • C语言的UDP广播实现
    C语言的UDP广播实现以下是一个使用epoll和getopt的UDP广播客户端示例。这个客户端会向指定的广播地址发送一条消息,并等待服务器返回的数据包。#include<arpa/inet.h>#include<netinet/in.h>#include<sys/epoll.h>#include<sys/socket.h>#include<unistd.h>#include<st......
  • 【组播】组播 组播和单播、广播的区别
    什么是组播?作为IP传输三种方式之一,组播指的是报文从一个源发出,被转发到一组特定的接收者,相同的报文在每条链路上最多有一份。相较于传统的单播和广播,组播可以有效地节约网络带宽、降低网络负载,所以被广泛应用于IPTV、实时数据传送和多媒体会议等网络业务中。组播和单播的区......
  • 蓝牙广播后的扫描响应:scan response
    广播数据只能31个字节,如果设备名称太长了,又有很多信息需要广播,31字节不够用怎么办?这时候可以借用扫描响应的数据包,发送一些数据。广播和扫描响应的用法基本相同。广播通道(37,38,39,其余的用于连接数据交互)用于:广播、扫描请求、扫描响应、连接请求。BLE设备发出广播信号(设备地址和......
  • Android 《系统广播》
    一.接收系统的分钟广播TimeReceiver.javapackagecom.xian.app.broadcast.receiver;importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.Intent;importandroid.util.Log;importjava.util.Date;publicclassTimeReceiv......
  • 2024-02-29-Linux高级网络编程(3-UDP编程-TFTP、广播、多播)
    3.UDP编程-TFTP、广播、多播3.1TFTP简介、通信过程3.1.1TFTP概述TFTP:简单文件传送协议(TrivialFileTransferProtocol),最初用于引导无盘系统,被设计用来传输小文件特点:基于UDP实现,不进行用户有效性认证数据传输模式:octet:二进制模式netascii:文本模式mail:已经不再支持3......
  • 数据库自治与安全服务训练营火热开营!完成任务可得国潮保温杯和阿里云定制双肩包!
    本训练营带您简单了解数据库自治与云安全服务,数据库自治服务提供云上RDS、PolarDB、NoSQL、ADB等数据库7*24小时异常检测、SQL自优化、安全合规审计、弹性伸缩、数据自治、锁分析等亮点功能。一站式自动化、数字化DAS集成平台,助力您畅享DBA运维智能化。完成训练营任务可得国潮保......
  • [转帖]网络知识梳理:网络广播
    网络广播是一种网络通信的形式,其中一个发送端向多个接收端同时发送相同的信息。在计算机网络中,这通常涉及到使用特定的广播地址,使得所有连接到该网络的设备都能接收到这些信息。网络广播可以根据范围和用途分为几种类型:1.广播(Broadcasting)定义:在广播中,消息被发送到网络上......
  • js处理事件:异步处理事件与线程,使用队列按序执行,事件广播,事件bus,事件监听,变量监听,动态
    js处理事件:异步处理事件与线程,使用队列按序执行,事件广播,事件bus,事件监听,变量监听,动态执行,父子通信在Vue3中,你可以使用以下方法来处理异步事件、线程、队列执行、事件广播、事件总线、事件监听、变量监听、动态执行和父子通信:1.异步处理事件:可以使用async/await或Promise......
  • Flink之状态编程 值状态(ValueState)列表状态(ListState)映射状态(MapState)归约状态(Reducin
    Flink之状态编程值状态(ValueState)列表状态(ListState)映射状态(MapState)归约状态(ReducingState)聚合状态(AggregatingState)广播状态(BroadcastState)Flink之状态编程一、按键分区状态(KeyedState)1.1、值状态(ValueState)1.1.1、定义1.1.2、使用案例1.2、列表状态(ListState)1.2.1......