Syntax | سینتکس – Telegram
سوال:

برای یک سرویس چت میخوام از Fastapi و سوکت نویسی استفاده کنم (جنگو چنلز بلد نیستم)

یک monolithic برنامه اصلی هست
این قسمت چت رو میخوام میکروسرویس بچسبونم بهش

مدل کاربر اعتبار سنجی ها (jwt ) رو چطور درست میکنن
یا اگر با مدل دیگه تو برنامه اصلی کار داشتیم چطور کار می‌کنند باهاش.

[Mojtaba]

@citax_tel 👈 سیتاکس
👍7
Syntax | سینتکس
سوال: برای یک سرویس چت میخوام از Fastapi و سوکت نویسی استفاده کنم (جنگو چنلز بلد نیستم) یک monolithic برنامه اصلی هست این قسمت چت رو میخوام میکروسرویس بچسبونم بهش مدل کاربر اعتبار سنجی ها (jwt ) رو چطور درست میکنن یا اگر با مدل دیگه تو برنامه اصلی…
اطلاعات مورد نیاز کاربر رو توی توکن مینویسی و توی سرویسای دیگت میتونی از توکن بخونی، مثل یوزرنیم، تلفن، یوزر آیدی، نقش ها، زبان، ادرس تصویر پروفایل..
برای امنیت بیشتر توکن رو رمز‌نگاری میکنی که با یک‌کلید مشخص که فقط برنانه خودت داره میتونه خونده و ادیت بشه.
حالا اون سرویس چت از توکن کاربر رو میشناسه. برای باقی مباحث ممکن هست نیاز به ذخیره اطلاعات کاربر و مشتقاتش روی سرویس چتت هم داشته باشی. این جزو چالش های میکروسرویس ها هست دیگه. یا باید هر بار نیاز داری بری از سرویس اصلیت بگیری یا تو سرویس ثانویه ات هم‌نگهداری کنی و اپدیت بکنی در صورت تغییر ( یکپارچگی داده  ها)

ارتباط مابین سرویس ها، میتونه از طریق rest api ها باشه، میتونه از طریق grpc باشه، میتونه از طریق message broker ای مثل rabbitmq باشه..
شکستن وظایف یک پروژه به سرویس های مجزا شروع میکروسرویسی شدنه معماریت هست. هر چند که به این میگیم bounded contexts تا میکروسرویس.

سمت سوکت نویسی هم‌ نرو وقتی کتابخونه های خوبی مثل signalr و grpc و امثالهم هست. سیگنال آر راحته همه جا میتونی استفاده کنی پرفورمنسشم خوبه.
کلاینت ها همه به یک Hub لیسن میشن که متد های خودش رو داره مثلا send و get.‌ به محض اومدن پیام یک ایونت بهشون داده میشه که بیا بگیر دیتات رو اپدیت کن
ارتباط bidirectional و duplex

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

[mrgrayhat]

@citax_tel 👈 سیتاکس
🔥7
🔥3
Race condition

معمولاً race condition هنگامی رخ می‌دهد که دو یا چند نخ به صورت همزمان به منابع مشترک دسترسی دارند و تغییرات را اعمال می‌کنند. این تداخل می‌تواند به تداخل در دسترسی به داده‌ها، تعارض در تغییرات و حالت‌های نامتوازن منجر شود.

برای مثال، فرض کنید جدول یوزر یک column به اسم score دارد که داخلش امتیاز کاربر رو ذخیره میکنیم.
ممکنه کاربر در یک لحظه دو تا امتیاز بگیره که باید به درستی ذخیره بشن.
اگه در یک لحظه اتفاق بیوفته هر دو نخ فیلد score رو میگیرن و امتیاز رو اضافه میکنن. اینجاست که race condition اتفاق میوفته و دیتا به درستی ذخیره نمیشه در واقع یکی از این دو امتیاز ذخیره نمیشه

سوال
برای جلوگیری از این اتفاق ما باید نحوه ذخیره امتیازات رو تغییر بدیم.
شما چه تغییری بوجود میارید تا در هر حالت امتیاز به درستی ذخیره بشه ؟!

روش های پیشنهادی پست بعدی قرار میگیره

#race_condition #دیتابیس

@citax_tel 👈 سیتاکس
👀8
Syntax | سینتکس
Race condition معمولاً race condition هنگامی رخ می‌دهد که دو یا چند نخ به صورت همزمان به منابع مشترک دسترسی دارند و تغییرات را اعمال می‌کنند. این تداخل می‌تواند به تداخل در دسترسی به داده‌ها، تعارض در تغییرات و حالت‌های نامتوازن منجر شود. برای مثال، فرض…
روش های پیشنهادی که دوستان گفتن

