Signal Dispatcher در جنگو

Signal Dispatcher به ما این امکان رو میده که اگر توی یک اپلیکیشن اتفاقی افتاد اپلیکیشن های دیگه یا جاهای دیگه رو notify کنیم که اتفاقی انجام شه. مثلا فرض کنید که یک نفر به ما یک پیام میفرسته. اون وقت من باید یه نوتیفیکیشن دریافت کنم. روش کار این مدلیه که یک تکه کد میتونه sender باشه و چند تابع میتونن reciever باشن. در واقع وقتی یک چند تابع به یک event حساس هستن میتونن از این قابلیت استفاده کنن.

در پروژه ای وقتی مستندات در مدلی به نام Document ذخیره میشه و همزمان یک تاریخچه از این ذخیره شدن توی DocumentChangeHistory ذخیره میشه. مشکل اینه که میخام وقتی یک داکیومنت حذف میشه تاریخچه مرتبط با اون هم پاک شه.

برای این کار باید از Signal جنگو استفاده کرد. مثلا

توی کد بالا میگیم که اگر مدل Document چیزی ازش حذف شد. post_delete .اون وقت این بلاک کد اجرا بشه که در واقع از مدل تاریخچه ردیف مرتبط رو حذف میکنه.

باید توی app.py این رو تعریف کنیم. تا کار کنه.

لینک 1

لینک 2

تغییر مسیر ذخیره فایلهای داکر

بعد از نصب داکر فایلهای مورد استفاده خود داکر از قبلی image هایی که load میکنید توی مسیر /var/lib/docker ذخیره میشه که میتونه بعد از مدتی پر شه یا اصلا شاید بخاید جای دیگه ای ذخیره بشه. من خودم چون پارتیشن دیگه ای با حجم بیشتر دارم خواستم یه دایرکتوری دیگه رو map کنم به این دایرکتوری. البته روش های مختلفی وجود داره برای تغییر مسیر اما بهترین روش با کمترین impact این روشه:

کامل ترش رو میشه توی این لینک ببینیم.

پر شدن دایرکتوری و کرش کردن سرور

بعد از اینکه توی سرور امکان لاگین وجود نداشت (سرویس freeIPA) با کنسول وصل شدم و متوجه شدم که پارتیشن /var/log/auditlog پر شده. بله یک پارتیشن پر شده و سرویس از کار افتاده بعد از مدتی سرور ریبوت و دیگه بالا نمیومد.

با crontab -e یه جاب نوشتم که پریودیک این مسیر رو خالی کنه.

تنظیمات SElinux و مشکلاتی که برای داکر داره

امروز بعد از ریبوت سرور سرویس داکر دیگه بالا نیومد و ارور زیر رو میگیرفتیم.

توی اینترنت گفته بودن که درایور رو عوض کنیم و … اما در نهایت متوجه شدم چون selinux روی premisive بوده به داکر اجازه داده نمیشه که از دیسک با LVM کانفیگ شده استفاده کنه. اروری که نشون میده:

این ارور رو باید با کامند dockerd --debug ببینید

چطور فهمیدم که مشکل از selinux هست. سرور به دلایلی ریبوت شده بود و دیگه داکر بالا نیومده بود. قبلا یکی از دوستان selinux رو فعال کرده بود و طبیعتا تا بعد از ریبوت اعمال نمیشه. متوجه شدم احتمالا مشکل از اینه.

حالا توی فایل /etc/selinux/config کافیه اونو disable کنی و ریبوت. داکر دوباره start میشه.

استقرار پروژه جنگو با بهینگی بالا

در پروژه ای که در بستر داکر روی لینوکس پیاده سازی شده است نرم افزار از performance قابل قبولی برخوردار نیست. بخشی از نرم افزار با websocket کار میکند اما اکثرا در بستر http. دیتابیس، و بخشهای دیگر مثل celery, rabbitMQ و … هر کدام یک کانتینر هستند.

ایرادات استقرار یا deployment:

جنگو در یک کانتینر با دستور runserver اجرا شده است.

کل پروژه از Daphne به عنوان اپلیکیشن وب سرور ASGI استفاده میکند در حالی که بخش کوچکی از نرم افزار asyn است و با websocket کار میکند.

وب سروری مثل Nginx یا Apache وجود ندارد که فایلهای استاتیک را ارائه دهد.

