|
|
|
@ -4,6 +4,7 @@ import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"context"
|
|
|
|
|
"dsDataex/MyService/DataEX"
|
|
|
|
|
"dsDataex/MyTask/Kafka2ES/Kafka2ESTask"
|
|
|
|
|
"dsDataex/Utils/ConfigUtil"
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"fmt"
|
|
|
|
@ -14,17 +15,19 @@ import (
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var KafkaBroker string
|
|
|
|
|
var CTX context.Context
|
|
|
|
|
|
|
|
|
|
var writerPool map[string]*kafka.Writer
|
|
|
|
|
var kafkaPool map[string]map[int]*kafka.Conn
|
|
|
|
|
var kafkaParts map[string]int
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
//控制 consume 子线程 关闭
|
|
|
|
|
var ChanTopicProc map[string][]chan bool
|
|
|
|
|
//记录 consume 子线程状态 ( 10 分钟内是否成功执行 ReadMessage,不执行自动关闭子线程 )
|
|
|
|
|
var StateTopicProc map[string][]bool
|
|
|
|
|
|
|
|
|
|
CTX=context.Background()
|
|
|
|
|
func init() {
|
|
|
|
|
|
|
|
|
|
KafkaClient, _ := kafka.DialLeader(CTX , "tcp", ConfigUtil.KafkaBrokers[0], "__consumer_offsets" , 0)
|
|
|
|
|
KafkaClient, _ := kafka.DialLeader(context.Background() , "tcp", ConfigUtil.KafkaBrokers[0], "__consumer_offsets" , 0)
|
|
|
|
|
|
|
|
|
|
brokers,_:= KafkaClient.Brokers()
|
|
|
|
|
KafkaBroker=brokers[0].Host+":"+strconv.Itoa(brokers[0].Port)+"【"+strconv.Itoa(brokers[0].ID)+"】"
|
|
|
|
@ -36,7 +39,7 @@ func init() {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Author zhangjun
|
|
|
|
|
* @Description
|
|
|
|
|
* @Description 发送 Kafka 消息,如果 Topic为空,创建 Topic
|
|
|
|
|
* @Date 2020-07-27 05:26
|
|
|
|
|
* @Param
|
|
|
|
|
* @return
|
|
|
|
@ -48,7 +51,7 @@ func ProvideLow(topic string,datas []DataEX.KafkaData)(bool,string){
|
|
|
|
|
|
|
|
|
|
if flag==false{
|
|
|
|
|
|
|
|
|
|
client,_= kafka.DialLeader(CTX, "tcp", ConfigUtil.KafkaBrokers[0], topic , 0)
|
|
|
|
|
client,_= kafka.DialLeader(context.Background(), "tcp", ConfigUtil.KafkaBrokers[0], topic , 0)
|
|
|
|
|
|
|
|
|
|
clients=make(map[int]*kafka.Conn)
|
|
|
|
|
clients[0]=client
|
|
|
|
@ -62,7 +65,7 @@ func ProvideLow(topic string,datas []DataEX.KafkaData)(bool,string){
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
CreateTopic(topic)
|
|
|
|
|
|
|
|
|
|
client, _ = kafka.DialLeader(CTX, "tcp", ConfigUtil.KafkaBrokers[0], topic , 0)
|
|
|
|
|
client, _ = kafka.DialLeader(context.Background(), "tcp", ConfigUtil.KafkaBrokers[0], topic , 0)
|
|
|
|
|
|
|
|
|
|
clients=make(map[int]*kafka.Conn)
|
|
|
|
|
clients[0]=client
|
|
|
|
@ -86,7 +89,7 @@ func ProvideLow(topic string,datas []DataEX.KafkaData)(bool,string){
|
|
|
|
|
if f==true{
|
|
|
|
|
client=c
|
|
|
|
|
}else {
|
|
|
|
|
client, _ = kafka.DialLeader(CTX, "tcp", ConfigUtil.KafkaBrokers[0], topic , num)
|
|
|
|
|
client, _ = kafka.DialLeader(context.Background(), "tcp", ConfigUtil.KafkaBrokers[0], topic , num)
|
|
|
|
|
kafkaPool[topic][num]=client
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -119,6 +122,13 @@ func ProvideLow(topic string,datas []DataEX.KafkaData)(bool,string){
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Author zhangjun
|
|
|
|
|
* @Description
|
|
|
|
|
* @Date 2020-07-29 02:28
|
|
|
|
|
* @Param
|
|
|
|
|
* @return TODO:低阶接口调用不支持 ConsumerGroup,需要自己实现 ,复杂度太高 ,不采用!!!
|
|
|
|
|
**/
|
|
|
|
|
func ConsumeLow(topic string) {
|
|
|
|
|
|
|
|
|
|
KafkaClient, _ := kafka.DialLeader(context.Background(), "tcp", ConfigUtil.KafkaBrokers[0], topic , 0)
|
|
|
|
@ -135,6 +145,7 @@ func ConsumeLow(topic string) {
|
|
|
|
|
if err != nil {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
index := bytes.IndexByte(b, 0)
|
|
|
|
|
|
|
|
|
|
fmt.Println(string(b[0:index]))
|
|
|
|
@ -144,7 +155,21 @@ func ConsumeLow(topic string) {
|
|
|
|
|
//KafkaClient.Close()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Consume(topic string,group string) {
|
|
|
|
|
/**
|
|
|
|
|
* @Author zhangjun
|
|
|
|
|
* @Description 获取 Kafka 消息,GoRoutine并发, 线程阻塞式调用 !!!
|
|
|
|
|
* @Date 2020-07-29 02:31
|
|
|
|
|
* @Param
|
|
|
|
|
* @return
|
|
|
|
|
**/
|
|
|
|
|
func Consume(topic string,group string,index int) {
|
|
|
|
|
|
|
|
|
|
defer func(){
|
|
|
|
|
if err:=recover();err!=nil{
|
|
|
|
|
fmt.Println("KafkaUtil Consume Panic Recover :",err)
|
|
|
|
|
StateTopicProc[topic][index]=false
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
r := kafka.NewReader(kafka.ReaderConfig{
|
|
|
|
|
Brokers: ConfigUtil.KafkaBrokers ,
|
|
|
|
@ -155,17 +180,54 @@ func Consume(topic string,group string) {
|
|
|
|
|
MaxBytes: 10e6, // 10MB
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
//ticker :=time.NewTicker( 10 * time.Second)
|
|
|
|
|
//count:=0
|
|
|
|
|
|
|
|
|
|
myLoop:
|
|
|
|
|
for {
|
|
|
|
|
m, err := r.ReadMessage( CTX )
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
break
|
|
|
|
|
//10分钟无法ReadMessage ,关闭 Consume 线程
|
|
|
|
|
ctx,cancle :=context.WithTimeout( context.Background(),time.Minute * 10 )
|
|
|
|
|
defer cancle()
|
|
|
|
|
|
|
|
|
|
select {
|
|
|
|
|
case f := <- ChanTopicProc[topic][index]:
|
|
|
|
|
if f == true {
|
|
|
|
|
|
|
|
|
|
r.Close()
|
|
|
|
|
|
|
|
|
|
StateTopicProc[topic][index]=false
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
//case <- ticker.C:
|
|
|
|
|
// if count==0{
|
|
|
|
|
// r.Close()
|
|
|
|
|
//
|
|
|
|
|
// StateTopicProc[topic][index]=false
|
|
|
|
|
// return
|
|
|
|
|
// }else {
|
|
|
|
|
// count=0
|
|
|
|
|
// }
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
|
|
msg, err := r.ReadMessage(ctx)
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
//fmt.Println("KafkaUtil ReadMessage Error :",err.Error())
|
|
|
|
|
break myLoop
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//count++
|
|
|
|
|
Kafka2ESTask.Process(topic, msg)
|
|
|
|
|
//fmt.Printf("message at partiton %d offset %d: %s ==> %s\n",msg.Partition, msg.Offset, string(msg.Key), string(msg.Value))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fmt.Printf("message at partiton %d offset %d: %s ==> %s\n",m.Partition, m.Offset, string(m.Key), string(m.Value))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StateTopicProc[topic][index]=false
|
|
|
|
|
|
|
|
|
|
r.Close()
|
|
|
|
|
|
|
|
|
|
fmt.Printf("KafkaUtil Consume Stop ,Topic:%s,ConsumerGroup:%s,GoroutineNO:%d.\n",topic,group,index)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -205,7 +267,7 @@ func Provide(topic string,datas []DataEX.KafkaData)(bool,string){
|
|
|
|
|
|
|
|
|
|
fmt.Println("Time 9:",time.Now(),",spend:",time.Since(begin))
|
|
|
|
|
|
|
|
|
|
err:= w.WriteMessages(CTX ,messages...)
|
|
|
|
|
err:= w.WriteMessages( context.Background() ,messages...)
|
|
|
|
|
|
|
|
|
|
fmt.Println("Time 10:",time.Now(),",spend:",time.Since(begin))
|
|
|
|
|
//w.Close()
|
|
|
|
@ -219,12 +281,19 @@ func Provide(topic string,datas []DataEX.KafkaData)(bool,string){
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Author zhangjun
|
|
|
|
|
* @Description 创建 Kafka Topic
|
|
|
|
|
* @Date 2020-07-29 02:30
|
|
|
|
|
* @Param
|
|
|
|
|
* @return
|
|
|
|
|
**/
|
|
|
|
|
func CreateTopic(topic string){
|
|
|
|
|
|
|
|
|
|
KafkaClient, _ := kafka.DialLeader(CTX , "tcp", ConfigUtil.KafkaBrokers[0], "__consumer_offsets" , 0)
|
|
|
|
|
KafkaClient, _ := kafka.DialLeader( context.Background() , "tcp", ConfigUtil.KafkaBrokers[0], "__consumer_offsets" , 0)
|
|
|
|
|
|
|
|
|
|
err:= KafkaClient.CreateTopics(kafka.TopicConfig{
|
|
|
|
|
NumPartitions: 8,
|
|
|
|
|
NumPartitions: int(ConfigUtil.KafkaParts),
|
|
|
|
|
ReplicationFactor: int(ConfigUtil.KafkaReply),
|
|
|
|
|
Topic: topic,
|
|
|
|
|
})
|
|
|
|
@ -234,8 +303,15 @@ func CreateTopic(topic string){
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Author zhangjun
|
|
|
|
|
* @Description 删除Kafka Topic
|
|
|
|
|
* @Date 2020-07-29 02:30
|
|
|
|
|
* @Param
|
|
|
|
|
* @return
|
|
|
|
|
**/
|
|
|
|
|
func DeleteTopic(topic string){
|
|
|
|
|
KafkaClient, _ := kafka.DialLeader( CTX, "tcp", ConfigUtil.KafkaBrokers[0], topic , 0)
|
|
|
|
|
KafkaClient, _ := kafka.DialLeader( context.Background(), "tcp", ConfigUtil.KafkaBrokers[0], topic , 0)
|
|
|
|
|
|
|
|
|
|
err:= KafkaClient.DeleteTopics(topic)
|
|
|
|
|
|
|
|
|
|