میثم:
سمافور
میوتکس


مهدی:
میریزیم توی ربیت از اونجا میریزیم توی دیبی
تمام امتیاز ها توی صف قرار میگیرن تا کم کم وارد دیبی بشن

اینطوری تایم رید و رایت کردن دیتابیس هم حذف میشه و تایم ریکویست هم چند میلی ثانیه کم تر میشه

m:
میتونیم از transaction.atomic و لاک کردن استفاده کنیم

بنظرتون کدوم روش منطقی تره! یا اینکه روش بهتری براش دارید؟(صرف نظر از اینکه با چه ابزاری قراره پیاده شه)

@citax_tel 👈 سیتاکس
👍6
روشی که خودم برای حل این مشکل استفاده میکنم به این شکل است که اون آبجکت دیتابیس رو لاک میکنم تا تغییرات رو انجام بدم و بقیه ترد ها در اون لحظه دسترسی نداشته باشن.
توی جنگجو به این صورت پیاده می شه.

سوال:
چرا من
instance = cls.objects.select_for_update().filter(user=user)
بیرون از transaction.atomic نوشتم؟‌

پاسخ یکی از دوستان که کاملا درسته:

چون کلا کوئری ها لیزی هستن تا زمانی که جایی استفاده نکنی اجرا نمیشن.
اونجا که exists رو میزنی اونم به دلیل وجود if قبلش اجرا میشه

@citax_tel 👈 سیتاکس
7👍2
Syntax | سینتکس
روش های پیشنهادی که دوستان گفتن میثم: سمافور میوتکس مهدی: میریزیم توی ربیت از اونجا میریزیم توی دیبی تمام امتیاز ها توی صف قرار میگیرن تا کم کم وارد دیبی بشن اینطوری تایم رید و رایت کردن دیتابیس هم حذف میشه و تایم ریکویست هم چند میلی ثانیه کم تر میشه …
سمافور‌(Semaphore) و میوتکس (Mutex)

سمافور (Semaphore) و میوتکس (Mutex) هر دو الگوهای هماهنگی (synchronization) در برنامه‌نویسی چندنخی هستند که برای مدیریت دسترسی همزمان نخ‌ها به منابع مشترک استفاده می‌شوند. این الگوها کمک می‌کنند تا race condition ها زمان اجرای همزمان نخ‌ها را کنترل کنند.

Mutex
میوتکس (Mutex) یک متغیر بولین است که دارای دو وضعیت قفل شده (locked) و غیرقفل شده (unlocked) است. نخ‌ها قبل از دسترسی به منبع مشترک، میوتکس را قفل می‌کنند و بعد از اتمام کار، آن را باز می‌کنند. تنها یک نخ می تواند میوتکس را قفل کند و سایر نخ‌ها باید منتظر آزاد شدن آن شوند. این باعث می‌شود تا فقط یک نخ به طور همزمان به منبع مشترک دسترسی داشته باشد و تداخلات رخ ندهد. میوتکس‌ها به عنوان یک راه حل ساده و موثر برای مدیریت همزمانی استفاده می‌شن.

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

@citax_tel 👈 سیتاکس
👍8
Syntax | سینتکس
سمافور‌(Semaphore) و میوتکس (Mutex) سمافور (Semaphore) و میوتکس (Mutex) هر دو الگوهای هماهنگی (synchronization) در برنامه‌نویسی چندنخی هستند که برای مدیریت دسترسی همزمان نخ‌ها به منابع مشترک استفاده می‌شوند. این الگوها کمک می‌کنند تا race condition ها زمان…
سمافور و میوتکس هم یکسان نیستند.

سمافور کمی پیشرفته تر هستش و خاصیت ownership نداره

توی میوتکس ، فقط اون تردی که لاک کرده میتونه آنلاکش کنه

ولی توی سمافور ما میتونیم از هر تردی لاک و آنلاک کنیم

سمافور قابلیت مولتی ترد هم داره
یعنی شما میتونی به 3 ترد همزمان دسترسی بدید

البته سمافور بخاطر این قابلیت های خوبش کمی سنگین تر و آبجکت هاش بزرگتره. که میتونید از SemaphoreSlim استفاده کنید


توی دات نت و جاوا هستش و فکر کنم بشه یک نتیجه ی نزدیک به سمافور اسلیم ( با اهمون سبکی و قدرتی) رو توی پایتون هم بگیرید

