lb
This commit is contained in:
1 parent
7f45bd6bc9
commit
258912b33a
2 files changed
+51
-24
No files matched your search
+2
-6
@@ -26,11 +26,7 @@ type Broker struct {
|
|||||||
remotes sync.Map
|
remotes sync.Map
|
||||||
sl *Sublist
|
sl *Sublist
|
||||||
rl *RetainList
|
rl *RetainList
|
||||||
queues map[string]*Queue
|
queues map[string]int
|
||||||
}
|
|
||||||
type Queue struct {
|
|
||||||
count int
|
|
||||||
index int
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewBroker(config *Config) (*Broker, error) {
|
func NewBroker(config *Config) (*Broker, error) {
|
||||||
@@ -39,7 +35,7 @@ func NewBroker(config *Config) (*Broker, error) {
|
|||||||
config: config,
|
config: config,
|
||||||
sl: NewSublist(),
|
sl: NewSublist(),
|
||||||
rl: NewRetainList(),
|
rl: NewRetainList(),
|
||||||
queues: make(map[string]*Queue),
|
queues: make(map[string]int),
|
||||||
}
|
}
|
||||||
if b.config.TlsPort != "" {
|
if b.config.TlsPort != "" {
|
||||||
tlsconfig, err := NewTLSConfig(b.config.TlsInfo)
|
tlsconfig, err := NewTLSConfig(b.config.TlsInfo)
|
||||||
|
|||||||
+49
-18
@@ -2,7 +2,6 @@ package broker
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"hmq/packets"
|
"hmq/packets"
|
||||||
"math/rand"
|
|
||||||
"net"
|
"net"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
@@ -222,30 +221,59 @@ func (c *client) ProcessPublishMessage(packet *packets.PublishPacket) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
idx := GenerateRangeNum(0, len(r.qsubs))
|
pre := 0
|
||||||
for {
|
now := -1
|
||||||
sub := r.qsubs[idx]
|
t := "$queue/" + topic
|
||||||
if sub.client.typ == ROUTER {
|
cnt, exist := b.queues[t]
|
||||||
if typ == ROUTER {
|
if exist {
|
||||||
idx = GenerateRangeNum(0, len(r.qsubs))
|
log.Info("queue index : ", cnt)
|
||||||
continue
|
for _, sub := range r.qsubs {
|
||||||
|
if sub.client.typ == ROUTER {
|
||||||
|
if c.typ == ROUTER {
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
if c.typ == CLIENT {
|
||||||
if sub != nil {
|
now = now + 1
|
||||||
err := sub.client.WriterPacket(packet)
|
} else {
|
||||||
if err != nil {
|
now = now + sub.client.rsubs[t].num
|
||||||
log.Error("process will message for qsub error, ", err)
|
|
||||||
}
|
}
|
||||||
break
|
if cnt >= pre && cnt <= now {
|
||||||
|
if sub != nil {
|
||||||
|
err := sub.client.WriterPacket(packet)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("send publish error, ", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
pre = now
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
length := getQueueSubscribeNum(r.qsubs)
|
||||||
|
if length > 0 {
|
||||||
|
b.queues[t] = (b.queues[t] + 1) % length
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func GenerateRangeNum(min, max int) int {
|
func getQueueSubscribeNum(qsubs []*subscription) int {
|
||||||
// rand.Seed(time.Now().Unix())
|
topic := "$queue/"
|
||||||
randNum := rand.Intn(max-min) + min
|
if len(qsubs) < 1 {
|
||||||
return randNum
|
return 0
|
||||||
|
} else {
|
||||||
|
topic = topic + qsubs[0].topic
|
||||||
|
}
|
||||||
|
num := 0
|
||||||
|
for _, sub := range qsubs {
|
||||||
|
if sub.client.typ == CLIENT {
|
||||||
|
num = num + 1
|
||||||
|
} else {
|
||||||
|
num = num + sub.client.rsubs[topic].num
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return num
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *client) ProcessSubscribe(packet *packets.SubscribePacket) {
|
func (c *client) ProcessSubscribe(packet *packets.SubscribePacket) {
|
||||||
@@ -273,6 +301,9 @@ func (c *client) ProcessSubscribe(packet *packets.SubscribePacket) {
|
|||||||
if queue {
|
if queue {
|
||||||
if len(t) > 7 {
|
if len(t) > 7 {
|
||||||
t = t[7:]
|
t = t[7:]
|
||||||
|
if _, exists := b.queues[topic]; !exists {
|
||||||
|
b.queues[topic] = 0
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
retcodes = append(retcodes, QosFailure)
|
retcodes = append(retcodes, QosFailure)
|
||||||
continue
|
continue
|
||||||
|
|||||||
Reference in new issue
Block a user