NestJS Azure Service Bus Microservice Transport
npm install @niur/nestjs-service-bus[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456
[circleci-url]: https://circleci.com/gh/nestjs/nest
NestJs custom transport for Azure Service Bus.
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:
- Load-balancing work across competing workers
- Safely routing and transferring data and control across service and application boundaries
- Coordinating transactional work that requires a high-degree of reliability
#### Installation
To start building Azure Service Bus-based microservices, first install the required packages:
``bash`
$ 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:
`typescript
// main.ts
const app = await NestFactory.createMicroservice
strategy: new AzureServiceBusServer({
connectionString: 'Endpoint=sb://
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
`typescript
@Module({
imports: [
AzureServiceBusModule.forRoot([
{
name: 'SB_CLIENT',
connectionString: 'Endpoint=sb://
options: {},
},
]),
]
...
})
// or
@Module({
imports: [
AzureServiceBusModule.forRootAsync([
{
name: 'SB_CLIENT',
useFactory: (configService: ConfigService) => ({
connectionString: configService.get('connectionString'),
options: {}
}),
inject: [ConfigService],
},
]),
]
...
})
`
`typescript
@Injectable()
constructor(
@Inject('SB_CLIENT') private readonly sbClient: AzureServiceBusClientProxy,
) {}
`
##### Producer
Event-based
`typescript
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
`typescript
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:
`typescript
@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. |
* Author - Niurmiguel