当前位置: 首页 > 后端技术 > PHP

Supervisor的使用与进阶(四)——SupervisorEvent的使用

时间:2023-03-29 23:24:02 PHP

本文主要介绍supervisorEvent的功能。supervisor作为进程管理工具,在3.0版本之后增加了Event的高级特性,主要用于事件告警服务(进程启动、退出、失败等)。Event特性是在supervisord中注册监听服务(listener),当supervisord监听到对应的事件时,会将事件信息推送给监听对应事件的监听器。事件类型Event可以设置27种事件类型,分为以下几类:1.监控进程状态转移事件;2.监控进程状态日志变化事件;3、进程组中的进程增删改事件;4.supervisord进程本身logChange事件;5、supervisord进程自身状态变化事件;6.定时触发事件。可以单独监视事件,或者一个侦听器可以监视多个事件。配置说明对于一个监听器,与普通程序的区别在于增加了events参数来标识需要监听的事件。[eventlistener:theeventlistenername]events=PROCESS_STATE,TICK_60buffer_size=10;事件池大小(输入流大小)事件类型配置多个,以逗号分隔。上面的配置是子进程状态的变化,事件通知缓冲区的大小有规律的60s通知间隔为60s,可以自定义。上面的配置是10个事件消息的缓冲区。Listener的实现与supervisord交互,因为supervisord是listener的父进程,所以交互方式采用最简单的标准输入输出方式。监听器通过标准输入获取事件,通过标准输出通知supervisord监听器事件处理结果,以及当前supervisord监听器的状态。监听器有三种状态:ACKNOWLEDGED、READY、BUSY。ACKNOWLEDGED:监听器的状态是没有准备好。(发送READY前的状态)READY:等待事件触发的状态。(发送READY消息后没有收到消息的状态)BUSY:事件处理中的状态。(即Event消息处理完后输出OK,FAIL时的状态)消息协议消息包括supervisord通知listener的事件消息和listener通知supervisord的状态变化消息。监听器的状态变化消息,READY状态OK的“READYn”消息,“RESULT2nOK”消息处理失败,“RESULT4nFAIL”消息supervisord广播的事件消息,事件消息分为两种部分:标头和有效载荷。header以kv的形式发送,header中包含payload的长度。例如官网提供的header示例:ver:3.0server:supervisorserial:21pool:listenerpoolserial:10eventname:PROCESS_COMMUNICATION_STDOUTlen:54header含义:serial是事件池的序号表示进程池名称监听器的(监听器支持启动多个)poolserial表示监听器的进程池序号eventname事件名lenbodylength监听器的基本流程监听器的处理流程如下:1.发送就绪消息并等待要发生的事件。2.接收到事件后,处理事件3.事件处理完成后,发送结果消息,从第一步开始循环流程状态转换。下面以进程状态转换为例简单介绍一下。首先用golang实现listenerpackagemainimport("bufio""os""strconv""strings")constRESP_OK="RESULT2\nOK"constRESP_FAIL="RESULT4\nFAIL"funcmain(){stdin:=bufio.NewReader(os.Stdin)stdout:=bufio.NewWriter(os.Stdout)stderr:=bufio.NewWriter(os.Stderr)for{//发送后等待接收事件_,_=stdout.WriteString("READY\n")_=stdout.Flush()//接收标题行,_,_:=stdin.ReadLine()stderr.WriteString("read"+string(line))stderr.Flush()header,payloadSize:=praseHeader(line)//接收有效载荷payload:=make([]byte,payloadSize)stdin.Read(payload)stderr.WriteString("read:"+string(payload))stderr.Flush()result:=alarm(header,payload)ifresult{//发送处理结果stdout.WriteString(RESP_OK)}else{stdout.WriteString(RESP_FAIL)}stdout.Flush()}}funcpraseHeader(data[]byte)(headermap[string]string,payloadSizeint){pairs:=strings.Split(string(data),"")header=make(map[string]string,len(pairs))for_,pair:=rangepairs{token:=strings.Split(pair,":")header[token[0]]=token[1]}payloadSize,_=strconv.Atoi(header["len"])返回header,payloadSize}//这里可以设置告警funcalarm(headermap[string]string,payload[]byte)bool{//发送邮件返回true}这里告警处理不填接下来在里面添加配置supervisor,monitorService:[eventlistener:listener]command=/root/listenerevents=PROCESS_STATE,TICK_5stdout_logfile=/var/log/tmp/listener_test_stdout.logstderr_logfile=/var/log/tmp/listener_test_stderr.loguser=root这里监听处理状态服务,每5秒发送一次心跳消息。最后,启动侦听器。supervisorctstartlistener从stderr日志可以看到,一个简单的TICK_5消息(调整格式):header:ver:3.0server:supervisorserial:256pool:listener_testpoolserial:173eventname:TICK_5len:15readpayload:when:1586258030Fastcgi进程状态更改消息:标头:ver:3.0server:supervisorserial:291pool:listener_testpoolserial:208eventname:PROCESS_STATE_EXITEDlen:87payload:processname:fastcgi_testgroupname:fastcgi_testfrom_state:RUNNINGid:3adheed91ver:01pserver:supervisorserial:293pool:listener_testpoolserial:210eventname:PROCESS_STATE_STARTINGlen:73payload:processname:fastcgi_testgroupname:fastcgi_testfrom_state:EXITEDtries:0events参考