بهتر بود در بخشهای Sync از اپلیکیشن سروری مثل uWSGI که یک WSGI هست استفاده میشد.

بنابراین معماری به شکل زیر تغییر یافت:

NGINX درخواست های websocket رو به Daphne و سایر درخواست ها را به uWSGI ارسال میکند. فایل های کانفیگ از قرار زیر است.

compose.yml

nginx.conf

DockerfileNginx

DockerfileNasim

لینک های مرتبط:

لینک 1

لینک 2

لینک 3

لینک 4

لینک 5

افزایش ظرفیت پارتیشن ها توی LVM

توی یه سرور RHEL که از LVM برای مدیریت دیسک و پارتیشن استفاده میشه، لازم شد که حجم رو افزایش بدیم. یه دیسک sdb داریم که میخایم به 2 تا پارتیشن اضافه اش کنیم. LVM این کار رو انجام میده بدون اینکه پارتیشن ها نیاز به فرمت داشته باشن و داده های قدیمی از دست برن. یه چیزی مثل سرویس های ابری که هر وقت بخایم منابع اضافه میکنیم.

قبل از افزایش حجم وضعیت اینطور بود:

همینطور که میبینید /home و / هر کدوم 40 گیگابایت هستن که باید زیاد بشن.

میبینیم که /dev/sdb به دیکسها اضافه شده اما پارتیشن بندی نشده.

همینطور که میبینیم sdb اصلا به هیچ volume group ای از LVM اضافه نشده پس معلومه که قابل استفاده است.

میبینیم که یه logical volume داریم vg0 که یه دونه pv هم داره که در واقع همون sda3 هست که قبلا دیدیم و بازم مطمثن شدیم که sdb استفاده نمیشه

یه نگاه مجدد به logical volume ها میندازیم.

با دستور بالا sdb رو به یه phisical volume تعریف کردیم که بتونیم توی LVM ازش استفاده کنیم. در وا

میبینیم که sdb اضافه شده.

حالا sdb رو به volume group vg0 اضافه میکنیم که بتونیم به logical volume ها اضافه اش کنیم.

همینطور که میبینیم اضافه شده. الان vg0 حدود یک ترابایت خالی داره.

حالا 512 گیگابایتش رو به / یا همون root اضافه کردیم.

از فضای خالی باقیمانده بقیه شو به /home اضافه کردیم.

همینطور که میبینید / و /home حجمشون زیاد شده.

بلاکچین – یک تراکنش چطور انجام میشود؟

هر بلاکچین یک فرایندی برای انجام یک تراکنش دارد. مثلا توی بیتکوین وقتی توسط یک کیف پول یک تراکنش را شروع میکنیم این نرم افزار یک فرایندی را شروع میکند.

توی بیتکوین وقتی که تراکنش را شروع میکنیم، این تراکنش به یک صف موجود در استخر حافظه بلاکچین قرار میگیرد و بعد از اینکه یک بلاک را پر کرد منتظر میماند تا یک ماینر آن بلاک را بردارد و پردازش کند (اینکه یه ماینر اون رو برداره مثل کاری هست که معدنچی میکنه)

ماینرهای مختلف بلاکهای مختلف را برمی دارند. بعد هر کدام شروع میکنند به انجام دادن یک عملیات رمزنگاری بر روی بلاک (که بهش میگن proof of work یا POW)

بعد از اینکه این یک بلاک توسط یک ماینر رمز میشود و صحت سنجی می شود به عنوان یک بلاک قانونی در بلاکچین در نظر گرفته میشود.

بلاک های قانونی به هم زنجیر میشوند و به رشته ای از بلاک های قانونی غیرقابل تغییر شناخته میشوند.

در آخر تراکنش در کیف پول انجام میگیرد.

بلاکچین – چطور کار میکنه؟

بلاکچین یک پایگاه داده توزیع شده است. هر چند اکسل دیتابیس نیست ولی یه چیزی شبیه به همون و تفاوت اصلیش اینه که داده ها چطور توش ذخیره و چطور قابل دسترسی هستند.

بلاکچین یک سری برنامه داره که بهش میگن script که این script ها کارهایی که تا حالا شما توی پایگاه داده های معمولی انجام میدادید رو به صورت اتوماتیک انجام میدن. مثل ذخیره سازی داده ها و دسترسی به اونها.