البته مطمئن نیستم ولی gevent و asyncio هم سمافور دارن

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

[BiggyWili]

@citax_tel 👈 سیتاکس
👍8
🔥 امشب میت داریم اونم چه میتی 🔥

امشب ساعت 9:30 توی گوگل میت قراره درباره این موارد حرف بزنیم:

Performance Optimizations & Tuning (DB, Code, UI)

RPS ( Requests per second)

Tradeoffs

Benchmarks meaning

JWT & Security

موضوع متینگ پرفورمنس و تریدآف

همچنین در خصوص معماری حرف میزنیم ،رویکردهای بهتر در کدنویسی.

طبق موضوعی که در گروه گفته شد درمورد JWT و امنیت توکن صحبت می کنیم.

و به احتمال زیاد یکی از دوستان درباره مقاله‌ی خودش که ثبت جهانی شده برامون میگه که در خصوص هوش مصنوعی و nlp هستش

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

کانال اصلی برگزاری میت (حتما جوین شید):
https://news.1rj.ru/str/Code_Crafters

لینک میت ساعت نه و نیم توی این کانال قرار میگیره و منم میذارمش.

#میت

@citax_tel 👈 سیتاکس
🔥8👍4
دوست دارید تو میت هفته بعدی درباره چه موضوعی صحبت شه؟
تو کامنت بنویسید
👀6
Syntax | سینتکس
روشی که خودم برای حل این مشکل استفاده میکنم به این شکل است که اون آبجکت دیتابیس رو لاک میکنم تا تغییرات رو انجام بدم و بقیه ترد ها در اون لحظه دسترسی نداشته باشن. توی جنگجو به این صورت پیاده می شه. سوال: چرا من instance = cls.objects.select_for_update()…
جواب سوالی که تو این پست پرسیدم رو یکی از دوستان توی کامنت گفتن.

اما چرا orm چنین کاری رو انجام میده؟

دلیل اصلی این رفتار در بیشتر ORM‌ها، بهینه‌سازی عملکرد و کاهش تعداد کوئری‌های ارسالی به دیتابیس است.

زمانی که شما یک کوئری را در ORM می‌سازید، ORM آن را به صورت یک نمونه از یک کلاس مدل (Model) در نظر می‌گیرد. این کلاس مدل شامل اطلاعاتی است که برای انجام کوئری مورد نیاز است، مانند شرایط جستجو، مقادیر بروزرسانی و غیره. اما کوئری به صورت واقعی به دیتابیس ارسال نمی‌شود تا زمانی که شما درخواستی برای دستیابی به نتیجه کوئری داشته باشید.

به طور کلی، این رویکرد در ORM‌ها بهبود عملکرد، قابلیت تغییرپذیری و امنیت را بهبود می‌بخشد. با این حال، ممکن است در برخی موارد نیاز داشته باشید کوئری را فوراً به دیتابیس ارسال کنید، برخی ORM‌ها امکاناتی برای این منظور فراهم می‌کنند. به عنوان مثال، ممکن است بتوانید از متدی مانند .execute() در ORM استفاده کنید تا کوئری را بدون تأخیر ارسال کنید. همچنین، برخی ORM‌ها ممکن است حالت‌هایی برای اجرای فوری کوئری‌ها، مانند حالت تراکنش (Transaction)، ارائه دهند.

#orm

@citax_tel 👈 سیتاکس
👍6
Syntax | سینتکس
وضعیت شغلی شما
با توجه به اینکه خیلیا گفتن دنبال کاریم. میخوام که درباره ساخت رزومه تا گرفتن مصاحبه براتون ویدیو ظبط کنم و یه سری نکاتی که بلدم رو توضیح بدم.

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

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

رزومه ای که درست میکنیم برای یک شخص جونیور (Python back end developer / Django) هست که میخواد تازه وارد بازار کار بشه پس نمونه کار و تجربه کاریه زیادی نداره

اگه نظری دارید خوشحال میشم درمیون بذارید تا قبل از ظبط بهش توجه کنم

