خشایار نوریان


مهندس نرم‌افزار | مشاور فنی

سیستم‌های نرم‌افزاری قابل‌اعتماد، معماری عملی و برنامه‌های مجهز به AI.

پلتفرم‌های نرم‌افزاری را طراحی و مدرن‌سازی می‌کنم، عملکردشان را بهبود می‌دهم و به تیم‌ها کمک می‌کنم نرم‌افزار قابل‌اعتماد را بدون پیچیدگی اضافی تحویل دهند.

پروژه‌های منتخب

پروژه‌هایی که ساخته‌ام

همه‌ی پروژه‌ها

Pulseتوسعه: شروع - به‌روزرسانی

Pulse بررسی می‌کند که یک سرویس از شبکه‌های مختلف درست رفتار می‌کند، نه فقط اینکه یک مانیتور به آن می‌رسد. صفحه‌ی کنترل مرکزی ASP.NET تعریف بررسی‌ها را به ایجنت‌های قابل‌استقرار می‌رساند و آن‌ها اندازه‌گیری‌ها را از راه HTTP برمی‌گردانند.

بررسی‌های HTTP، ping و TCP تأخیر و خطاها را ثبت می‌کنند و پیشخوان نتیجه‌های اخیر و سلامت ایجنت‌ها را کنار هم می‌گذارد. SQLite استقرار اول را ساده نگه می‌دارد و قراردادهای مشترک، سرور، ایجنت‌ها و رابط Blazor را هم‌راستا می‌کنند.

ادامه مطلب ...

cowork-serverتوسعه: شروع - به‌روزرسانی

cowork-server یک API برای رزرو اتاق‌های جلسه در فضای کار اشتراکی است. پیش از ثبت رزرو، دسترسی کاربر، ساعت کاری اتاق، بازه و مدت رزرو، تداخل و مبلغ بررسی می‌شوند.

مسیرهای command و query در یک برنامه و یک پایگاه‌داده از هم جدا هستند. قفل رزرو فقط در یک فرایند جلوی درخواست‌های هم‌زمان را می‌گیرد؛ اجرای چندنمونه‌ای به راه‌حل دیگری برای هماهنگی نیاز دارد.

ادامه مطلب ...

از دفترچه‌ی یادداشت

آخرین نوشته‌ها

همه‌ی نوشته‌ها

Idempotency: تکرار عملیات بدون اثر دوبارهمنتشر شده در

بعد از timeout، فراخواننده نمی‌داند عملیات موفق بوده یا نه. Idempotency اجازه می‌دهد همان عملیات را دوباره درخواست کند، بدون اینکه اثر موردنظر در کسب‌وکار دوباره اعمال شود؛ حتی اگر تأیید موفقیت به او نرسیده باشد.

یک worker ساده در C#، کلید ثابت، ذخیره‌ی نتیجه و رسیدگی به درخواست‌های تکراری را نشان می‌دهد؛ با محدودیت‌های روشن در هم‌زمانی، راه‌اندازی مجدد، نگهداری سوابق و اثرهای خارج از برنامه.

مهندسی معماری نرم‌افزار #csharp #dotnet #idempotency #background-processing

ادامه مطلب ...

Task، async و await: مسیر کار غیرهمگام از شروع تا نتیجهمنتشر شده در

مسیر متدی را دنبال می‌کنیم که به پاسخ HTTP نیاز دارد: درخواست را شروع می‌کند، متن پاسخ را می‌گیرد و آن را به نتیجه تبدیل می‌کند. تسک درخواست HTTP و تسک خود متد، هرکدام بخش متفاوتی از این کار را نشان می‌دهند.

می‌بینیم await هنگام انتظار چه می‌کند، خطا و لغو چگونه به فراخواننده می‌رسند و متد پس از آماده شدن پاسخ کجا ادامه پیدا می‌کند.

مهندسی توسعه نرم‌افزار #csharp #dotnet #async

ادامه مطلب ...

CQRS با مخزن خواندن جدا: نمایش‌های مفید و تضمین‌های تازهمنتشر شده در

مخزن خواندن جدا کمک می‌کند داده را برای یک صفحه یا گزارش و نه برای نیازهای مدل نوشتن شکل دهیم. این کار می‌تواند join‌های پرهزینه را کم کند و ظرفیت خواندن را مستقل افزایش دهد.

در عوض، یک مسئله‌ی همگام‌سازی به وجود می‌آید. ممکن است داده‌ی خواندنی قدیمی باشد و نمایش باید بتواند به‌طور امن بازیابی شود و برنامه باید روشن کند کاربر پس از ارسال یک command چه چیزی می‌بیند.

مهندسی معماری نرم‌افزار #architecture #cqrs #projections #eventual-consistency #dotnet #csharp

ادامه مطلب ...

CQRS حداقلی: مسیرهای کد را جدا کنید، یک برنامه و یک پایگاه‌داده نگه داریدمنتشر شده در

CQRS لازم نیست از همان روز اول با دو پایگاه‌داده و چند سرویس شروع شود. می‌توان مسیر command و مسیر query را در همان برنامه و پایگاه‌داده جدا کرد، چون کارشان واقعاً یکی نیست.

مسیر command از تغییر محافظت می‌کند و مسیر query پاسخ مناسب فراخواننده را می‌سازد. این انتخاب تراکنش و خواندن فوری را نگه می‌دارد، اما مقیاس‌پذیری مستقل خواندن را به دست نمی‌دهد.

مهندسی معماری نرم‌افزار #architecture #cqrs #cqs #dotnet #csharp

ادامه مطلب ...