Partage de technologie

Implémentation de files d'attente de messages à l'aide de Redis : pratique de List, Pub/Sub et Stream

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Résumé

Redis est un système de stockage clé-valeur hautes performances, et ses multiples structures de données en font un choix idéal pour implémenter des files d'attente de messages. Cet article explique comment utiliser les structures de données List, Pub/Sub et Stream de Redis pour implémenter un système de file d'attente de messages efficace.

1. Concepts de base de la file d'attente de messages

Une file d'attente de messages est un mécanisme de communication entre applications qui permet aux applications d'envoyer et de recevoir des messages de manière asynchrone. Il est utilisé dans les systèmes distribués pour découpler les composants de service et améliorer l'évolutivité et la fiabilité du système.

2. Avantages de Redis en tant que file d'attente de messages

  • haute performance: Redis est une opération basée sur la mémoire avec des vitesses de lecture et d'écriture extrêmement rapides.
  • Diverses structures de données: Prend en charge diverses structures de données telles que List, Set, Pub/Sub, etc., adaptées à différents scénarios d'utilisation.
  • Persistance: Prend en charge la persistance des données et garantit que les messages ne sont pas perdus.
  • Opérations atomiques: Prend en charge les transactions et les opérations atomiques pour garantir la cohérence des opérations de file d'attente de messages.

3. Utilisez List pour implémenter la file d'attente des messages

La liste est l'une des structures de données de base de Redis et peut être utilisée comme une simple file d'attente de messages.

3.1 Opérations de base

  • producteur:utiliserLPUSHLa commande insère le message en tête de la Liste.
  • consommateur:utiliserBRPOPLa commande bloque le message depuis la fin de la Liste.

3.2 Exemple de mise en œuvre

// 生产者
jedis.lpush("queue", "message");

// 消费者
String message = jedis.brpop(0, "queue");
  • 1
  • 2
  • 3
  • 4
  • 5

4. Utilisez Pub/Sub pour implémenter le modèle de publication/abonnement

Pub/Sub est un modèle de publication et d'abonnement de messages qui permet la livraison de messages un à plusieurs.

4.1 Opérations de base

  • annonceur:utiliserPUBLISHLa commande publie des messages sur le canal spécifié.
  • abonné:utiliserSUBSCRIBECommande pour s'abonner à la chaîne et recevoir des messages.

4.2 Exemple de mise en œuvre

// 发布者
jedis.publish("channel", "message");

// 订阅者
jedis.subscribe(new JedisPubSub() {
    @Override
    public void onMessage(String channel, String message) {
        System.out.println("Received: " + message);
    }
}, "channel");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5. Utilisez Stream pour implémenter la file d'attente de messages

Stream est une nouvelle structure de données persistante introduite dans Redis 5.0, spécialement conçue pour les fonctions de file d'attente de messages et de journalisation.

5.1 Opérations de base

  • producteur:utiliserXADDLa commande ajoute un message au flux.
  • consommateur:utiliserXREADLa commande lit les messages de Stream.

5.2 Exemple de mise en œuvre

// 生产者
String messageId = jedis.xadd("stream", StreamEntry.entry("field1", "value1"));

// 消费者
List<Map.Entry<String, String>> messages = jedis.xread(StreamsXReadParams.STREAMS.entry("stream", messageId));
  • 1
  • 2
  • 3
  • 4
  • 5

5.3 Utiliser le script Lua et Redis Stream pour implémenter une file d'attente de messages efficace

1. Avantages des scripts Lua dans Redis
  • atomicité: Les scripts Lua sont exécutés dans Redis, garantissant l'atomicité des opérations.
  • performance: Réduit le nombre d’allers-retours sur le réseau et améliore l’efficacité d’exécution.
  • la flexibilité: Peut écrire une logique complexe pour s'adapter aux différents besoins de l'entreprise.
2. Utilisez le script Lua pour faire fonctionner Redis Stream
2.1 Opérations de base
  • producteur:utiliserXADDLa commande ajoute un message au flux.
  • consommateur:utiliserXREADLa commande lit les messages de Stream.
  • groupe de consommateurs:utiliserXREADGROUPLa commande implémente la fonction de groupe de consommateurs.
2.2 Exemple de script Lua

Ce qui suit est un exemple simple de script Lua pour implémenter les opérations de base des producteurs et des consommateurs.

-- 生产者脚本
local function produce(streamKey, message)
    local result = redis.call('XADD', streamKey, '*', 'message', message)
    return result
end

-- 消费者脚本
local function consume(streamKey, groupName, consumerName)
    local result = redis.call('XREADGROUP', 'GROUP', groupName, consumerName, 'BLOCK', 5000, 'STREAMS', streamKey, 0)
    return result
end

-- 调用脚本
local streamKey = 'myStream'
local message = 'Hello, Redis Stream!'
local groupName = 'myGroup'
local consumerName = 'myConsumer'

-- 生产消息
local messageId = produce(streamKey, message)

-- 消费消息
local messages = consume(streamKey, groupName, consumerName)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

3. Recours à des groupes de consommateurs

Les groupes de consommateurs sont une fonctionnalité de Redis Stream qui permet à plusieurs instances de consommateurs de coordonner leur travail et de consommer conjointement les messages dans le Stream.

3.1 Créer un groupe de consommateurs
redis.call('XGROUP', 'CREATE', streamKey, groupName, '$', 'MKSTREAM')
  • 1
3.2 Lecture des groupes de consommateurs
redis.call('XREADGROUP', 'GROUP', groupName, consumerName, 'BLOCK', 5000, 'STREAMS', streamKey, '>')
  • 1

4. Résumé

L'utilisation de scripts Lua et Redis Stream pour implémenter des files d'attente de messages peut exploiter pleinement les hautes performances de Redis et l'atomicité des scripts Lua pour créer un système de file d'attente de messages efficace et fiable. La fonctionnalité de groupes de consommateurs améliore encore la disponibilité et l'évolutivité des files d'attente de messages.

5. Précautions
  • Assurez-vous que les scripts Lua sont entièrement testés avant leur exécution.
  • Compte tenu de la persistance et de la sécurité du message, configurez la stratégie de persistance Redis de manière appropriée.
  • Dans un environnement de production, surveillez les performances et l'état des files d'attente de messages pour garantir un fonctionnement stable du système.
6. Références

6. Résumé

Redis propose plusieurs façons d'implémenter des files d'attente de messages, chacune ayant ses scénarios applicables. List convient aux exigences de file d'attente simples, Pub/Sub convient au mode publication/abonnement et Stream fournit des fonctions de file d'attente de messages plus puissantes, notamment la persistance, les groupes de consommateurs et d'autres fonctionnalités.
Insérer la description de l'image ici

7. Références