@citax_tel 👈 سیتاکس
🔥13👍6
Forwarded from ELYAS
اگه کسی هستش که دنبال کار میگرده و سابقه حداقل ۱ ساله داره ما به یه نیرو توی شرکت برای بک اند نیاز داریم خوشحال میشم رزومه بفرسته تا با هم بیشتر در موردش صحبت کنیم
Forwarded from ELYAS
آگهی استخدام و فرصت های شغلی جدید در سراسر ایران | جاب‌ویژن
https://jobvision.ir/jobs/job-detail/526593?ReferrerJobPosition=8&row=53&pageSize=30&keyword=python&searchId=383013559661990286
Syntax | سینتکس
آگهی استخدام و فرصت های شغلی جدید در سراسر ایران | جاب‌ویژن https://jobvision.ir/jobs/job-detail/526593?ReferrerJobPosition=8&row=53&pageSize=30&keyword=python&searchId=383013559661990286
بچه ها این موقعیت شغلی رو یکی توی کامنت کانالمون گذاشته که بنظرم شرایطشون خوبه.
اگه به django تسلط دارید موقعیت خوبیه
🔥5
MQ

ام کیو در برنامه‌نویسی مخفف Message Queue است. Message Queue یک سیستم نرم‌افزاری است که برای ارسال و دریافت پیام‌ها بین مؤلفه‌های یک سیستم بکار می‌رود. این سیستم به مؤلفه‌ها اجازه می‌دهد تا با یکدیگر از طریق صف‌های پیام ارتباط برقرار کنند.

RabbitMQ:
یکی از نرم‌افزارهای محبوب Message Queue است که به عنوان یک سرویس بروکر پیام (Message Broker) عمل می‌کند. در RabbitMQ، برنامه‌ها می‌توانند پیام‌ها را به صف‌های پیام (Message Queue) ارسال کنند و برنامه‌های دیگر می‌توانند این پیام‌ها را از صف‌ها دریافت کنند و بر اساس آن‌ها عملیات خاصی را انجام دهند. این نوع سیستم‌ها برای مدیریت دسترسی به پیام‌ها، توزیع بار، قابلیت اطمینان و ارتباط بین برنامه‌های مختلف بسیار مفید است.

با استفاده از RabbitMQ و دیگر سیستم‌های MQ، برنامه‌ها می‌توانند به صورت ناهمزمان و مستقل از همدیگر کار کنند. برنامه‌ای که پیام را ارسال می‌کند، نیازی به انتظار برای پاسخ ندارد و می‌تواند ادامه کار خود را انجام دهد. برنامه‌های دریافت‌کننده نیز می‌توانند پیام‌ها را به ترتیب دریافت کنند و بر اساس نیاز خود عملیات مورد نظر را انجام دهند (برای مثال در ارسال ایمیل)

استفاده از سیستم‌های MQ می‌تواند در بسیاری از سناریوها مفید باشد، از جمله پردازش ناهمزمان، توازن بار، مدیریت خطا و ... ‌.

#MQ #rabbitmq

@citax_tel 👈 سیتاکس
👍9
برنامه (Citax Weekly) 🔥

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

جدا از این موارد دوست دارم روی یک سری مسائل دیگه مثل نحوه فعالیت در لینکدین، راه اندازی استارت اپ، مهاجرت و ... هم گفتگو کنیم.

برنامه بصورت پادکست، میت و وبینار برگزار میشه

اگه نظر و انتقادی دارید خوشحال میشم درمیون بذارید

#citax_weekly

@citax_tel 👈 سیتاکس
🔥10👍21
IMS

سیستم مدیریت هویت (Identity Management System) یا به اختصار IMS، یک نوع سیستم مدیریت است که برای مدیریت و کنترل هویت و دسترسی کاربران استفاده می‌شود.

به طور کلی، سیستم مدیریت هویت شامل موارد زیر است:

1. احراز هویت (Authentication): شناسایی و تأیید هویت کاربران با استفاده از اطلاعاتی مانند نام کاربری و رمز عبور، کارت هوشمند، اثر انگشت و یا سایر روش‌های تشخیص هویت.

2. مجوزدهی و کنترل دسترسی (Authorization and Access Control): تعیین سطح دسترسی کاربران به منابع و سیستم‌های مختلف بر اساس نقش و مسئولیت کاربر

3. مدیریت هویت (Identity Management): مدیریت و ثبت هویت کاربران، شامل ایجاد و حذف حساب کاربری، تغییرات مربوط به هویت کاربران و همچنین همگام‌سازی اطلاعات هویت در سیستم‌های مختلف.

4. سیاست و قوانین امنیتی (Security Policies and Compliance): تعیین سیاست‌ها و قوانین امنیتی برای حفاظت از اطلاعات حساس و اطمینان از رعایت استانداردها و قوانین مربوط به حفظ حریم خصوصی و امنیت اطلاعات

#IMS

@citax_tel 👈 سیتاکس
❤‍🔥7🔥2👍1