ایجاد زمانبندی با quartz در Asp.net core
سلام و عرض ادب خدمت دوستان
بنده با quartz یک زمانبندی برای پروژه فروشگاهی Asp.net core قرار دادم که فاکتور یا همون سبد خرید رو آپدیت کنه. به این صورت که مثلا هر یک ساعت یکبار چک کنه فاکتور هایی که یک ساعت از زمان ایجادشون گذشته و نهایی و پرداخت نشدن، قیمت محصولاتش رو آپدیت کنه ( جدول order برای فاکتور هست و جدول orderDetail برای محصولات فاکتور همراه با قیمت ) به این دلیل که کاربری که از کد تخفیف استفاده کرده یا از فروش ویژه محصول اضافه کرده به سبد خرید و قیمت تخفیف خورده ثبت شده در جدول orderDetail ، اون قیمت آپدیت شه که کاربر سو استفاده نکنه و تخفیف رو بزنه و بعد یک ماه خریداری کنه
سوالی که داشتم اینه آیا قرار دادن زمان انجام این job در quartz روی هر یک ساعت یا دو ساعت یکبار، آیا به سرور فشار نمیاره ؟ ساعت پیشنهادی شما چند هست ؟
آیا استفاده از زمانبندی خوبه یا اینکه قیمت قبل نهایی کردن فاکتور توی orderDetail ثبت نشه و با هر بار فراخوانی سبد خرید قیمت هارو از جدول محصول بخونه و اگه کاربری تخفیفی قبلا زده محاسبه شه و همینطور هنگام نهایی کردن هم مجدد بره قیمت هارو محاسبه کنه
ممنون از شما
پاسخ هوش مصنوعی
برای ایجاد یک زمانبندی با Quartz در ASP.NET Core که هر یک ساعت چک کند فاکتورهایی که نهایی و پرداخت نشده اند را آپدیت کند، شما نیاز دارید تا یک Job تعریف کنید و آن را به Quartz اضافه کنید. در زیر مثالی از نحوه پیاده سازی این کار آورده شده است.
ابتدا شما باید بسته ای به نام Quartz.AspNetCore را به پروژه خود اضافه کنید. این کار را می توانید با استفاده از NuGet Package Manager انجام دهید:
dotnet add package Quartz.AspNetCore
سپس یک کلاس برای Job خود ایجاد کنید:
using Quartz;
using System.Threading.Tasks;
public class UpdateOrderJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
// اینجا منطق آپدیت فاکتورها را قرار دهید
// با دیتابیس کار کنید و فاکتورهای قدیمی تر از یک ساعت را آپدیت کنید
}
}
سپس در Startup.cs، Quartz را پیکربندی کنید:
using Quartz;
using Quartz.Spi;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddQuartz(q =>
{
q.UseMicrosoftDependencyInjectionJobFactory();
var jobKey = new JobKey("updateOrderJob");
q.AddJob(opts => opts.WithIdentity(jobKey));
q.AddTrigger(opts => opts
.ForJob(jobKey) // همان Job که ساخته ایم
.WithIdentity("updateOrderJob-trigger") // نام Trigger
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInHours(1) // هر یک ساعت یکبار
.RepeatForever()));
});
services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
}
}
در مورد سؤال شما درباره فشار به سرور: اجرای یک Job هر یک ساعت می تواند کارا باشد و به نظر می رسد که فشار زیادی به سرور وارد نکند، به شرطی که منطق داخل Job بهینه باشد و از منابع بی مورد استفاده نکند.
اما در مورد سوال دوم شما، استفاده از قیمت های به روز هنگام نهایی کردن فاکتور می تواند ساده تر و کارآمدتر باشد. با این روش، شما همیشه قیمت های دقیق و به روز را دریافت می کنید و اسپکترهای احتمالی را کاهش می دهید. اما باید دقت کنید که این روش ممکن است موجب بار اضافی بر روی پایگاه داده شود، مخصوصا در زمان نهایی کردن فاکتور، که مثلاً چندین کاربر به طور همزمان اقدام به انجام این عمل می کنند.
در نهایت بستگی به نیازهای پروژه و حجم ترافیک دارد. پیشنهاد می شود هر دو روش را امتحان کنید و متناسب با شرایط بهینه ترین را انتخاب کنید.
البته نظر دادن در مورد پروژه ای که هیچ اطلاعاتی در مورد اون پروژه و شرایط انجام اون پروژه نداشته باشی مطمئنا دقیق و کارشناسی نیست و صرفا میشه یک نظر کلی داد. اما به طور کلی Job ها وظایفی هستن که سرور باید طبق زمانبندی اون رو انجام بده. و مطمئنا این وظایف یک بار کم یا زیاد (بستگی به نوع Job) روی سرور داره. اما هر 2 ساعت یکبار بنظر نمیاد زیاد باشه و مشکلی نداره.
اما در مورد پروژه شما به نظر بنده اصلا نیازی به زمانبندی و تعریف Job نیست. شما می تونید سبد خرید کاربر رو قبل از نهایی کردن سبد مجدد کنترل کنید و اگر قیمت یک کالا تغییری کرده باشه یا اینکه موجودی اون کالا 0 شده به کاربر اطلاع بدید.
شما فرض کنید 100 کاربر بیان و کالاهایی رو در سبد خودشون قرار بدن و هیچ کدوم هم سر نزنن به سبدشون و خرید رو قطعی نکنن. دیگه چه نیازی هست که سیستم مرتبا بیاد و سبد کاربر رو چک کنه.
یک پیشنهاد : همیشه سخت ترین راه بهترین راه نیست.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- کار با CkEditor با قابلیت آپلود عکس
- خطا در ایجاد migration در Asp.net core
- تفاوت های Asp.net core و Asp.net mvc چیه؟
- دلیل اسپم شدن ایمیل های ارسالی از سرور
- نحوه لایه بندی پروژه Core و اضافه کردن به IIS
- ارسال ایمیل در Asp.net core
- آیا میشه در mvc core از کامپونت استفاده کرد
- آپلود فایل در Asp.net core چگونه است؟
- حذف کامل یک رکورد در جدول ریلیشن شده
- اشکال در آپلود فایل ویدیو در mvc core 2