2024年11月27日
最近在处理日志上报kafka时,为防止上报过程中因kafka异常而导致主业务协程阻塞,为此建立了如下日志上报模型:日志主协程负责将消息发给生产者,再由生产者异步写入到broker集群,日志work协程则将收集的日志项通过带缓冲的channel将其传递给日志主协程,从而达到解耦。因日志模型是一对多的关系,为防止work协程长时间等待,为此为每次传递过程设置超时机制,于是在work协程中很容易写出如下代码:
2024年11月27日
用过 linux 的应该对 cron 有所了解。linux 中可以通过 crontab -e 来配置定时任务。不过,linux 中的 cron 只能精确到分钟。而我们这里要讨论的 Go 实现的 cron 可以精确到秒,除了这点比较大的区别外,cron 表达式的基本语法是类似的。(如果使用过 Java 中的 Quartz,对 cron 表达式应该比较了解,而且它和这里我们将要讨论的 Go 版 cron 很像,也都精确到秒) cron(计划任务),顾名思义,按照约定的时间,定时的执行特定的任务(job)。cron 表达式 表达了这种约定。 cron 表达式代表了一个时间集合,使用 6 个空格分隔的字段表示。
2024年11月27日
在做监控系统的时候,用到了定时任务来定时获取一些硬件的数据。于是就对比了一下go的定时任务实现和java的定时任务实现。这里只是对比了java的timer和go的time.NewTicker(),time.After().
1. 延时执行的实现
go的用法为:
timer := time.AfterFunc(1*time.Second, Add1)
timer.Stop()
2024年11月27日
如果希望在将来的某个时间点执行Go代码,或者在某个时间间隔重复执行Go代码,使用Go内置的timer和ticker功能。
先看定时器timer,然后再看计时器ticker。定时器代表未来的单个事件。告诉定时器需要等待多长时间,它返回一个通道,时间到后通道得到通知。如例所示设置定时器将等待2秒,语法<-timer1.C将阻塞定时器的内部通道C,直到定时器向通道发送一个指示定时器触发的值。
2024年11月27日
一个系统中存在着大量的调度任务,同时调度任务存在时间的滞后性,而大量的调度任务如果每一个都使用自己的调度器来管理任务的生命周期的话,浪费cpu的资源而且很低效。
本文来介绍 go-zero
中 延迟操作,它可能让开发者调度多个任务时,只需关注具体的业务执行函数和执行时间「立即或者延迟」。而 延迟操作,通常可以采用两个方案:
2024年11月27日
gocron是一个用go写的轻量级的定时任务集中管理和调度的系统,主要用于替代liunx的crontab,我们为什么会用这个系统呢,最主要可视化,方便管理,看日志和执行时间方便。
2024年11月27日
dottask - https://github.com/devfeel/dottask
特性
2024年11月27日
用Hangfire 用来创建定时任务,实现数据库的定时插入操作
1、创建webapi,并引入Hangfire;包括1、Hangfire.AspNetCor 2、Hangfire.MemoryStorage 程序包。
2、在program 中增加Hangfire 的配置:
2024年11月27日
gocron是一个用go写的轻量级的定时任务集中管理和调度的系统,主要用于替代liunx的crontab,我们为什么会用这个系统呢,最主要可视化,方便管理,看日志和执行时间方便。