首页 > 其他分享 >skynet框架:日程表服务

skynet框架:日程表服务

时间:2024-07-12 22:20:57浏览次数:9  
标签:function end 框架 日程表 --- source skynet local

实现一个日程表服务(crontab),支持

  1. 服务启动自动对齐系统时间,以秒为单位检查触发定时任务(task);
  2. 以服务(同节点)为单位注册定时任务方式:
    1)以自然时间字符串方式:2024-01-01 00:00:00
    2)以定时间隔方式:每秒/每分/每时/每天/每周/每月/每年
  3. 取消指定定时任务;
  4. 定时任务触发逻辑支持超时释放;
  5. 单例;

对齐系统时间:服务启动时计算当前时间到下一秒的间隔,定时驱动日程表心跳raw_timeout

local _, offset = math.modf(skynet.time())
local leftms = 100 - timeout_factor(offset) -- 到下一秒的间隔值
skynet.timeout(leftms, raw_timeout)

function raw_timeout()
    skynet.timeout(100, raw_timeout) -- 每秒触发
    skynet.fork(remind_tasks)
end

function remind_tasks()
    local cbt = skynet.timefloor()
    self._t_frames[cbt-1] = nil -- 释放上一秒的任务集
    local frames = self._t_frames[cbt]
    if table.empty(frames) then
        return
    end
    for _, frame in ipairs(frames) do
        frame:remind() -- 触发任务处理
    end
end

提供注册任务API

---@description 为source服务注册自然时间为timestr的定时任务
---@param
---| '"time2str"'   # 自然时间字符串
---| '"source"'     # 服务id
---| '"proto"'      # 触发回调时使用的协议类型,默认是lua
---| '"cmd"'        # 任务回调的CMD
---| '"ltype"'      # 循环任务的类型:每秒/每分等
---| '"..."'        # 透传给任务回调处理的参数
function mark(timestr, source, proto, cmd, ltype, ...) end

---@description 为source服务注册循环类型定时任务,默认使用lua类型
---@param
---| '"ltype"'      # 循环任务的类型:每秒/每分等
---| '"lparam"'     # 循环任务的自定义参数
function loopmark(ltype, lparam, source, cmd, ...) end

---@description 循环任务的类型
TASK_LOOP_TYPE_SEC = 1 ---# 每秒
TASK_LOOP_TYPE_MIN = 2 ---# 每分钟
TASK_LOOP_TYPE_HUR = 3 ---# 每小时
TASK_LOOP_TYPE_DAY = 4 ---# 每天
TASK_LOOP_TYPE_WEK = 5 ---# 每周
TASK_LOOP_TYPE_MON = 6 ---# 每月
TASK_LOOP_TYPE_YEA = 7 ---# 每年

取消定时任务API

---@description 取消source服务的定时任务
function unmark(timestr, source, cmd, ltype) end

任务处理逻辑需要处理容错、与主流程解耦

---@description 对source服务发起请求,超时interval返回失败处理
function safe_call(interval, source, proto, cmd, ...)
    interval = interval or 1
    local co = coroutine.running()
    local ret
    skynet.fork(function(...)
        ret = table.pack(skynet.call(source, proto, cmd, ...) or false)
        if co then skynet.wakeup(co) end
    end, ...)
    skynet.sleep(interval * 100)
    co = nil
    if not ret then return false end
    return table.unpack(ret)
end

设计skynet框架下服务

local skynet = require "skynet"
local debug = require "skynet.debug"

local Command = { _crontab = nil }

function Command.init()
    Command._crontab = require "crontab"
    assert(Command._crontab, "_crontab init error")
end

local function proto_lua_dispatch(_, _, cmd, ...)
    local f = Command._crontab[cmd]
    if f then
        local msg, len = skynet.pack(f(Command._crontab, ...))
        skynet.ret(msg, len)
    else
        skynet.error(string.format("Unknown command : [%s]", tostring(cmd)))
        skynet.response()(false)
    end
end

local function init()
    skynet.init(Command.init)
    skynet dispatch("lua", proto_lua_dispatch)
