नमस्ते।
मैं nestjs + sqs संयोजन के साथ सेवाएँ विकसित कर रहा था और इस दौरान nestjs ecosystem के अन्य sqs packages का उपयोग कर रहा था।
लेकिन वास्तविक production में जिन कुछ असुविधाओं का सामना हुआ, उन्हें लेकर मेरे पास कुछ समस्याएँ थीं। मैंने एक खास package में PR भी submit किया था, लेकिन या तो अब उसका update नहीं हो रहा था, या कुछ जगहों पर इसे समस्या के रूप में पहचाना ही नहीं जा रहा था, इसलिए इसे सीधे हल करने के लिए मैंने खुद यह module बनाया। वास्तव में, मैं पहले इस्तेमाल कर रहे sqs module को इससे बदलकर स्थिर रूप से उपयोग कर रहा हूँ।
nestjs में sqs module खोज रहे लोगों के लिए, और जिनकी चिंताएँ मेरी जैसी रही हैं, उनके लिए यह मददगार हो सकता है, इसलिए साझा कर रहा हूँ।

इस package की विशेषताएँ इस प्रकार हैं

nestjs-अनुकूल

nestjs में modules को dynamic रूप से बनाकर import किया जा सकता है, और decorators लगे handlers को inject करके इसे आसानी से implement किया जा सकता है।
इसका signature अधिकांश अन्य sqs packages जैसा ही है।

@Module({  
  imports: [  
    ConfigModule.forRoot(),  
    SqsModule.registerAsync({  
      inject: [ConfigService],  
      useFactory: (config: ConfigService) => {  
        const region = config.getOrThrow<string>('AWS_REGION');  
        const queueUrl = config.getOrThrow<string>('ORDERS_QUEUE_URL');  
        const defaultSqsClient = new SQSClient({ region });  
  
        return {  
          defaultSqsClient,  
          consumers: [{ name: 'orders', queueUrl }],  
          producers: [{ name: 'orders', queueUrl }],  
        };  
      },  
    }),  
  ],  
})  
export class AppModule {}  
  
@Injectable()  
export class OrderQueueHandler {  
  @SqsMessageHandler('orders')  
  public async onMessage(message: Message): Promise<Message> {  
    // return message to ack/delete  
    return message;  
  }  
  
  @SqsConsumerEventHandler('orders', 'processing_error')  
  public onProcessingError(error: Error, message: Message) {  
    // report error  
  }  
}  

नवीनतम bbc packages का उपयोग

यह package प्रति सप्ताह 13 लाख से अधिक downloads वाले, Node.js ecosystem में सबसे प्रसिद्ध sqs libraries में शामिल नीचे दी गई दो libraries के नवीनतम versions पर आधारित है।

https://github.com/bbc/sqs-producer
https://github.com/bbc/sqs-consumer

sqs-consumer में v14 से एक महत्वपूर्ण breaking change मौजूद है।
https://github.com/bbc/sqs-consumer/discussions/584

version 13 और उससे नीचे में, यदि sqs handler void return करता था, तो उसे ack behavior माना जाता था।
लेकिन version 14 से, sqs handler द्वारा स्पष्ट रूप से return किए गए message को ही ack माना जाता है।
यह बदलाव अधिक explicit और predictable है, और ack implementation के मामले में users को भ्रमित नहीं करता — इसलिए यह एक सार्थक बदलाव है।
लेकिन अभी भी बाज़ार में उपलब्ध अधिकांश npm packages, जो खुद को nestjs sqs module कहते हैं, फिलहाल sqs-consumer version 13 या उससे नीचे का उपयोग कर रहे हैं।

boot-time validation

app शुरू होते समय गलत configuration को तुरंत पकड़ लिया जाता है, जिससे इसे अधिक सुरक्षित तरीके से उपयोग किया जा सकता है।

  • duplicate consumer/producer names का पता लगाना
  • मौजूद न होने वाले consumer पर decorator इस्तेमाल करने पर तुरंत error
  • event name में typo का पता लगाना
  • batch/single handler parameter type mismatch का पता लगाना
  • batch/single return value type mismatch का पता लगाना

graceful shutdown

bbc/sqs-consumer graceful shutdown के लिए pollingCompleteWaitTimeMs option प्रदान करता है।
और nestjs में उसका अपना lifecycle होता है।
nestjs के onModuleDestroy चरण में, यह अंदरूनी रूप से तब तक shutdown का इंतज़ार करता है जब तक प्रत्येक consumer stopped event publish नहीं कर देता।
क्योंकि यह event तभी होता है जब consumer जिस message को process कर रहा था वह पूरा हो जाए, इसलिए message processing पूरी होने के बाद process सुरक्षित रूप से बंद होता है।
चूँकि यह अपने आप nestjs lifecycle से जुड़ा हुआ है,
यदि आप app.enableShutdownHooks() चालू रखें,
और pollingCompleteWaitTimeMs, shutdownTimeoutMs को सही तरह से configure कर दें, तो k8s environment में भी अचानक shutdown की स्थिति में इसे अधिक सुरक्षित रूप से उपयोग किया जा सकता है।

production में sqs का उपयोग करते हुए जिन चीज़ों के बारे में यह लगा कि यह आखिर कब update होगी, वे लगातार update नहीं हो रही थीं।
मज़बूत development culture बनाने में जो कठिनाइयाँ आ रही थीं, उन्हें हल करने का यह परिणाम है।
अगर आप भी ऐसे ही environment में ऐसी ही चिंताओं का सामना कर रहे हैं, तो एक बार इसे इस्तेमाल करके feedback दें, इसके लिए आभारी रहूँगा।

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.