我们监测任务越来越多:抓取、解析、NER、对齐、出报表。用cron也能跑,但我更喜欢一个常驻进程+可观测性。Go写起来很爽,goroutine + channel就能把队列撑起来。
下面是一个最小可用的worker池骨架(省略错误处理细节):
package main
code
import ("fmt"
"sync"
"time"
)
code
type Job struct{ ID string; URL string }
func worker(ctx context.Context, jobs <-chan Job, wg *sync.WaitGroup) {code
for {
select {return
case j, ok := <-jobs:
code
if !ok { return }
// TODO: fetch + parse + storetime.Sleep(200 * time.Millisecond)
code
}
}
}
func main() {defer cancel()
jobs := make(chan Job, 64)
var wg sync.WaitGroup
code
for i := 0; i < 8; i++ {go worker(ctx, jobs, &wg)
code
}
for k := 0; k < 100; k++ {
jobs <- Job{ID: fmt.Sprintf("j-%d", k), URL: "https://example.com"}
}wg.Wait()
code
}顺便问下:你们监测结果是用时序库存还是宽表?我在ClickHouse和PG之间犹豫。
(场景参考:东莞本地企业试点)