skynet热更新-clearcache的使用体会

本文探讨了Skynet热更新的两种主要方法:clearcache和consoleinjectlua。对于动态创建的服务,clearcache能确保下次创建的服务使用新代码。而对于长期存在的服务,可以通过注入脚本或轮服机制进行更新。文中提出在有状态服务前增加调度服务的策略,通过clearcache创建新服务并转发请求,避免直接更新原有服务。这种方法在无状态服务中尤为适用,但需注意数据迁移和定时器管理。作者期待更多关于Skynet热更新的解决方案分享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

skynet热更新-clearcache的使用体会

skynet 热更新主要有2种方法

  • 第一种:使用clearcache
  • 第二种:使用console inject lua脚本

动态创建的服务的热更新

  • 如果一个skynet服务是在业务流程中动态创建的,那么在修改代码后,使用clearcache就可以保证下次再创建的新的服务是使用的新的代码。

创建后长期不销毁重建的服务,如何热更新?

  • 如果是在进程启动时创建,或创建后就一直存在的服务需要热更新怎么办呢?

    • 方法1: 对于这种情况目前inject是首选。但是有时候需要修改的代码量比较大,inject 脚本的方式就非常复杂且容易出错。
    • 方法2: 当然,还有一种方式就是采用轮服的机制解决。从进程级别解决问题。但是这个代价又太大了,比clearcache的成本还高。
  • 这里我们还有一个思路就是可以在业务服前加一个管理调度服务。例如A1 skynet服务需要发消息给B1 skynet服务来实现某个功能。消息流为:

A1 ---> B1
  • 我们可以在B1前加一个B_manager服务,A服务通过B_manager服来传递消息给B1服务, 消息流为:
A1 ---> B_Manager ---> B1
  • 这个时候如果B1的业务有大量需要修改的。只需要clearcache一下,让后创建一个新的B1服务,这里称为B2,B_Manager再讲A1的请求转发到B2即可,这个时候的消息流为:
A1 ---> B_Manager ---> B2
  • 这个时候B1就不会接收到新的消息了。介意B1的存在可以销毁它,如果资源暂用不大,也可以不销毁。

  • 当然这里有几个必须要注意的问题:

    • 如果B1服务是有状态的,那么这个方法是有很大限制的,需要把B1服务的数据通过消息或共享内存,缓存等方式转移到B2服务上。
    • 如果B1服务上有定时器等可能会影响业务的逻辑时时,必须要关闭定时器或销毁B2服务。
    • 如果B1是无状态的那就简单多了,创建新的服务B2后,B_mananger将所有需要转发给B1的请求全都转发给B2即可。
    • 消息中间多了一层B_Manager会不会损失性能,这个需要视业务要求来具体分析,大部分情况,这点新能损失都可以忽略不计的;当然如果你很介意的话,还是建议业务刚上线前使用中的B_Manager,业务稳定后,再在某次更新可以将这层转发层去掉。
  • 上面的方法也是一种折中的方法,个人感觉还是比较好用的,但是也是不完美的。

  • 关于skynet的热更新,如果你有什么更好的方案,希望能够指点一二!

  • 个人的一点想法,分享给大家!如果你也在使用skynet,关注我,一起学习,交流一下!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打杂程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值