Redis

The Redis transporter implements the publish/subscribe messaging paradigm and leverages the Pub/Sub feature of Redis. Published messages are categorized in channels, without knowing what subscribers (if any) will eventually receive the message. Each microservice can subscribe to any number of channels. In addition, more than one channel can be subscribed to at a time. Messages exchanged through channels are fire-and-forget, which means that if a message is published and there are no subscribers interested in it, the message is removed and cannot be recovered. Thus, you don’t have a guarantee that either messages or events will be handled by at least one service. A single message can be subscribed to (and received) by multiple subscribers.

Redis - 图1

Installation

To start building Redis-based microservices, first install the required package:

  1. $ npm i --save redis

Overview

To use the Redis transporter, pass the following options object to the createMicroservice() method:

  1. @@filename(main)
  2. const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
  3. transport: Transport.REDIS,
  4. options: {
  5. url: 'redis://localhost:6379',
  6. },
  7. });
  8. @@switch
  9. const app = await NestFactory.createMicroservice(AppModule, {
  10. transport: Transport.REDIS,
  11. options: {
  12. url: 'redis://localhost:6379',
  13. },
  14. });

info Hint The Transport enum is imported from the @nestjs/microservices package.

Options

The options property is specific to the chosen transporter. The Redis transporter exposes the properties described below.

urlConnection url
retryAttemptsNumber of times to retry message (default: 0)
retryDelayDelay between message retry attempts (ms) (default: 0)

All the properties supported by the official redis client are also supported by this transporter.

Client

Like other microservice transporters, you have several options for creating a Redis ClientProxy instance.

One method for creating an instance is to use the ClientsModule. To create a client instance with the ClientsModule, import it and use the register() method to pass an options object with the same properties shown above in the createMicroservice() method, as well as a name property to be used as the injection token. Read more about ClientsModule here.

  1. @Module({
  2. imports: [
  3. ClientsModule.register([
  4. {
  5. name: 'MATH_SERVICE',
  6. transport: Transport.REDIS,
  7. options: {
  8. url: 'redis://localhost:6379',
  9. }
  10. },
  11. ]),
  12. ]
  13. ...
  14. })

Other options to create a client (either ClientProxyFactory or @Client()) can be used as well. You can read about them here.

Context

In more sophisticated scenarios, you may want to access more information about the incoming request. When using the Redis transporter, you can access the RedisContext object.

  1. @@filename()
  2. @MessagePattern('notifications')
  3. getNotifications(@Payload() data: number[], @Ctx() context: RedisContext) {
  4. console.log(`Channel: ${context.getChannel()}`);
  5. }
  6. @@switch
  7. @Bind(Payload(), Ctx())
  8. @MessagePattern('notifications')
  9. getNotifications(data, context) {
  10. console.log(`Channel: ${context.getChannel()}`);
  11. }

info Hint @Payload(), @Ctx() and RedisContext are imported from the @nestjs/microservices package.