Comment implémenter les notifications d'espace de clés Redis dans ElastiCache ?

Lecture de 6 minute(s)
0

Comment implémenter les notifications d'espace de clés Redis dans Amazon ElastiCache ?

Brève description

Les notifications d'espace de clés Redis vous permettent de vous abonner aux canaux PubSub. Via le canal, les clients reçoivent des événements publiés lorsqu'une commande Redis ou une modification de données se produit. Ces notifications sont utiles lorsqu'une application doit répondre à des modifications apportées à la valeur stockée dans une ou plusieurs clés particulières. Vous pouvez également suivre les modifications apportées à l’ensemble de données à l'aide des notifications d'espace de clés Redis. La fonction de notification d'espace de clés est disponible dans les versions 2.8.6 et ultérieures.

Lorsqu'une commande s'exécute et déclenche une notification d'espace de clés Redis, les deux événements suivants se produisent auxquels les clients de surveillance répondent :

  • Notification d'espace de clés
  • Notification d'événements de clés

Le canal d'espace de clés reçoit le nom de l'événement et le canal d'événement de clés reçoit le nom de la clé sous forme de message.

Important : La résolution suivante s'applique uniquement aux clusters Redis (mode cluster désactivé). La résolution ne s'applique pas aux clusters Redis (mode cluster activé). Pour plus d'informations sur les notifications relatives aux espaces de saisie pour les deux types de clusters, consultez la section Notifications Redis Keyspace sur le site Redis.

Solution

Activer la notification d'espace de clés Redis

ElastiCache désactive les notifications d'espace de clés Redis par défaut. Vous pouvez activer les notifications d'espace de clés dans un groupe de paramètres de cache personnalisé à l'aide du paramètre notify-keyspace-events. La valeur notify-keyspace-events prend un certain nombre de paramètres afin de déterminer le type de canal à utiliser (événements keyspace ou key-event) et les informations à publier sur ces canaux. Pour plus d'informations, consultez les paramètres ajoutés à Redis 2.8.6.

1.    Ouvrez la console ElastiCache.

2.    Pour afficher la liste de tous les groupes de paramètres disponibles, choisissez Groupes de paramètres dans le panneau de navigation.

3.    Sélectionnez le groupe de paramètres que vous souhaitez modifier.
Remarque : vous ne pouvez pas modifier un groupe de paramètres par défaut. Si tous les groupes de paramètres répertoriés sont par défaut, créez un nouveau groupe de paramètres en choisissant Créer un groupe de paramètres, sélectionnez une famille, puis choisissez Créer.

4.    Choisissez Modifier les paramètres.

5.    Faites défiler jusqu'à notify-keyspace-events, puis entrez AKE dans le champ Valeur. Pour plus d'informations sur les valeurs autorisées, consultez les paramètres ajoutés à Redis 2.8.6.

6.    Choisissez Enregistrer les modifications. Les modifications prennent effet immédiatement sans redémarrer le cluster.
Remarque : veillez à affecter le nouveau groupe de paramètres modifiés à votre cluster Redis.

Générer des événements à l'aide de redis-cli

Si vous utilisez redis-cli, vous pouvez exécuter la commande suivante pour voir comment une commande donnée génère des événements :

#./redis-cli -c -h testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com -p 6379 --csv psubscribe '__key*__:*'

Exécutez n'importe quel ensemble de commandes pour créer des événements d'espace de clés. Les commandes suivantes définissent la valeur et le délai d'expiration à 3 secondes pour la clé Redis et l'abonné pour les événements expirés.

./redis-cli -c -h testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com -p 6379
testdisabled.xm4oz6.ng.0001.use1.cache.amazonaws.com:6379>
testdisabled.xm4oz6.ng.0001.use1.cache.amazonaws.com:6379> SET key1 value1 ex 5
testdisabled.xm4oz6.ng.0001.use1.cache.amazonaws.com:6379>

Dans une autre session, vérifiez que les événements sont générés. Voici un exemple de sortie des événements :

# ./redis-cli -h testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com -p 6379 --csv psubscribe '*'
Reading messages... (press Ctrl-C to quit)
"psubscribe","*",1
"pmessage","*","__keyspace@0__:key1","set"
"pmessage","*","__keyevent@0__:set","key1"
"pmessage","*","__keyspace@0__:key1","expire"
"pmessage","*","__keyevent@0__:expire","key1"
"pmessage","*","__keyspace@0__:key1","expired"
"pmessage","*","__keyevent@0__:expired","key1"

