Vahid
Vahid
خواندن ۵ دقیقه·۵ سال پیش

از celery بهتر استفاده کنیم(۲)

https://www.caktusgroup.com/blog/2016/10/18/dont-keep-important-data-your-celery-queue خود لینک عکس نکته داره :)
https://www.caktusgroup.com/blog/2016/10/18/dont-keep-important-data-your-celery-queue خود لینک عکس نکته داره :)


لینک قسمت اول

یه راست میریم سر اصل مطلب و ويژگی هایی که می تونه بهمون تو استفاده بهتر از celery کمک مون کنه رو مرور می کنیم.

نکته مهم اینکه فرض می کنیم یه تسک با اسم test_task داریم و مثال ها بر اساس اون میریم جلو.

این تسک مثلا این طوری تعریف شده:

@celery.shared_task(bind=True) def test_task(self, *arg, **kwargs): logger.log(self.request) ....


۱) مخفی کردن اطلاعات حساس با استفاده از argsrepr و kwargsrepr

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

test_task.apply_async((&quotadmin&quot, &quotadmin&quot), argsrepr='(<secret-username>, <secret-password>)') یا test_task.s(password='12345678').set( kwargsrepr=repr({'password': '********'}) ).delay()

نکته ای که باید بهش توجه کرد اینکه این اطلاعات همچنان برای کسی که به اون تسک دسترسی داره در دسترس هستش. یعنی اگر ما بیایم از redis استفاده کنیم هر کسی به redis دسترسی داشته باشه به این اطلاعات هم دسترسی داره به خاطر همین گفته میشه که از encryption/decryption استفاده بشه. لینک منبع


۲) مانیتور کردن celery

راحت ترین کار استفاده از ابزار تحت وب flower هستش. لینک گیت هابش. امکاناتش رو بخونین متوجه میشین چه ابزار خوبیه و امار جالبی میده.

(داکیومنت خود celery هم توضیحاتی درمورد مانتیورینگ داره)


۳) ماجرای logger داخلی celery

در این مورد من توضیح خاصی نمیدم! همین issue (البته این دوتا رو هم بخونین. لینک ۱ و لینک ۲) مربوط به خود celery رو تا اخر بخونین دستتون میاد ماجرا(دلیل اینکه توضیح ندادم اینکه اونجا خیلی بهتر و مفصل تر بحث و توضیح داده شده در نتیجه بهتر متوجه میشین). :)


۴) استفاده از routing

شما می تونین برای تسک ها صف های مختلفی داشته باشین و worker ها هم می تونین به یک یا چند تا صف consume کنن.

test_task.apply_async((2, 2), queue='fake_queue')

ما اگر برای تسک صفی رو مشخص نکنیم به صورت پیشفرض صف celery استفاده میشه و همچنین اگر برای worker هم صف رو مشخص نکنیم صف celery برای consume انتخاب می کنه اما اگر بخوایم صف های دیگه ای رو هم consume داشته باشیم می تونیم باید از Q− استفاده کنیم یعنی این طوری:

celery -A proj worker -Q fake_queue, celery

البته برای بحث routing این مثالی که اینجا زدیم ساده ترین مدل ممکن هستش و کارهای خیلی بهتر و جالبی میشه انجام داد. اما از اونجایی که هدف ما معرفی ویژگی هاست به خاطر همین برای مطالعه بیشتر لینک میزارم. :)

لینک مرتبط با مباحث routing


۵) تسک های زمان بندی شده با celery beat

اگر تسک هایی داشته باشیم که باید در زمان بندی های خاصی اجرا بشن celery برای این نیاز هم تمهیداتی رو پیش بینی کرده.

به نظرم توضیح خاصی نمی خواد و بریم سراغ مثالش:

from celery import Celery from celery.schedules import crontab app = Celery() @app.on_after_configure.connect def setup_periodic_tasks(sender, **kwargs): # Calls test('hello') every 10 seconds. sender.add_periodic_task(10.0, test.s('hello'), name='add every 10') # Calls test('world') every 30 seconds sender.add_periodic_task(30.0, test.s('world'), expires=10) # Executes every Monday morning at 7:30 a.m. sender.add_periodic_task( crontab(hour=7, minute=30, day_of_week=1), test.s('Happy Mondays!'), ) @app.task def test(arg): print(arg)

برای شروع به کار سرویس celery beat هم داریم:

celery -A proj beat

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


۶) تست نویسی

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

چند روش برای نوشتن تست برای celery داریم که خودتون نیگا کنین با هر کدوم راحت بودین اون رو انتخاب کنین. لینک تست نویسی برای celery.


7) بخش کانفیگ و امکانات celery

نکته اینکه این سری مطالب رو تا چند قسمت دیگه هم میشه ادامه داد(بحث هایی مثل signal، امنیت، همزمانی و ...). از اونجایی هم که celery داکیومنت به نسبت خوبی داره(توجه کرده باشین تمام لینک ها از خود داکیومنتش بود)، به خاطر همین بهتره که دیگه مطلب رو ادامه ندیم و هر کسی که دوست داره از داکیومنت جامع تر و کامل تر بخونه.

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

همین. شاد و خندون باشین :)

celeryسلری
یه وحید از نوع برنامه نویسش :)
شاید از این پست‌ها خوشتان بیاید