ساختن سیستم های وب با NESTJS: رسیدگی به آزمایش مجدد ، امنیت ، صف های مرده و محدود کردن نرخ

Webhooks روشی قدرتمند برای فعال کردن ارتباط در زمان واقعی بین خدمات است. اما چه اتفاقی می افتد اگر یک وب سایت از بین برود؟ یا اگر یک کاربر مخرب نقطه پایانی شما را با هرزنامه سیل می کند؟ در این راهنما ، ما می سازیم سیستم وب سایت انعطاف پذیر در Nestjs این شامل:
- فرستنده وب: ایمن و ارسال ایمن و ارسال وب.
- گیرنده وب: تأیید ، پردازش و تلاش مجدد وب سایت های ناکام.
- صف های مرده (DLQ): رسیدگی به شکست های مداوم با لطف.
- محدود کردن نرخ: جلوگیری از هرزنامه و سوءاستفاده.
1. تنظیم فرستنده Webhook
برنامه فرستنده وظیفه اعزام رویدادها به گیرنده Webhook را بر عهده دارد. برای اطمینان از امنیت ، ما قبل از ارسال آن ، هر بار را امضا می کنیم.
امضای و ارسال وب سایت
import * as crypto from 'crypto';
import axios from 'axios';
// Replace with your secret key, use environment variables in production
const SECRET = 'your-secret-key';
function signPayload(payload: any): string {
return crypto.createHmac('sha256', SECRET)
.update(JSON.stringify(payload))
.digest('hex');
}
async function sendWebhook(url: string, event: any) {
const signature = signPayload(event);
await axios.post(url, event, {
headers: {
'X-Signature': signature,
},
});
}
// Example usage:
sendWebhook('http://webhook-receiver.com/events', { event: 'USER_CREATED', data: { id: 123 } });
2. اجرای گیرنده Webhook 🏠
برنامه گیرنده امضا را تأیید می کند و وب سایت های ورودی را پردازش می کند.
تأیید امضاهای Webhook
import { Controller, Post, Headers, Body, HttpException, HttpStatus } from '@nestjs/common';
import * as crypto from 'crypto';
const SECRET = 'your-secret-key';
function verifySignature(payload: any, signature: string): boolean {
const expectedSignature = crypto.createHmac('sha256', SECRET)
.update(JSON.stringify(payload))
.digest('hex');
return expectedSignature === signature;
}
@Controller('webhooks')
export class WebhookController {
@Post()
async handleWebhook(@Headers('X-Signature') signature: string, @Body() payload: any) {
if (!verifySignature(payload, signature)) {
throw new HttpException('Invalid signature', HttpStatus.UNAUTHORIZED);
}
console.log('Received webhook:', payload);
// Process webhook...
}
}
3. اجرای منطق آزمایش مجدد با گاو
اگر پردازش Webhook انجام نشود ، باید با استفاده از آن دوباره امتحان کنیم گاو نر، یک سیستم صف مبتنی بر Redis.
نصب وابستگی ها:
npm install @nestjs/bull bull redis
پیکربندی گاو در app.module.ts
import { BullModule } from '@nestjs/bull';
import { Module } from '@nestjs/common';
@Module({
imports: [
BullModule.forRoot({
redis: {
host: 'localhost',
port: 6379,
},
}),
BullModule.registerQueue({ name: 'webhook-queue' }),
],
})
export class AppModule {}
Webhook Restry Productor queue
import { Process, Processor } from '@nestjs/bull';
import { Job } from 'bull';
import axios from 'axios';
@Processor('webhook-queue')
export class WebhookProcessor {
@Process('retry')
async handleFailedWebhook(job: Job) {
const { payload, url } = job.data;
try {
await axios.post(url, payload);
} catch (error) {
throw new Error('Webhook retry failed');
}
}
}
اضافه کردن وب سایت های ناکام به صف
import { InjectQueue } from '@nestjs/bull';
import { Queue } from 'bull';
import { Controller, Post, Body } from '@nestjs/common';
@Controller('webhooks')
export class WebhookController {
constructor(@InjectQueue('webhook-queue') private webhookQueue: Queue) {}
@Post()
async handleWebhook(@Body() payload: any) {
try {
console.log('Processing webhook:', payload);
// Process webhook normally...
} catch (error) {
console.error('Failed webhook, adding to queue');
await this.webhookQueue.add('retry', { payload, url: 'http://webhook-receiver.com/events' }, { attempts: 3 });
}
}
}
4. اجرای صف های برگ مرده (DLQ) ☠
اگر یک اتاق وب پس از ترمیم های متعدد شکست بخورد ، باید به A منتقل شود صف مرده برای مداخله دستی
این برای ورود به سیستم و اشکال زدایی مفید است و به شما امکان می دهد شکست های مداوم را با لطف انجام دهید.
@Processor('webhook-queue')
export class WebhookProcessor {
@Process('retry')
async retryWebhook(job: Job) {
try {
await axios.post(job.data.url, job.data.payload);
} catch (error) {
if (job.attemptsMade >= job.opts.attempts) {
console.error('Moving webhook to DLQ:', job.data);
await this.deadLetterQueue.add(job.data);
}
throw error;
}
}
}
5. محدود کردن نرخ اجرای
به از حملات هرزنامه جلوگیری کنید، ما استفاده خواهیم کرد نست در گیرنده وب ما.
این تعداد درخواست هایی را که کاربر می تواند در یک بازه زمانی معین انجام دهد محدود می کند.
نصب وابستگی ها:
npm install @nestjs/throttler
پیکربندی محدود کردن نرخ
import { Module } from '@nestjs/common';
import { ThrottlerModule } from '@nestjs/throttler';
@Module({
imports: [
ThrottlerModule.forRoot({
ttl: 60, // 1 minute
limit: 5, // Max 5 requests per minute per user
}),
],
})
export class AppModule {}
اعمال محدود کردن نرخ در کنترلر Webhook
import { Throttle } from '@nestjs/throttler';
import { Controller, Post, Body } from '@nestjs/common';
@Controller('webhooks')
export class WebhookController {
@Throttle(5, 60)
@Post()
async handleWebhook(@Body() payload: any) {
console.log('Processing webhook:', payload);
}
}
نتیجه گیری
با اجرای وب های ایمن با ترمیم ها ، صف های مرده و محدود کردن نرخ، ما اطمینان می دهیم که سیستم ما است قابل اعتماد ، تحمل گسل و ایمنبشر 🚀
- امنیت: بارهای امضا شده از درخواست های غیرمجاز جلوگیری می کنند.
- احیا: وب سایت های ناموفق به طور خودکار دوباره پردازش می شوند.
- صف های مرده: Webhooks که به طور مکرر شکست می خورند ، برای مداخله دستی وارد سیستم می شوند.
- محدود کردن نرخ: در برابر حملات هرزنامه و DOS محافظت می کند.
سؤال یا پیشرفت دارید؟ آنها را در نظرات رها کنید! 💬 کدگذاری مبارک! 🔥