Redis
 sql >> Datenbank >  >> NoSQL >> Redis

golang + redis Concurrency Scheduler Leistungsproblem

Oberflächlich betrachtet ist das einzige, wozu ich Fragen habe, die Anordnung der Erhöhung der Wartegruppe und die Abfrage der Arbeit:

func (s *Scheduler) Enqueue(req interface{}) {
    select {
    case s.reqChan <- req:
        s.wg.Add(1)
    }
}

Ich glaube nicht, dass das Obige in der Praxis mit dieser großen Arbeitsbelastung zu großen Problemen führen wird, aber ich denke, es könnte eine logische Rennbedingung sein. Bei niedrigeren Nebenläufigkeitsebenen und kleineren Arbeitsgrößen kann es eine Nachricht in die Warteschlange einreihen, im Kontext zu einer Goroutine wechseln, die mit der Arbeit an dieser Nachricht beginnt, DANN die Arbeit in der Wartegruppe.

Als nächstes sind Sie sicher process Methode ist threadsicher? Ich würde davon ausgehen, dass dies basierend auf der redis go-Dokumentation mit go run -race ausgeführt wird Haben Sie eine Ausgabe?

Irgendwann ist es völlig vernünftig und zu erwarten, dass die Leistung abfällt. Ich würde empfehlen, Leistungstests zu starten, um zu sehen, wo Latenz und Durchsatz abfallen:

vielleicht ein Pool von 10, 100, 500, 1000, 2500, 5000, 10000 oder was auch immer Sinn macht. IMO sieht es so aus, als ob es 3 wichtige Variablen zu tunen gibt:

  • Größe des Worker-Pools
  • Größe des Arbeitswarteschlangenpuffers
  • Redis MaxActive

Das Größte, was auffällt, ist, dass es so aussieht, als wäre redis.Pool so konfiguriert, dass es eine unbegrenzte Anzahl von Verbindungen zulässt:

 pool := &redis.Pool{
        MaxIdle:     50,
        IdleTimeout: 240 * time.Second,
        TestOnBorrow: func(c redis.Conn, t time.Time) error {
            _, err := c.Do("PING")
            return err
        },
        Dial: func() (redis.Conn, error) {
            return dial("tcp", address, password)
        },
    }

// Maximale Anzahl von Verbindungen, die vom Pool zu einem bestimmten Zeitpunkt zugewiesen werden.// Bei Null gibt es keine Begrenzung für die Anzahl der Verbindungen im Pool.MaxActive int

Ich persönlich würde versuchen zu verstehen, wo und wann die Leistung in Bezug auf die Größe Ihres Worker-Pools abfällt. Dies erleichtert möglicherweise das Verständnis, wodurch Ihr Programm eingeschränkt wird.