Dans cet exemple de sortie, le premier événement indique que vous avez réussi à vous abonner à un canal. Le nombre 1 représente le nombre de canaux auxquelles vous êtes abonné actuellement.

Le deuxième événement est une notification keyspace. Le canal d'espace de clés __keyspace @0__:key1 contient le nom de l'événement « set » comme message.

Le troisième événement est une notification key-event. Le canal d'événement clé __keyevent @0__:set contient le nom de la clé « key1 » comme message.

Après 5 secondes, vous pouvez regarder le message expiré dans la sortie. Il y a des différences subtiles dans les messages. Un message est __keyevent @0__:expire alors qu'un autre message est __keyevent @0__:expiré.

Chaque message lu à partir de l'instance PubSub est un dictionnaire avec les clés suivantes :

  • Type - Un des éléments suivants : abonnement, désabonnement, psubscribe, punsubscribe, message, pmessage
  • Modèle - Modèle qui correspond au canal du message publié (à l'exception du type pmessage, qui ne correspond pas dans tous les cas)
  • Canal - Canal vers lequel le message est publié ou canal auquel le message est abonné.
  • Données - Données de message

Générer des événements à l’aide de Redis-py

1.    Abonnez-vous aux notifications. L'exemple suivant s'abonne à toutes les notifications d'espace de clés et imprime les événements reçus. Utilisez le script approprié pour Python2 ou Python3.

Pour Python2 :

# cat subscribe.py 
import redis
import datetime
import time
r = redis.Redis(host='testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com', port=6379, db=0)
#Subscribing for events matching pattern "__key*__:*"
p = r.pubsub()
p.psubscribe('__key*__:*')
print('Starting message loop')
while True:
    message = p.get_message()
    if message:
        print datetime.datetime.now(), message
    else:
        time.sleep(0.01)

Pour Python3 :

import redis
from datetime import datetime
import time
r = redis.Redis(host = 'testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com', port = 6379, db = 0)
#Subscribing for events matching pattern "__key*__:*
p = r.pubsub()
p.psubscribe('__key*__:*')
print('Starting message loop')
while True:
    message = p.get_message()
    if message:
        print (datetime.now(), message)
    else:
        time.sleep(0.01)

Remarque : des valeurs plus faibles ou l'absence de veille obligent le client à interroger constamment le canal, ce qui risque de surcharger le serveur. Des valeurs plus élevées provoquent une plus grande utilisation de la mémoire côté serveur. L'exemple précédent définit time.sleep sur (0.01).

2.    Définir ou expirer des clés.

Dans une autre session, connectez-vous au cluster et exécutez la commande createkey.py. Définissez la clé key2 avec la valeur value2 et le délai d'expiration de 3 secondes.

# cat createkey.py
import redis
  r = redis.Redis(host='testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com', port=6379, db=0)
  r.set('key2,’value2’)
  r.expire('key2’,3)

Exécutez la commande subscribe.py dans une autre session. Voici un exemple de sortie :

# python2 subscribe.py

Starting message loop
2020-08-17 18:16:23.902762 {u'pattern': None, u'type': 'psubscribe', u'channel': '__key*__:*', u'data': 1L}
2020-08-17 18:16:50.375281 {u'pattern': '__key*__:*',
    u'type': 'pmessage', u'channel': '__keyspace@0__:key2', u'data': 'set'}
2020-08-17 18:16:50.375365 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:set', u'data': 'key2'}
2020-08-17 18:16:50.375442 {u'pattern': '__key*__:*',
    u'type': 'pmessage', u'channel': '__keyspace@0__:key2', u'data': 'expire'}
2020-08-17 18:16:50.375499 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:expire', u'data': 'key2'}
2020-08-17 18:16:53.458622 {u'pattern':
    '__key*__:*', u'type': 'pmessage', u'channel': '__keyspace@0__:key2', u'data': 'expired'}
2020-08-17 18:16:53.458856 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:expired', u'data': 'key2'}

Votre écouteur d'expiration de clés Redis est prêt.


AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an