Ir combate proyecto: la construcción de sistema de recopilación de registros altamente concurrente (nueve)

antecedente de la opinión

Hemos completado previamente implementaciones lógicas de consumo kafka, y poner noticias elasticsearch, a continuación, echa un vistazo a nuestras herramientas de visualización de registros Kibana.

Este objetivo sección

Anteriormente acaba de terminar el consumo de noticias kafka, y poner elástica, esto mejorará el proyecto para que apoye la actualización caliente es que cuando config.yaml en el seguimiento del registro de cambios, o los datos ETCD ha cambiado dinámicamente iniciar el monitor nuevo registro corrutina cerca cancelar la co-rutina de monitoreo de registro.

Nueva Co Chengzi Qi variable de control móvil

Agregue el siguiente código kafkaconsumer.go

var topicMap mapa [cadena] mapa [int32] * TopicData 
var map topicSet [cadena] bool 
var etcd_topicSet mapa [cadena] bool 
var etcd_topicMap mapa [cadena] mapa [int32] * TopicData 
var topicChan Chan * TopicPart 
var etcd_topicChan Chan * TopicPart 
var consumer_list [] sarama.Consumer 
var etcdcli * clientv3.Client 

func init () { 
	topicMap = marca (mapa [cadena] mapa [int32] * TopicData) 
	etcd_topicMap = marca (mapa [cadena] mapa [int32] * TopicData) 
	topicSet = make ( mAP [string] bool) 
	etcd_topicSet = make (map [string] bool) 
	topicChan = make (Chan * TopicPart, 20) 
	etcd_topicChan = make (Chan * TopicPart, 20) 
	consumer_list = make ([] sarama.Consumer, 0, 20) 
}

topicMap tema y de los parámetros de registro almacenados config.yaml corrutina directamente grabada, etcd_topicMap utilizan para registrar y parámetros tema ETCD corrutina registrados.

topicSet para el registro de tema config.yaml directamente grabó, tema etcd_topicSet ETCD para la grabación grabada.
Cuando el registro de escritura topicChan anormal accidente corrutina elástica monitoreo, para devolver la información tema Chan, nos encontramos entonces el tema correspondiente reiniciado con el topicMap corrutina.
El tema etcd_topicChan corrutina almacena ETCD, el proceso de seguimiento de etlastic, si se bloquea el co-rutina, etcd_topicMap encontrar el tema que corresponde reiniciado con la co-rutina.
consumer_list salvó kafka lista de los consumidores.
ETCD etcdcli el cliente para el manejo de lector ETCD.

El conjunto configurado tema de configuración de registro generado

func ConstructTopicSet () mapa [cadena] {bool 
	topicSetTmp: = marca (mapa [cadena] bool) 
	configtopics, _: = logconfig.ReadConfig (logconfig.InitVipper () "collectlogs") 
	si configtopics == nil { 
		Goto CONFTOPIC 
	} 
	para _, configtopic: = oscilan configtopics ([] interfaz {}) {. 
		confmap: = configtopic (mapa [interfaz {}] interfaz {}). 
		para key, val: = confmap gama { 
			. Si la clave (string) == " logtopic"{ 
				topicSetTmp [. val (cadena)] = true 
			} 
		} 
	} 
CONFTOPIC: 
	retorno topicSetTmp 
}

etcdconsumer.go GetTopicSet leído por el tema de la vida y el conjunto ETCD
val adquisición según ETCD clave de configuración configurado, y luego genera un tema conjunto adquirida

 

func GetTopicSet (CLI * clientv3.Client) (interfaz de {}, el error) { 
	etcdKeys, etcdres: = logconfig.ReadConfig (logconfig.InitVipper (), "etcdkeys") 
	Si etcdres { 
		fmt.Println ( "leer config etcdkeys fallidos" ) 
		nula rentabilidad, errors.New ( "leer config etcdkeys fallido") 
	} 
	fmt.Println (reflect.TypeOf (etcdKeys)) 
	topicSet: = marca (mapa [cadena] bool) 
	para _, keyval:. = etcdKeys rango ([] interfaz {}) { 
		ctxtime, cancelación: = context.WithTimeout (context.Background (), time.Second) 
		respectivamente, se equivocan: = cli.Get (. ctxtime, keyval (cadena)) 
		Cancelar () 
		! = nil si err { 
			fmt.Println ( "Get falló, err:", err) 
			continúe 
		}
 
		para _, EV: resp.Kvs = {rango
			fmt.Printf ( "% s:% s ... \ n", ev.Key, ev.Value) 
			etcdLogConf: = make ([] * etcdlogconf.EtcdLogConf, 0, 20) 
			unmarsherr: = json.Unmarshal (ev. valor, y etcdLogConf) 
			si unmarsherr = nil {! 
				fmt.Println ( "error unmarshal, el error es!", unmarsherr) 
				continúe 
			} 

			para _, etcdval: = oscilan etcdLogConf { 
				topicSet [etcdval.Topic] = true 
			} 
		} 

	} 

	regreso topicSet, nil 

}

  

Puesto en el mapa, y luego comienza la co-rutina de configuración

