Niurmiguel / nestjs-service-bus

NestJs custom transport for Azure Service Bus.
MIT License
21 stars 8 forks source link
amqp amqp-client azure cloud microservices nest nestjs nodejs queue service-bus typescript

Nest Logo

NestJs custom transport for Azure Service Bus.

<p align="center">

NPM Version Package License NPM Downloads

Description

Azure Service Bus is a fully managed enterprise message broker with message queues and publish-subscribe topics (in a namespace). Service Bus is used to decouple applications and services from each other, providing the following benefits:

Installation

To start building Azure Service Bus-based microservices, first install the required packages:

$ npm i --save @azure/service-bus @niur/nestjs-service-bus

Overview

To use the Azure Service Bus strategy, pass the following options object to the createMicroservice() method:

//  main.ts

const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
  strategy: new AzureServiceBusServer({
    connectionString: 'Endpoint=sb://<Name>.servicebus.windows.net/;SharedAccessKeyName=<SharedAccessKeyName>;SharedAccessKey=<SharedAccessKey>',
    options: {}
  }),
});

Options

The Azure Service Bus strategy exposes the properties described below.

retryOptions Retry policy options that determine the mode, number of retries, retry interval etc (read more here).
webSocketOptions Options to configure the channelling of the AMQP connection over Web Sockets (read more here).
userAgentOptions Options for adding user agent details to outgoing requests (read more here).

Client

@Module({
  imports: [
    AzureServiceBusModule.forRoot([
      {
        name: 'SB_CLIENT',
        connectionString: 'Endpoint=sb://<Name>.servicebus.windows.net/;SharedAccessKeyName=<SharedAccessKeyName>;SharedAccessKey=<SharedAccessKey>',
        options: {},
      },
    ]),
  ]
  ...
})

// or

@Module({
  imports: [
    AzureServiceBusModule.forRootAsync([
      {
        name: 'SB_CLIENT',
        useFactory: (configService: ConfigService) => ({
          connectionString: configService.get('connectionString'),
          options: {}
        }),
        inject: [ConfigService],
      },
    ]),
  ]
  ...
})

@Injectable()
constructor(
  @Inject('SB_CLIENT') private readonly sbClient: AzureServiceBusClientProxy,
) {}
Producer

Event-based


const pattern = {
  name: 'sample-topic', // topic name
  options: {}
}; // queue name
const data = {
  body: 'Example message'
};

this.sbClient.send(pattern, data).subscribe((response) => {
  console.log(response); // reply message
});

Message-based


const pattern = {
  name: 'sample-topic', // topic name
  options: {}
}; // queue name
const data = {
  body: 'Example message'
};
this.sbClient.emit(pattern, data);
Consumer

To access the original Azure Service Bus message use the Subscription decorator as follows:


@Subscription({
    topic: 'sample-topic',
    subscription: 'sample-subscription',
    receiveMode: 'peekLock', // or receiveAndDelete
  })
getMessages(@Payload() message: ServiceBusMessage) {
  console.log(message);
}

Options

topic Name of the topic for the subscription we want to receive from.
subscription Name of the subscription (under the `topic`) that we want to receive from.
receiveMode Represents the receive mode for the receiver. (read more here).
subQueueType Represents the sub queue that is applicable for any queue or subscription. (read more here).
maxAutoLockRenewalDurationInMs The maximum duration in milliseconds until which the lock on the message will be renewed by the sdk automatically.
skipParsingBodyAsJson Option to disable the client from running JSON.parse() on the message body when receiving the message.
options Options used when subscribing to a Service Bus queue or subscription.

Stay in touch

License

Nestjs Azure Service Bus is MIT licensed.