提交 f21c0ef2 编写于 作者: B bigsheeper 提交者: yefu.chen

Reduce cpu usage

Signed-off-by: Nbigsheeper <yihao.dai@zilliz.com>
上级 72a7af3f
...@@ -3,6 +3,7 @@ package msgstream ...@@ -3,6 +3,7 @@ package msgstream
import ( import (
"context" "context"
"log" "log"
"reflect"
"sync" "sync"
"github.com/apache/pulsar-client-go/pulsar" "github.com/apache/pulsar-client-go/pulsar"
...@@ -111,9 +112,6 @@ func (ms *PulsarMsgStream) Start() { ...@@ -111,9 +112,6 @@ func (ms *PulsarMsgStream) Start() {
func (ms *PulsarMsgStream) Close() { func (ms *PulsarMsgStream) Close() {
ms.streamCancel() ms.streamCancel()
if ms.wait != nil {
ms.wait.Wait()
}
for _, producer := range ms.producers { for _, producer := range ms.producers {
if producer != nil { if producer != nil {
...@@ -227,37 +225,59 @@ func (ms *PulsarMsgStream) Consume() *MsgPack { ...@@ -227,37 +225,59 @@ func (ms *PulsarMsgStream) Consume() *MsgPack {
func (ms *PulsarMsgStream) bufMsgPackToChannel() { func (ms *PulsarMsgStream) bufMsgPackToChannel() {
defer ms.wait.Done() defer ms.wait.Done()
cases := make([]reflect.SelectCase, len(ms.consumers))
for i := 0; i < len(ms.consumers); i++ {
ch := (*ms.consumers[i]).Chan()
cases[i] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)}
}
for { for {
select { select {
case <-ms.ctx.Done(): case <-ms.ctx.Done():
return return
default: default:
tsMsgList := make([]TsMsg, 0) tsMsgList := make([]TsMsg, 0)
for i := 0; i < len(ms.consumers); i++ {
consumerChan := (*ms.consumers[i]).Chan()
chanLen := len(consumerChan)
for l := 0; l < chanLen; l++ {
pulsarMsg, ok := <-consumerChan
if !ok {
log.Printf("channel closed")
return
}
(*ms.consumers[i]).AckID(pulsarMsg.ID())
headerMsg := internalPb.MsgHeader{} for {
err := proto.Unmarshal(pulsarMsg.Payload(), &headerMsg) chosen, value, ok := reflect.Select(cases)
if err != nil { if !ok {
log.Printf("Failed to unmarshal message header, error = %v", err) log.Printf("channel closed")
continue return
} }
tsMsg, err := ms.unmarshal.Unmarshal(pulsarMsg.Payload(), headerMsg.MsgType)
if err != nil { pulsarMsg, ok := value.Interface().(pulsar.ConsumerMessage)
log.Printf("Failed to unmarshal tsMsg, error = %v", err) if !ok {
continue log.Printf("type assertion failed, not consumer message type")
continue
}
(*ms.consumers[chosen]).AckID(pulsarMsg.ID())
headerMsg := internalPb.MsgHeader{}
err := proto.Unmarshal(pulsarMsg.Payload(), &headerMsg)
if err != nil {
log.Printf("Failed to unmarshal message header, error = %v", err)
continue
}
tsMsg, err := ms.unmarshal.Unmarshal(pulsarMsg.Payload(), headerMsg.MsgType)
if err != nil {
log.Printf("Failed to unmarshal tsMsg, error = %v", err)
continue
}
tsMsgList = append(tsMsgList, tsMsg)
noMoreMessage := true
for i := 0; i < len(ms.consumers); i++ {
if len((*ms.consumers[i]).Chan()) > 0 {
noMoreMessage = false
} }
tsMsgList = append(tsMsgList, tsMsg) }
if noMoreMessage {
break
} }
} }
if len(tsMsgList) > 0 { if len(tsMsgList) > 0 {
msgPack := MsgPack{Msgs: tsMsgList} msgPack := MsgPack{Msgs: tsMsgList}
ms.receiveBuf <- &msgPack ms.receiveBuf <- &msgPack
......
...@@ -172,15 +172,20 @@ func (ss *searchService) doUnsolvedMsgSearch() { ...@@ -172,15 +172,20 @@ func (ss *searchService) doUnsolvedMsgSearch() {
ss.unsolvedMsg = append(ss.unsolvedMsg, msg) ss.unsolvedMsg = append(ss.unsolvedMsg, msg)
} }
msgBufferLength := len(ss.msgBuffer) for {
for i := 0; i < msgBufferLength; i++ {
msg := <-ss.msgBuffer msg := <-ss.msgBuffer
if msg.EndTs() <= serviceTime { if msg.EndTs() <= serviceTime {
searchMsg = append(searchMsg, msg) searchMsg = append(searchMsg, msg)
continue continue
} }
ss.unsolvedMsg = append(ss.unsolvedMsg, msg) ss.unsolvedMsg = append(ss.unsolvedMsg, msg)
msgBufferLength := len(ss.msgBuffer)
if msgBufferLength <= 0 {
break
}
} }
if len(searchMsg) <= 0 { if len(searchMsg) <= 0 {
continue continue
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册