Redis
 sql >> Base de données >  >> NoSQL >> Redis

problème de performances du planificateur de concurrence golang + redis

Au niveau de la surface, la seule chose sur laquelle j'ai des questions est la commande d'incrémentation du groupe d'attente et la mise en file d'attente du travail :

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

Je ne pense pas que ce qui précède causera beaucoup de problèmes dans la pratique avec une telle charge de travail, mais je pense que cela peut être une condition de concurrence logique. À des niveaux de simultanéité inférieurs et à des tailles de travail plus petites, il peut mettre un message en file d'attente, passer ensuite à une goroutine qui commence à travailler sur ce message, PUIS le travail dans le groupe d'attente.

Ensuite, êtes-vous sûr de process la méthode est threadsafe ?? Je suppose que sur la base de la documentation redis go, fonctionne avec go run -race avez-vous une sortie ?

À un moment donné, il est tout à fait raisonnable et on s'attend à ce que les performances diminuent. Je recommanderais de commencer les tests de performances pour voir où la latence et le débit commencent à chuter :

peut-être un pool de 10, 100, 500, 1000, 2500, 5000, 10000, ou tout ce qui a du sens. IMO, il semble qu'il y ait 3 variables importantes à régler :

  • Taille du pool de nœuds de calcul
  • Taille de la mémoire tampon de la file d'attente de travail
  • Redis MaxActive

La chose la plus importante qui saute aux yeux est qu'il semble que redis.Pool soit configuré pour autoriser un nombre illimité de connexions :

 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)
        },
    }

// Nombre maximum de connexions allouées par le pool à un instant donné.// A zéro, il n'y a pas de limite au nombre de connexions dans le pool.MaxActive int

J'essaierais personnellement de comprendre où et quand les performances commencent à baisser par rapport à la taille de votre pool de travailleurs. Cela pourrait faciliter la compréhension des contraintes de votre programme.