Closed benoitdm-oslandia closed 1 year ago
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
Ex. Conf
// exposer plusieurs variables d'env pour configurer le service : **PGFS_REDIS**
// et
// mettre en place la config toml
Ex. Service / Data Redis
type CacheRedis struct {...}
func redisConnect() CacheRedis {}
func redisConfig() {}
func (c *CacheRedis) set () {}
func (c *CacheRedis) get () {}
func (c *CacheRedis) active () {}
(...)
Ex. Request GET :
ajout du middleware Redis
// 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) }
* Ex. Request POST :
> - aucune modifiation des signatures
> - chaque handler possède le code Redis -> SetRedis(something)
```go
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)
}
passage d'informations du middleware vers le handler dans le contexte de la requête
// 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
// 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 :smile:
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