但是,随着迁移的进行,我们发现 Skipper v1 中依旧存在一些如模块不内聚,充血模型过度设计等问题,为了更好地解决已知的架构问题,我们参考了《架构整洁之道》以及 DDD 的一些思想,再结合 Skipper v1 的实际情况,设计出了 Skipper v2 的架构。
基于Gin + Vue + Element UI OR Arco Design OR Ant Design的前后端分离权限管理系统,系统初始化极度简单,只需要配置文件中,修改数据库连接,系统支持多指令操作,迁移指令可以让初始化数据库信息变得更简单,服务指令可以很简单的启动api服务。
上图左侧是压测中代码业务逻辑函数的CPU占用情况,中间红色框内的是系统调用,图中可以看出系统调用占用CPU时间较长,且从函数名如park_m、schedule、findrunnable可以猜测出应该是与协程调度相关,这说明程序空转的时候系统在不断进行协程上下文切换,另外其中与时间相关的函数也占用了较长CPU时间。
比如我们的手机卡假设都是在每个月的开始时间就更新资费:“0 0 0 1 * ” // 表示每个月1号的00:00:00。“0 1 1 1 * ” // 表示每个月1号的01:01:00。每隔5秒执行一次:“/5 * * ?”每隔1分钟执行一次:“0 /1 * * ?”每天23点执行一次:“0 0 23 * ?”每天凌晨1点执行一次:“0 0 1 * ?”每月1号凌晨1点执行一次:“0 0 1 1 * ?”
java.util.Timer是 JDK 1.3 开始就已经支持的一种定时任务的实现方式。ElasticJob 由于在架构设计上是基于 Zookeeper ,而 XXL-JOB 是基于数据库,性能方面的话,ElasticJob 略胜一筹。
在主 goroutine 里,先用 GoMAXPROCS 函数拿到 CPU 的逻辑核心数 threads。它会切到 g0 栈执行 gopreempt_m,自然它也会保存 goroutine 的执行进度,其实就是 SP、BP、PC 寄存器的值,当 goroutine 再次被调度执行时,就会从原来的执行流断点处继续执行下去。