Compartilhamento de tecnologia

Implementando filas de mensagens usando Redis: Prática de Lista, Pub/Sub e Stream

2024-07-12

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


Resumo

Redis é um sistema de armazenamento de valor-chave de alto desempenho e suas múltiplas estruturas de dados o tornam a escolha ideal para implementar filas de mensagens. Este artigo explorará como usar as estruturas de dados List, Pub/Sub e Stream do Redis para implementar um sistema eficiente de fila de mensagens.

1. Conceitos básicos de fila de mensagens

Uma fila de mensagens é um mecanismo de comunicação entre aplicativos que permite que os aplicativos enviem e recebam mensagens de forma assíncrona. É usado em sistemas distribuídos para desacoplar componentes de serviço e melhorar a escalabilidade e a confiabilidade do sistema.

2. Vantagens do Redis como fila de mensagens

  • alta performance: Redis é uma operação baseada em memória com velocidades de leitura e gravação extremamente rápidas.
  • Várias estruturas de dados: suporta várias estruturas de dados, como Lista, Conjunto, Pub/Sub, etc., adequadas para diferentes cenários de uso.
  • Persistência: oferece suporte à persistência de dados e garante que as mensagens não sejam perdidas.
  • Operações atômicas: oferece suporte a transações e operações atômicas para garantir a consistência das operações da fila de mensagens.

3. Use Lista para implementar fila de mensagens

Lista é uma das estruturas de dados básicas do Redis e pode ser usada como uma fila de mensagens simples.

3.1 Operações básicas

  • produtor:usarLPUSHO comando insere a mensagem no cabeçalho da Lista.
  • consumidor:usarBRPOPO comando bloqueia a mensagem do final da Lista.

3.2 Exemplo de implementação

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

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

4. Use o Pub/Sub para implementar o modelo de publicação/assinatura

Pub/Sub é um modelo de publicação e assinatura de mensagens que pode realizar a entrega de mensagens um para muitos.

4.1 Operações básicas

  • locutor:usarPUBLISHO comando publica mensagens no canal especificado.
  • assinante:usarSUBSCRIBEComando para se inscrever no canal e receber mensagens.

4.2 Exemplo de implementação

// 发布者
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. Use Stream para implementar fila de mensagens

Stream é uma nova estrutura de dados persistente introduzida no Redis 5.0, especialmente projetada para fila de mensagens e funções de registro.

5.1 Operações básicas

  • produtor:usarXADDO comando adiciona uma mensagem ao Stream.
  • consumidor:usarXREADO comando lê mensagens do Stream.

5.2 Exemplo de implementação

// 生产者
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 Use script Lua e Redis Stream para implementar fila de mensagens eficiente

1. Vantagens dos scripts Lua no Redis
  • atomicidade: Os scripts Lua são executados dentro do Redis, garantindo a atomicidade das operações.
  • desempenho: reduz o número de viagens de ida e volta da rede e melhora a eficiência de execução.
  • flexibilidade: Pode escrever lógica complexa para se adaptar às diferentes necessidades de negócios.
2. Use o script Lua para operar o Redis Stream
2.1 Operações básicas
  • produtor:usarXADDO comando adiciona uma mensagem ao Stream.
  • consumidor:usarXREADO comando lê mensagens do Stream.
  • grupo de consumidores:usarXREADGROUPO comando implementa a função de grupo de consumidores.
2.2 Exemplo de script Lua

A seguir está um exemplo simples de script Lua para implementar operações básicas de produtores e consumidores.

-- 生产者脚本
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. Utilização de grupos de consumidores

Os grupos de consumidores são um recurso do Redis Stream que permite que várias instâncias de consumidores coordenem seu trabalho e consumam mensagens em conjunto no Stream.

3.1 Criar grupo de consumidores
redis.call('XGROUP', 'CREATE', streamKey, groupName, '$', 'MKSTREAM')
  • 1
3.2 Leitura de grupos de consumidores
redis.call('XREADGROUP', 'GROUP', groupName, consumerName, 'BLOCK', 5000, 'STREAMS', streamKey, '>')
  • 1

4. Resumo

O uso de scripts Lua e Redis Stream para implementar filas de mensagens pode aproveitar ao máximo o alto desempenho do Redis e a atomicidade dos scripts Lua para construir um sistema de fila de mensagens eficiente e confiável. O recurso de grupos de consumidores aumenta ainda mais a disponibilidade e a escalabilidade das filas de mensagens.

5. Precauções
  • Certifique-se de que os scripts Lua sejam totalmente testados antes da execução.
  • Considerando a persistência e a segurança da mensagem, configure razoavelmente a estratégia de persistência do Redis.
  • Em um ambiente de produção, monitore o desempenho e o status das filas de mensagens para garantir a operação estável do sistema.
6. Referências

6. Resumo

O Redis oferece diversas maneiras de implementar filas de mensagens, cada uma com seus cenários aplicáveis. List é adequado para requisitos de fila simples, Pub/Sub é adequado para modo de publicação/assinatura e Stream fornece funções de fila de mensagens mais poderosas, incluindo persistência, grupos de consumidores e outros recursos.
Insira a descrição da imagem aqui

7. Referências