Skip to main content

Redis

Redis传输器实现了发布/订阅消息范式, 并利用了Redis的发布/订阅功能。 发布的消息被分类到通道中,而不知道最终哪些订阅者(如果有的话)将接收消息。 每个微服务可以订阅任意数量的通道。此外,可以同时订阅多个通道。 通过通道交换的消息是“发布并忘记”的, 这意味着如果发布了一条消息并且没有订阅者对其感兴趣,该消息将被删除,并且无法恢复。 因此,您不能保证消息或事件将由至少一个服务处理。单个消息可以被多个订阅者订阅(并接收)。

安装

要开始构建基于Redis的微服务,首先安装所需的包:

npm i --save ioredis

概述

要使用Redis传输器,请将以下选项对象传递给createMicroservice()方法:

// main.ts
const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
transport: Transport.REDIS,
options: {
host: 'localhost',
port: 6379,
},
});
tip

Transport枚举从@nestjs/microservices包中导入。

选项

options属性是特定于所选传输器的。Redis传输器公开了下面描述的属性。

  • host:连接URL
  • port:连接端口
  • retryAttempts:重试消息的次数(默认:0
  • retryDelay:消息重试尝试之间的延迟(毫秒)(默认:0
  • wildcards:启用Redis通配符订阅,指示传输器在底层使用psubscribe/pmessage。 (默认:false

所有由官方ioredis客户端支持的属性在此传输器中也都受支持。

客户端

像其他微服务传输器一样, 您有几种方法可以创建Redis ClientProxy实例。

一种创建实例的方法是使用ClientsModule。 要使用ClientsModule创建客户端实例, 导入它并使用register()方法传递一个带有与createMicroservice()方法中显示的相同属性的选项对象, 以及一个用作注入令牌的name属性。 在此处阅读有关ClientsModule的更多信息。

@Module({
imports: [
ClientsModule.register([
{
name: 'MATH_SERVICE',
transport: Transport.REDIS,
options: {
host: 'localhost',
port: 6379,
}
},
]),
]
...
})

也可以使用其他创建客户端的选项(ClientProxyFactory@Client())。 您可以在此处阅读有关它们的信息。

上下文

在更复杂的场景中,您可能希望访问有关传入请求的更多信息。 当使用Redis传输器时,可以访问RedisContext对象。

@MessagePattern('notifications')
getNotifications(@Payload() data: number[], @Ctx() context: RedisContext) {
console.log(`Channel: ${context.getChannel()}`);
}
tip

@Payload()@Ctx()RedisContext@nestjs/microservices包中导入。