-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Task - create a version of the cache shared between servers and based on redis #78
Comments
In GitLab by @lowzonenose on Nov 1, 2022, 10:10 changed time estimate to 120h |
In GitLab by @lowzonenose on Nov 1, 2022, 20:50 Exemple d'implémentation du cache Redis en middleware
// exposer plusieurs variables d'env pour configurer le service : **PGFS_REDIS**
// et
// mettre en place la config toml
type CacheRedis struct {...}
func redisConnect() CacheRedis {}
func redisConfig() {}
func (c *CacheRedis) set () {}
func (c *CacheRedis) get () {}
func (c *CacheRedis) active () {}
(...)
// middleware sur toutes les routes en GET
func addRoute(router *mux.Router, path string, handler func(http.ResponseWriter, *http.Request) *appError) {
addRouteWithMethod(router, path, MiddlewareRedis(handler), "GET")
}
func addRouteWithMethod(router *mux.Router, path string, handler func(http.ResponseWriter, *http.Request) *appError, method string) {
router.Handle(path, appHandler(handler)).Methods(method)
}
type appHandler func(http.ResponseWriter, *http.Request) *appError
// middleware
func MiddlewareRedis(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// logique du cache redis :
// > Redis Actif ?
// > renvoie un cache (GetRedis(something)) ou redirige vers le handler (next)
next.ServeHTTP(w, r)
})
}
// handler
func handler(w http.ResponseWriter, r *http.Request) *appError {
// logique de la reponse :
// > renvoie une reponse de la bdd
// > Redis Actif ?
// > creer une entrée dans le cache -> setRedis(something)
}
func addRouteWithMethod(router *mux.Router, path string, handler func(http.ResponseWriter, *http.Request) *appError, method string) {
router.Handle(path, appHandler(handler)).Methods(method)
}
// handler
func handler(w http.ResponseWriter, r *http.Request) *appError {
// logique de la reponse :
// > renvoie une reponse de la bdd
// > Redis Actif ?
// > creer une entrée dans le cache -> SetRedis(something)
}
// middleware
func MiddlewareRedis(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
ctx = context.WithValue(ctx, "data", something)
r = r.WithContext(ctx)
next.ServeHTTP(w, r)
})
}
// handler
func handler(w http.ResponseWriter, r *http.Request) *appError {
if data := r.Context().Value("data"); data != nil {
// some stuff...
}
} |
In GitLab by @lowzonenose on Nov 1, 2022, 20:52 added 8h of time spent |
In GitLab by @lowzonenose on Nov 2, 2022, 24:33 Autre exemple d'implémentation du cache Redis en middleware// middleware sur toutes les routes
func addRouteWithMethod(router *mux.Router, path string, handler func(http.ResponseWriter, *http.Request) *appError, method string) {
router.Handle(path, appHandler(handler)).Methods(method)
router.Use(redis.Middleware)
}
// middleware
func (c *CacheRedis) Middleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// logique du cache redis :
// > Redis Actif ?
// > renvoie un cache (getRedis(something)) ou redirige vers le handler (next)
next.ServeHTTP(w, r)
})
} type CacheRedis struct {...}
func redisConnect() CacheRedis {}
func redisConfig() {}
func (c *CacheRedis) Set () {}
func (c *CacheRedis) Get () {}
func (c *CacheRedis) Active () {}
func (c *CacheRedis) Middleware () {}
(...) |
hum ... il faut qu'on parle @lowzonenose 😄 |
marked this issue as related to #11 |
cloned to #89 |
marked this issue as related to #89 |
Créer un cache exploitant redis
Dans le cas d'un déploiement avec une scalabilité horizontale, le cache sera différent d'une instance à l'autre. Pour palier à ce problème, on peut utiliser une instance Redis qui fera le stockage du cache !
Liens utiles (lecture)
https://github.com/gorilla/mux/tree/v1.8.0
https://github.com/alrf/go_redis_pg
https://github.com/DenChenn/shorturl-maker
Middleware :
Étapes
Installer au préalable un serveur Redis
Ajouter une option du processus ou une variable d'env pour activer l'utilisation du cache Redis
Ajouter la configuration Redis (toml)
Initialiser la connexion Redis
Mettre en place une logique d’implémentation
:eye_in_speech_bubble: Redis stocke des clefs/valeurs
:eye_in_speech_bubble: où ajouter les instructions redis ?
Implémenter le middleware
cf. commentaire : exemples d'implémentation
Ajouter un test d'utilisation du cache Redis
Mettre en place un benchmark avec / sans cache Redis
Test de charge
Installer K6
Ecrire les tests K6
Mettre en place dans la CI
Visualisation des résultats dans K6 Cloud
The text was updated successfully, but these errors were encountered: