Go 定时器的使用
在执行定时任务的场景,每隔几秒钟就会执行一次,触发任务。go提供了time包,用来实现延时,只需要循环执行延时,就可以实现定时器功能。但是关于它的使用和实现,需要具体分析一下。 实现原理go的time包里面提供了两个函数用于延时,分别是func After(d Duration) <-chan Time 和func Tick(d Duration) <-chan Time。而他们分别调用func NewTimer(d Duration) *Timer和func NewTicker(d Duration) *Ticker来实现这个延时的。两个函数的实现差异只在变量t的赋值上,NewTimer使用Timer实现,NewTicker使用Ticker实现。两个结构体的数据结构完全一样,因此他们实际实现的效果也是完全一致的。 NewTicker的实现如下 1234567891011121314151617181920func NewTicker(d Duration) *Ticker { if d <= 0 { panic(errors.New(&q...
gin.ctx不建议在协程内使用
首先给个结论:千万不要再请求里面,把上下文直接传递到野生goroutine里面 先来看一个现象代码如下: 12345678910111213141516func(ctx *gin.Context) { _uuid := uuid.New().String() ctx.Set("uuid", _uuid) go func(c *gin.Context, u string) { time.Sleep(time.Second) cu := c.GetString("uuid") if cu == u { log.Printf("一致 %p, %s\n", c, u) } else { log.Printf("不一致 %p, uuid = %s, cuuid = %s\n", c, u, cu) } }(ctx, _uuid) ctx.JSON(200, _uuid) return} 请求开始生成一个uui...
跨国数据同步系统设计与实现
最近完成一个俄罗斯与中国同时在线使用的集生产物流销售出库于一体的(供应链)系统。从这个系统的设计之初到完成,经历了有半年有余。本篇记录一下这个系统实现的核心架构思路。 现状 2019年一共做了两个俄罗斯的项目。因为第一个项目的原因,对于俄罗斯运营商提供的服务器的跨国网络质量实在是无法恭维。有从各个渠道了解到阿里云是莫斯科是有节点的,但是并不对外开放销售。因此,想通过阿里云架设专线的这个想法基本就可以不考虑了。 需求方要求,中国这边操作,俄罗斯那边也能快速获取到变更后的数据。 需求方还要求,数据要安全,保密,防止丢失。 需求方甚至还要求,到哪都要快速打开。 问题考虑 减少延迟 中国大陆到俄罗斯的延迟大概在5000ms之间,网络波动巨大,带宽非常小。在俄罗斯购买的无带宽限制的服务器在国内拉取资源,只能达到20kb/s。测试了阿里云香港节点到俄罗斯nic.ru的莫斯科节点的延迟,大概是在200ms左右,带宽能达到100M左右。而香港阿里云到杭州阿里云公网的延迟基本上就在30ms以内。因此需要实现一个双向链路莫斯科->香港->杭州,杭州->香港->莫斯...
关于
后端技术、多活架构、规则引擎、golang是我比较在行的,我将会将工作中遇到印象深刻的点,经过消化后总结出一些值得记录的观点以文章信息记录在这里。 Go语言源代码里面,有三个比较重要的目录,分别是cmd/compile,reflect,runtime。compile存放了编译期执行的逻辑,runtime代表了运行时执行的逻辑,reflect存放了基础的数据结构。 工作节奏挺快,flag 立了太多也没实现,列个目录记录一下未来需补上的内容。 如何设计一个广告投放平台自动控盘系统 :主要是讲我在某公司通过规则引擎对线上成百上千万广告进行 24 小时自动控盘,提升人效解放人力的技术演进。 设计实现一款永不重复的高性能分布式发号器:主要是讲如何设计一款高性能分布式发号器以及横向对比。








