GO 日志监控系统(并发与并行)

nignx(日志文件)–>log_process(实时读取解析写入)–>influxdb(存储)–>grafana(展现)

常见并发模型

1.进程&线程(apache)  C10K

2.异步非阻塞(nginx,libevent,nodejs) 复杂度高

3.协程(golang,erlang,lua)

goroutines(程序并发执行)

1.程序并发执行(goroutine)

2.多个goroutine间的数据同步和通信(channels)

3.多个channel选择数据读取或者写入(select)

golang的并发与并行

将复杂的任务拆分,通过goroutine去并发执行

通过channel做数据通信

goroutines(程序并发执行)

foo() //执行函数foo,程序等待函数foo返回

go foo() //执行函数foo

bar() //不用等待foo返回

channels (多个goroutine间的数据通信与同步)

c:=make(chan string) //创建一个channel

go func(){

    time.Sleep(1*time.second)

    c<-"message from closure" //发送数据到channel中

}()

msg:=<-c //阻塞直到接收到数据

select(从多个channel中读取或写入数据)

select {

    case v:=<-c1:

        fmt.println("channel 1 sends",v)

    case v:=<-c2:

        fmt.println("channel 2 sends",v)

    default: //多选

        fmt.println("neither channel was ready")

}

并发与并行

定义:

1.并发:指同一时刻,系统通过调试,来回切换交替的运行多个任务,“看起来”是同时进行

2.并行:指同一时刻,两个任务“真正的”同时进行

解析模块的实现

1.从read channel中读取每行日志数据

2.下则提取所需的监控数据(path,status,method等)

3.写入write channel


发表评论

您的电子邮箱地址不会被公开。