func ConvertSet2Map (consumidor sarama.Consumer, mapa topicSet [cadena] bool, 
	topicMaps mapa [cadena] mapa [int32] * TopicData, topic_chan Chan * TopicPart) { 
	para key, _: = {oscilan topicSet 
		partitionList, err: = consumer.Partitions (clave) 
		Si ERR = nil {! 
			fmt.Println ( "conseguir particiones de consumo fracasaron") 
			fmt.Println ( "error", err.Error ()) 
			continuará 
		} 

		para la partición: = variar partitionList { 
			pc, err: = consumidor .ConsumePartition (clave, int32 (partición), sarama.OffsetNewest) 
			Si ERR = nil {! 
				fmt.Println ( "consumir error de la partición es", err.Error ()) 
				continuará 
			} 
			// Defer pc.AsyncClose () 
			topicData: = nueva (TopicData)
			topicData.Ctx, topicData.Cancel = context.WithCancel (context.Background ()) 
			topicData.KafConsumer = pc 
			topicData.TPartition = new (TopicPart) 
			topicData.TPartition.Partition = int32 (partición) 
			topicData.TPartition.Topic = clave 
			_, OKM: = topicMaps [clave] 
			Si OKM { 
				topicMaps [clave] = Marca (MAP [Int32] * TopicData) 
			} 
			topicMaps [clave] [int32 (partición)] = topicData 
			ir PutIntoES (topicData, topic_chan) 

		} 
	} 
}

Kafka lee en el mensaje, y llama a la función anterior comienza a monitorizar es corrutina

Kafka leer información de, y luego genera un conjunto de mapas de acuerdo a la configuración y iniciar la supervisión es corrutina

func ConsumeTopic (sarama.Consumer consumidor) { 
	ConvertSet2Map (consumidor, topicSet, topicMap, topicChan) 
	ConvertSet2Map (consumidor, etcd_topicSet, etcd_topicMap, etcd_topicChan) 
	//监听配置文件
	ctx, cancelar: = context.WithCancel (context.Background ()) 
	pathChan : = make (Chan interfaz {}) 
	etcdChan: = make (Chan interfaz {}) 
	ir logconfig.WatchConfig (CTX, logconfig.InitVipper (), pathChan, etcdChan) 
	Defer func (cancelar context.CancelFunc) { 
		consumer_once.Do (func () { 
			Si ERR:! = recuperarse (); err = nil { 
				fmt.Println ( "principal pánico goroutine consumidor", err) 
			} 
			cancelar () 
		}) 

	} (cancelar) 

	para { 
		seleccionar { 
		//检测监控路径的协程崩溃,重启
		topicpart caso: = <-topicChan: 
			fmt.Printf ( "el recibir goroutines la Exited, Tema% S es, es partición% D \ n-", 
				topicpart.Topic, topicpart.Partition) 
			datos de los consumidores // reinicio de lectura corrutina 
			val , OK: = topicMap [topicpart.Topic] 
			SI OK {! 
				Continuar 
			} 
			TP, OK: Val = [topicpart.Partition] 
			! SI OK { 
				Continuar 
			} 
			tp.Ctx, tp.Cancel = context.WithCancel (context.Background () ) 
			Go PutIntoES (TP, topicChan) 
		// analizar la configuración ETCD detección, seguimiento accidente camino corrutina, reiniciar 
		Case topicpart: = <-etcd_topicChan: 
			fmt.Printf ( "el recibir goroutines la Exited, Tema% S es, es partición% D \ n", 
			val, OK: = etcd_topicMap [topicpart.Topic ] 
				topicpart.Topic, topicpart.Partition)
			// leer la co-rutina de reinicio de datos de consumidores 
				para logkey, logval :. = chval Rango (Mapa [interfaz de {}] interfaz de { }) {
			Si bien {! 
				continuarán 
			} 
			tp, bien: val = [topicpart.Partition] 
			Si bien { 
				seguir 
			} 
			tp.Ctx, tp.Cancel = context.WithCancel (context.Background ()) 
			ir PutIntoES (tp, etcd_topicChan) 
		//检测vipper监控返回配置的更新
		pathchange caso, bien: = <-pathChan: 
			Si bien { 
				fmt.Println ( "goroutine reloj vipper salió") 
				Goto LoopEnd 
			} 
			//fmt.Println(pathchange) 
			topicSetTemp: = marca (mapa [ string] bool) 
			para _, chval:. = pathchange gama ([] interfaz {}) { 
					si logkey (string) == "logtopic" {. 
						topicSetTemp [logval (string)] = TRUE. 
					} 
				} 
			} 
			UpdateTopicLogRoutine (topicSetTemp) 

			//fmt.Println(topicSetTemp) 
		caso etcdchange, OK: = <-etcdChan: 
			Si bien { 
				FMT .println ( "goroutine reloj vipper extied") 
				Goto LoopEnd 
			} 
			fmt.Println (etcdchange) 
			topicsetTemp, err: = etcdconsumer.GetTopicSet (etcdcli) 
			! Si ERR = nil { 
				seguir 
			} 
			UpdateEtcdTopicLogRoutine (. topicsetTemp (mapa [cadena] bool)) 
		} 
	} 
LoopEnd: 
	fmt.Printf ( "para salido") 
}

  


Ir logconfig.WatchConfig corrutina inicio, configuración de monitor de llamada vipper, tema cuando está equipado con actualizaciones de manejo actualizado co-rutina consumidor.

Al mismo tiempo en que la manutención de menores corrutina colapso anormal, corrutina consumidor reiniciar la co-rutina.

Por información de registro Kibana

Kibana en el manejo de la gestión, y el nuevo índice, el índice elástico es que tema conjunto, por lo que tenemos unos cuantos nuevo índice,
etcd_log, golang_log, logdir2.
Entonces Kibana se puede ver en varias de la información del registro de índice
1.png

fuente descarga

https://github.com/secondtonone1/golang-/tree/master/logcatchsys
gracias a mi preocupación pública No.
wxgzh.jpg

Supongo que te gusta

Origin www.cnblogs.com/secondtonone1/p/12564117.html
Recomendado
Clasificación