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
To start building Azure Service Bus-based microservices, first install the required packages:
$ npm i --save @azure/service-bus @niur/nestjs-service-bus
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: {}
}),
});
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). |
@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,
) {}
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);
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. |
- Author - Niurmiguel
Nestjs Azure Service Bus is MIT licensed.