Redis 传输器实现了发布/订阅消息传递范例,并利用了 Redis 的 Pub/Sub 功能。已发布的消息按频道分类,但不知道最终哪些订阅者(如果有)会收到该消息。每个微服务都可以订阅任意数量的频道。此外,一次可以订阅多个频道。通过频道交换的消息是即发即弃的,这意味着如果某条消息已发布,但没有订阅者对其感兴趣,则该消息将被删除,并且无法恢复。因此,您无法保证至少有一个服务会处理消息或事件。多个订阅者可以订阅(并接收)一条消息。
安装
要开始构建基于 Redis 的微服务,首先安装所需的包:
$ npm i --save ioredis
概述
要使用 Redis 传输器,请将以下选项对象传递给 createMicroservice()
方法:
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
的更多信息。
@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()}`);
}
@Payload()
、@Ctx()
和 RedisContext
从 @nestjs/microservices
包导入。