end

skynet.start(init)

标签:function,end,框架,日程表,---,source,skynet,local
From: https://www.cnblogs.com/linxx-/p/18299467

相关文章

  • 主流json解析框架示例
    主流json解析框架示例jackson、gson、fastjson/fastjson2三种主流json解析框架对比●性能:在性能方面,Fastjson通常被认为是最快的JSON解析库,其次是Jackson和Gson,json-lib的性能相对较低。●API和功能:Jackson提供了非常灵活、强大的API,支持各种高级功能,例如树模型、数据绑定、......
  • 【Unity】碰撞检测算法及框架实现
    背景硕士期间研究课题是海洋生物数字孪生,基于各类Boids改进的算法里会有大量的海洋鱼类在三维空间中运动,鱼类之间会有互相感知的过程,同一帧里需要对许多行为进行决策判定,例如同伴鱼、食物、捕食者、栖息地等等。因此打算研究下有什么空间加速算法能够避免暴力迭代,减少开销。既然......
  • Hibernate-validator校验框架
    转载:http://blog.csdn.net/xgblog/article/details/525486591前言Validator开发者使用手册,适用后台校验功能的开发参考。1.1. 背景在我们日常后台的开发中,涉及到很多的字段验证,一般普通的验证框架就基本上可以满足日常的开发需求,但有一些情况,这些普通的验证框架无法达到要求......
  • 学习了张传波老师的Scrum(敏捷方法论中的核心框架)后的心得体会
    1.Scrum的核心价值与实践在学习Scrum过程中,首先会深刻体会到Scrum所强调的核心价值:快速迭代、持续交付、客户为中心以及团队自组织。这些价值不仅改变了传统的软件开发流程,更推动了团队文化的转变,使团队能够更灵活地应对变化,更快地交付有价值的产品。2.角色转变与团队协作在Scr......
  • 在C++中使用gRPC框架
    概览在gRPC里客户端应用可以像调用本地对象一样直接调用另一台不同机器上的服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多RPC系统类似,gRPC也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包括参数和返回类型)。在服务器端实现这个接口,并运行一个gRPC......
  • 发布用flask框架开发的python后端程序到windows服务器
    flask框架开发的python后端程序开发好了后,怎么发布到生产环境呢?以app.run()的方式在生产环境上启动服务,当有异常特别容易退出,而且性能很弱。生产环境下,python常见的web部署搭配是nginx+gunicorn。但是这种搭配只适合在Linux环境下。gunicorn不支持windows环境。如果要搭......
  • 解决若依框架与tailwindcss 样式冲突问题
    首先下载tailwindcss样式https://www.tailwindcss.cn/docs/installation我们可以按照官方文档来进行配置 npminstall-Dtailwindcssnpxtailwindcssinit /**@type{import('tailwindcss').Config}*/module.exports={content:["./src/**/*.{html,js}"],the......
  • 基于预测与多样性保持机制的动态多目标进化算法研究(一) ——进化动态多目标优化算法框
    一、进化动态多目标优化算法框架(一)步骤进化动态多目标优化经过一段时间的发展,已经形成了相对成熟的动态多目进化算法的框架。一般地,动态多目标进化算法的步骤可以分为下面几步:第一步:随机初始化整个种群,设置算法运行需要的起始参数。第二步:环境检测:如果检测到环境发生了......
  • 框架必须
    框架必须:1.入参解析规定入参类型2种都要支持,一个是手动的,一个是自动调用的strjson2.保证主进程,服务端唯一性端口唯一,绑定端口不足:一个工具非要绑定端口,也很奇怪。这个是服务端的,给端口也没啥关系场景:部署前,端口被占用--端口可以配置僵尸进程--说明部署之后的进程......
  • 缓存框架-Spring Cache基本用法
    一、概述SpringCache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。SpringCache提供了一层抽象,底层可以切换不同的缓存实现,例如:EHCacheCaffeineRedis(常用)二、环境准备1、导入Redis和SpringCache依赖<dependency><groupId......