Redis Redis

导读

Redis 传输器实现了发布/订阅消息传递范例,并利用了 Redis 的 Pub/Sub 功能。已发布的消息按频道分类,但不知道最终哪些订阅者(如果有)会收到该消息。每个微服务都可以订阅任意数量的频道。此外,一次可以订阅多个频道。通过频道交换的消息是即发即弃的,这意味着如果某条消息已发布,但没有订阅者对其感兴趣,则该消息将被删除,并且无法恢复。因此,您无法保证至少有一个服务会处理消息或事件。多个订阅者可以订阅(并接收)一条消息。

img

安装

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

bash
$ npm i --save ioredis

概述

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

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

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

选项

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

host连接网址
port连接端口
retryAttempts重试消息的次数(默认值:0
retryDelay消息重试间隔(毫秒)(默认值:0
wildcards启用 Redis 通配符订阅,指示传输器使用psubscribe,pmessage内部。(默认值:false

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

客户端

与其他微服务传输器一样,您有 多个选项 用于创建 Redis ClientProxy 实例。

创建实例的一种方法是使用 ClientsModule。要使用 ClientsModule 创建客户端实例,请导入它并使用 register() 方法传递具有与 createMicroservice() 方法中上述相同属性的选项对象,以及用作注入令牌的 name 属性。在这里了解有关 ClientsModule 的更多信息。

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

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

上下文

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

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

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