بلاکچین توزیع شده است یعنی هر بلاک که نوشته میشه، چند تا کپی میشه و توی چند کامپیوتر دیگه ذخیره میشه. اگر بخایم ببینیم یه بلاک سالم هست یا نه (تقلبی نیست) بلاکچین با چند تا کپی موجود مقایسه میکنه و صحت سنجی میکنه.

بیتکوین هم بستر بلاکچین مخصوص به خودش رو داره. که تراکنش ها توی بلاکهایی با حجم 4 مگابایت ذخیره میکنه (توی بلاکچین های دیگه این مقدار فرق میکنه). وقتی که یک بلاک پر میشه با یک الگوریتم رمزنگاری، رمز میشه و از اون یک عدد (مبنای 16) به دست میاد. به این عدد میگن block header hash یا مقدار هش هدر مربوطه به بلاک. این مقدار توی هدر بلاک بعدی قرار میگیره و باز هم با مقدارهای دیگه که توی این هدر جدید موجود هست رمزنگاری میشه و به این شکل یک رشته یا شبکه ایجا میشه. بخاطر همین بهش میگن بلاکچین.

بلاکچین – چی هست؟

بلاکچین یک دیتابیس توزیع شده است. دیتابیسی که به جای اینکه توی یک سرور نصب بشه، توی هزاران کامپیوتر تقسیم شده (توزیع شده). دیتابیسی که توی یه سرور نصب بشه ممکنه با خاموش شدن سرور از بین بره، ممکنه افراد سودجود ازش بهره برداری کنن، دولت ها میتونن دسترسی بهش رو محدود کنند و ممکنه توش اطلاعات یا داده ها خراب بشه و یه جاهایی اطلاعات از بین بره.

ولی توی بلاکچین این داده ها بین هزاران کامپیوتر تقسیم شده. پس کسی نمیتونه اون اطلاعات رو از بین ببره. بلاکچین میاد داده ها رو بین کامپیوترهای مختلف توی بلاک های مختلف ذخیره میکنه و وقتی داده جدیدی به این اضافه میشه یه بلاک اضافه میشه و مدام در حال بزرگ شدنه. هر بلاک طی یه عملیات ریاضی که توسط کامپیوترها یا ماینرها (معدنچی ها) ساخته میشه و توسط سه ماینر دیگه صحت سنجی میشه پس اگر در یکی از بلاک ها داده خراب بشه توسط اون سه نفر دیگه درست میشه. از توضیحات دیگه توی این پست میگذرم چون اینجا فقط تعریف میکنیم.

پس بلاکچین یک پایگاه داده توزیع شده روی رایانه های مختلف هست. جوری دیگه هم میشه تعریف کرد. بلاکچین مثل دفتر کل حسابدارهاست ledger. دفتر کل دفتری هست که تمامی تراکنش های مالی یه سازمان توش نوشته شده و چیزی توش از قلم نمی افته. بلاکچین هم همینه. هر تراکنشی انجام بشه توی بلاک ها ذخیره میشه.

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

روی این بستر بلاکچین امکاناتی ساخته شده. مثل رمزارزها (مثلا بیتکوین یا اتریوم)، اپلیکیشن های توزیع شده مالی DeFi یا Decenteralized Finance، توکن های غیرقابل جعل NFT یا non-Fungible token و smart contract ها که به فارسی میشه قراردادهای هوشمند.

این قابلیتها از این بستر و قابلیت ها اون استفاده میکنن. مثلا گفتیم که داده های داخل بلاکچین قابل جعل نیست پس برای ساخت قراردادهای هوشمندی که نشه جعلش کرد عالیه. یا مثلا بخاطر اینکه تراکنشها از ببین نمیره و قابل اتکاست برای سیستم های مالی عالیه و …

یک نمونه AJAX

در یک پروژه پرتکرار از AJAX استفاده کردیم و یه نمونه پیچیده شو اینجا میزارم.

در کد بالا route زیر که مربوط به یک view توی جنگو هست صدا زده شده

این یک route مربوطه به جنگو هست که یک پارامتر به اسم dep_id هم میگیره. قسمت جالب این کد اینه که همین کد جاوااسکریپت با django template engine داره render میشه و بعد توسط .replcace اصلاح میشه

نمونه route و view رو هم در ادامه میبینید.