kafka-retry
Version:
Handle kafka non-blocking retries and dead letter topics for nestjs microservice
58 lines (54 loc) • 1.7 kB
text/typescript
import { Admin } from '@nestjs/microservices/external/kafka.interface';
import { AUTO_CREATE_RETRY_TOPIC, RetryTopicConstants } from './constants';
import { IRetryMetadata } from './interfaces';
import {
getDeadTopicName,
getPatternRetryTopic,
getRetryTopicName,
} from './utils';
export class KafkaAdmin {
constructor(protected readonly admin: Admin) {}
public async createRetryTopics(
pattern: string,
retryableTopic: IRetryMetadata,
) {
const currentTopics = await this.admin.listTopics();
const currentRetryTopics = currentTopics.filter((topic) => {
return new RegExp(getPatternRetryTopic(pattern)).test(topic);
});
const topics = [];
const result = [];
/*
* Retry topics
*/
for (let index = 1; index <= retryableTopic.attempts; index++) {
const retryTopicName = getRetryTopicName(pattern, index);
result.push(retryTopicName);
if (
index <= RetryTopicConstants.MAX_ATTEMPTS &&
!currentRetryTopics.includes(retryTopicName)
) {
topics.push(retryTopicName);
}
}
/*
* Dead letter topic
*/
const deadTopicName = getDeadTopicName(pattern);
if (!currentTopics.includes(deadTopicName)) {
topics.push(deadTopicName);
}
const autoCreateRetryTopic =
retryableTopic.autoCreateRetryTopic ?? AUTO_CREATE_RETRY_TOPIC;
if (autoCreateRetryTopic) {
await this.admin.createTopics({
topics: topics.map((topic) => ({
topic: topic,
numPartitions: RetryTopicConstants.DEFAULT_PARTITIONS,
replicationFactor: RetryTopicConstants.REPLICATION_FACTOR,
})),
});
}
return result;
}
}