Azure فنکشن ایونٹ پروسیسنگ میں خرابی سے نمٹنے کو ہموار کرنا
توسیع پذیر نظام بناتے وقت، مستثنیات کو احسن طریقے سے سنبھالنا بہت ضروری ہے، خاص طور پر Azure Functions جیسی خدمات میں۔ یہ افعال اکثر آنے والے واقعات سے نمٹتے ہیں، جہاں عارضی مسائل یا خراب پے لوڈز سے غلطیاں پیدا ہو سکتی ہیں۔ 🛠️
ایک حالیہ پروجیکٹ میں، مجھے ایک ایسے منظر نامے کا سامنا کرنا پڑا جہاں میرے ازگر پر مبنی Azure فنکشن کو متعدد JSON واقعات پر کارروائی کرنے کی ضرورت تھی۔ ہر ایونٹ کی توثیق اور کارروائی کی جانی تھی، لیکن `JSONDecodeError` یا `ValueError` جیسی خرابیاں ہو سکتی ہیں، جس سے پورے بہاؤ میں خلل پڑ سکتا ہے۔ میرا چیلنج؟ اصل پیغام اور سیاق و سباق کو محفوظ رکھتے ہوئے تمام مستثنیات کو سمیٹنے کے لیے ڈیکوریٹر کو لاگو کریں۔
سینکڑوں ایونٹ کے پیغامات موصول ہونے کا تصور کریں، جہاں ایک مسئلہ پائپ لائن کو روکتا ہے۔ یہ پے لوڈ میں غائب فیلڈ یا یہاں تک کہ ایک بیرونی API کے غیر متوقع طور پر ناکام ہونے کی وجہ سے ہو سکتا ہے۔ مقصد صرف غلطی کو لاگ کرنا نہیں تھا بلکہ اصل پیغام اور استثنیٰ کو ایک مستقل شکل میں سمیٹنا تھا، جس سے ٹریس ایبلٹی کو یقینی بنایا گیا تھا۔
اس کو حل کرنے کے لیے، میں نے ازگر کے ڈیکوریٹرز کا استعمال کرتے ہوئے ایک حل وضع کیا۔ اس نقطہ نظر نے نہ صرف اٹھائے گئے استثنیٰ کو حاصل کیا بلکہ مزید کارروائی کے لیے متعلقہ ڈیٹا کو بھی آگے بھیج دیا۔ آئیے میں آپ کی رہنمائی کرتا ہوں کہ آپ کے ڈیٹا کی سالمیت کو برقرار رکھتے ہوئے ان تقاضوں کو پورا کرنے والے ایک مضبوط ایرر ہینڈلنگ میکانزم کو کیسے نافذ کیا جائے۔ 🚀
حکم | استعمال کی مثال |
---|---|
functools.wraps | یہ ڈیکوریٹرز میں اصل فنکشن کے میٹا ڈیٹا کو محفوظ رکھنے کے لیے استعمال کیا جاتا ہے، جیسے کہ اس کا نام اور ڈاکسٹرنگ۔ یہ یقینی بناتا ہے کہ ریپر فنکشن اصل صفات کو اوور رائڈ نہیں کرتا ہے۔ |
json.loads | JSON سٹرنگ کو ازگر فنکشن میں آنے والے ایونٹ کے پیغامات کو ڈی سیریلائز کرنے کے لیے ضروری Python ڈکشنری میں تبدیل کرتا ہے۔ |
logging.error | استثنیٰ ہینڈلنگ کے دوران خرابی کے پیغامات کو لاگ کرنے کے لیے استعمال کیا جاتا ہے، جو پروڈکشن سسٹم میں مسائل کو ڈیبگ کرنے اور ٹریک کرنے کے لیے اہم ہے۔ |
raise Exception | واضح طور پر ایک استثناء کو بڑھاتا ہے، اصل استثنائی پیغام کو اضافی سیاق و سباق کے ساتھ جوڑ کر، جیسے کہ اصل پیغام پر کارروائی ہو رہی ہے۔ |
async def | ایک غیر متزلزل فنکشن کی وضاحت کرتا ہے، غیر مسدود کرنے والی کارروائیوں کو فعال کرتا ہے جیسے ازگر میں ایک ساتھ متعدد درخواستوں کو ہینڈل کرنا۔ |
httpx.AsyncClient | غیر مطابقت پذیر HTTP درخواستیں کرنے کے لیے ایک مخصوص HTTP کلائنٹ، خاص طور پر Azure فنکشن میں بیرونی APIs کے ساتھ تعامل کرتے وقت مددگار۔ |
@ErrorHandler | غلطی سے نمٹنے اور سیاق و سباق کو برقرار رکھنے کے فنکشنز کو لپیٹنے کے لیے کلاس پر مبنی حل میں ایک ڈیکوریٹر۔ |
middleware | ایک حسب ضرورت مڈل ویئر فنکشن مستثنیات کو ہینڈل کرنے کے لیے ایک پرت کے طور پر کام کرتا ہے اور ایک سے زیادہ فنکشن کالز کے لیے سنٹرلائزڈ انداز میں پیغامات کو لاگ کرتا ہے۔ |
asyncio.run | اسکرونس سیاق و سباق میں غیر مطابقت پذیر فنکشنز کو چلانے کے لیے استعمال کیا جاتا ہے، اسکرپٹس میں async طریقوں کی آسان جانچ کی اجازت دیتا ہے۔ |
KeyError | واضح طور پر اس وقت اٹھایا جاتا ہے جب لغت میں مطلوبہ کلید غائب ہو، جیسے JSON پے لوڈ میں غائب فیلڈ۔ |
ازگر میں ایک مضبوط استثنیٰ ہینڈلنگ میکانزم بنانا
Python میں، ڈیکوریٹرز فنکشنز کے رویے کو بڑھانے یا اس میں ترمیم کرنے کا ایک طاقتور طریقہ فراہم کرتے ہیں، جو انہیں مرکزی انداز میں مستثنیات سے نمٹنے کے لیے مثالی بناتے ہیں۔ مندرجہ بالا مثالوں میں، ڈیکوریٹر مستثنیات کو روکنے کے لیے ٹارگٹ فنکشن کو لپیٹ دیتا ہے۔ جب ایک استثناء اٹھایا جاتا ہے، ڈیکوریٹر غلطی کو لاگ کرتا ہے اور اصل سیاق و سباق کو محفوظ رکھتا ہے، جیسے کہ آنے والے ایونٹ کا پیغام۔ یہ یقینی بناتا ہے کہ پھانسی کے بہاؤ کے دوران غلطی کی معلومات ضائع نہیں ہوتی ہیں۔ یہ خاص طور پر Azure Functions جیسی سروسز میں مفید ہے، جہاں عارضی غلطیوں اور غلط پے لوڈز کو ڈیبگ کرنے کے لیے سیاق و سباق کو برقرار رکھنا بہت ضروری ہے۔ 🛠️
کا استعمال حل کا ایک اور اہم پہلو ہے۔ 'async def' کے ساتھ فنکشنز کی وضاحت کرکے اور 'asyncio' لائبریری کا استعمال کرتے ہوئے، اسکرپٹس مین تھریڈ کو بلاک کیے بغیر بیک وقت متعدد آپریشنز کو ہینڈل کرتی ہیں۔ مثال کے طور پر، ایونٹ ہب سے پیغامات پر کارروائی کرتے وقت، اسکرپٹ پے لوڈ کی توثیق کر سکتا ہے، API کالز انجام دے سکتا ہے، اور غلطیوں کو بیک وقت لاگ کر سکتا ہے۔ یہ غیر مسدود رویہ کارکردگی اور اسکیل ایبلٹی کو بڑھاتا ہے، خاص طور پر اعلی تھرو پٹ ماحول میں جہاں تاخیر مہنگی ہوتی ہے۔
مڈل ویئر اور کلاس پر مبنی ڈیکوریٹر حل لچک کی ایک اضافی تہہ لاتے ہیں۔ مڈل ویئر ایک سے زیادہ فنکشن کالز کے لیے سنٹرلائزڈ ایرر ہینڈلنگ پرت کے طور پر کام کرتا ہے، مستقل لاگنگ اور استثنیٰ کے انتظام کو یقینی بناتا ہے۔ دریں اثنا، کلاس پر مبنی ڈیکوریٹر کسی بھی فنکشن کو ریپ کرنے کے لیے دوبارہ قابل استعمال ڈھانچہ فراہم کرتا ہے، جس سے ایپلی کیشن کے مختلف حصوں میں اپنی مرضی کے مطابق ایرر ہینڈلنگ منطق کو لاگو کرنا آسان ہوجاتا ہے۔ مثال کے طور پر، JSON پیغامات کے بیچ پر کارروائی کرتے وقت، مڈل ویئر ہر پیغام کے لیے انفرادی طور پر مسائل کو لاگ کر سکتا ہے جبکہ اس بات کو یقینی بناتا ہے کہ کسی ایک غلطی سے پورے عمل کو روکا نہ جائے۔ 🚀
آخر میں، حل ازگر کی اعلی درجے کی لائبریریوں کا استعمال کرتے ہیں جیسے غیر مطابقت پذیر HTTP درخواستوں کے لیے۔ یہ لائبریری اسکرپٹ کو بیرونی APIs، جیسے رسائی مینیجرز کے ساتھ مؤثر طریقے سے بات چیت کرنے کے قابل بناتی ہے۔ ان API کالوں کو ڈیکوریٹر میں لپیٹ کر، HTTP سے متعلق کسی بھی خرابی کو پکڑ لیا جاتا ہے، لاگ ان کیا جاتا ہے اور اصل پیغام کے ساتھ دوبارہ اٹھایا جاتا ہے۔ یہ اس بات کو یقینی بناتا ہے کہ ایک بیرونی سروس کے ناکام ہونے پر بھی، نظام اس بارے میں شفافیت کو برقرار رکھتا ہے کہ کیا غلط ہوا اور کیوں۔ یہ تکنیکیں، مل کر، Python میں مضبوط استثنیٰ سے نمٹنے کے لیے ایک جامع فریم ورک تشکیل دیتی ہیں۔
سیاق و سباق کے ساتھ مستثنیات کو کیپچر کرنے اور لاگ ان کرنے کے لیے ایک ازگر ڈیکوریٹر کو ڈیزائن کرنا
یہ حل بیک اینڈ اسکرپٹنگ کے لیے ازگر کا استعمال کرتا ہے، اصل سیاق و سباق کو برقرار رکھتے ہوئے مستثنیات کو سنبھالنے کے لیے ماڈیولر اور دوبارہ قابل استعمال ڈیزائن کے اصولوں پر توجہ مرکوز کرتا ہے۔
import functools
import logging
# Define a custom decorator for error handling
def error_handler_decorator(func):
@functools.wraps(func)
async def wrapper(*args, kwargs):
original_message = kwargs.get("eventHubMessage", "Unknown message")
try:
return await func(*args, kwargs)
except Exception as e:
logging.error(f"Error: {e}. Original message: {original_message}")
# Re-raise with combined context
raise Exception(f"{e} | Original message: {original_message}")
return wrapper
# Example usage
@error_handler_decorator
async def main(eventHubMessage):
data = json.loads(eventHubMessage)
logging.info(f"Processing data: {data}")
# Simulate potential error
if not data.get("RequestID"):
raise ValueError("Missing RequestID")
# Simulate successful processing
return "Processed successfully"
# Test
try:
import asyncio
asyncio.run(main(eventHubMessage='{"ProductType": "Test"}'))
except Exception as e:
print(f"Caught exception: {e}")
کلاسز کا استعمال کرتے ہوئے ایک سٹرکچرڈ ایرر ہینڈلنگ اپروچ بنانا
یہ حل ایک Python کلاس پر مبنی ڈیکوریٹر کا استعمال کرتا ہے تاکہ ماڈیولریٹی کو بہتر بنایا جا سکے اور مستثنیات کو مزید منظم طریقے سے منظم کرنے کے لیے دوبارہ استعمال کیا جا سکے۔
import logging
# Define a class-based decorator
class ErrorHandler:
def __init__(self, func):
self.func = func
async def __call__(self, *args, kwargs):
original_message = kwargs.get("eventHubMessage", "Unknown message")
try:
return await self.func(*args, kwargs)
except Exception as e:
logging.error(f"Error: {e}. Original message: {original_message}")
raise Exception(f"{e} | Original message: {original_message}")
# Example usage
@ErrorHandler
async def process_event(eventHubMessage):
data = json.loads(eventHubMessage)
logging.info(f"Data: {data}")
if "RequestType" not in data:
raise KeyError("Missing RequestType")
return "Event processed!"
# Test
try:
import asyncio
asyncio.run(process_event(eventHubMessage='{"RequestID": "123"}'))
except Exception as e:
print(f"Caught exception: {e}")
عالمی استثنا ہینڈلنگ کے لیے مڈل ویئر کا فائدہ اٹھانا
یہ حل ازگر میں مڈل ویئر جیسا ڈھانچہ لاگو کرتا ہے، جس سے متعدد فنکشن کالوں میں مستثنیات کو سنٹرلائزڈ ہینڈلنگ کی اجازت ملتی ہے۔
import logging
async def middleware(handler, message):
try:
return await handler(message)
except Exception as e:
logging.error(f"Middleware caught error: {e} | Message: {message}")
raise
# Handlers
async def handler_one(message):
if not message.get("ProductType"):
raise ValueError("Missing ProductType")
return "Handler one processed."
# Test middleware
message = {"RequestID": "123"}
try:
import asyncio
asyncio.run(middleware(handler_one, message))
except Exception as e:
print(f"Middleware exception: {e}")
تقسیم شدہ نظاموں میں استثنیٰ ہینڈلنگ کو بڑھانا
تقسیم شدہ نظاموں کے ساتھ کام کرتے وقت، جیسے Azure Functions Event Hub کے موضوعات کو سنتے ہیں، مضبوط استثنیٰ ہینڈلنگ سسٹم کی وشوسنییتا کی بنیاد بن جاتی ہے۔ ایک اہم پہلو جس کو اکثر نظر انداز کیا جاتا ہے وہ ہے مستثنیات کو اصل سیاق و سباق کے ساتھ ٹریک کرنے اور اس سے منسلک کرنے کی صلاحیت جس میں وہ واقع ہوئے ہیں۔ اس سیاق و سباق میں پے لوڈ پر کارروائی کی جا رہی ہے اور میٹا ڈیٹا جیسے ٹائم سٹیمپ یا شناخت کنندگان شامل ہیں۔ مثال کے طور پر، ایک خراب JSON پے لوڈ کے ساتھ کسی ایونٹ پر کارروائی کرنے کا تصور کریں۔ مناسب استثناء سے نمٹنے کے بغیر، ایسے منظرناموں کو ڈیبگ کرنا ایک ڈراؤنا خواب بن سکتا ہے۔ اصل پیغام کو برقرار رکھ کر اور اسے ایرر لاگ کے ساتھ ملا کر، ہم ایک شفاف اور موثر ڈیبگنگ ورک فلو بناتے ہیں۔ 🛠️
ایک اور اہم بات یہ یقینی بنانا ہے کہ نظام عارضی غلطیوں کے باوجود لچکدار رہے۔ عارضی خرابیاں، جیسے کہ نیٹ ورک ٹائم آؤٹ یا سروس کی عدم دستیابی، کلاؤڈ ماحول میں عام ہیں۔ سنٹرلائزڈ ایرر لاگنگ کے لیے ڈیکوریٹرز کے ساتھ ساتھ ایکسپونیشنل بیک آف کے ساتھ دوبارہ کوششوں کو لاگو کرنا، غلطی کی برداشت کو بہت بہتر بنا سکتا ہے۔ مزید برآں، لائبریریاں پسند کرتی ہیں۔ بیرونی API کالوں کے لیے غیر مسدود کرنے کی کوششوں کو فعال کرتے ہوئے، غیر مطابقت پذیر کارروائیوں کی حمایت کریں۔ یہ یقینی بناتا ہے کہ عارضی رکاوٹیں ایونٹ پروسیسنگ پائپ لائنوں میں مکمل ناکامی کا باعث نہیں بنتی ہیں۔
آخر میں، ساختی لاگنگ فارمیٹس کو شامل کرنا، جیسے JSON لاگز، نمایاں طور پر خرابیوں کی مرئیت اور ٹریس ایبلٹی کو بڑھا سکتا ہے۔ لاگز میں استثناء کی قسم، اصل پیغام اور ٹائم اسٹیمپ جیسے فیلڈز شامل ہو سکتے ہیں۔ ریئل ٹائم مانیٹرنگ اور اینالیٹکس کے لیے یہ سٹرکچرڈ لاگز سنٹرلائزڈ لاگنگ سسٹمز، جیسے Azure Monitor یا Elasticsearch کو بھیجے جا سکتے ہیں۔ اس طرح، ترقیاتی ٹیمیں پیٹرن کی تیزی سے شناخت کر سکتی ہیں، جیسے کہ مخصوص پے لوڈز کے ساتھ بار بار آنے والی غلطیاں، اور ان کو فعال طور پر حل کر سکتی ہیں۔ 🚀
- استثنیٰ سے نمٹنے کے لیے ڈیکوریٹر استعمال کرنے کا کیا مقصد ہے؟
- ڈیکوریٹر، جیسے ، متعدد فنکشنز میں ایرر لاگنگ اور ہینڈلنگ کو مرکزی بناتا ہے۔ یہ مستثنیات کی مسلسل کارروائی کو یقینی بناتا ہے اور اصل پیغام کی طرح اہم سیاق و سباق کو برقرار رکھتا ہے۔
- کیسے کرتا ہے API تعاملات کو بہتر بنائیں؟
- یہ غیر مطابقت پذیر HTTP درخواستوں کو قابل بناتا ہے، جس سے پروگرام کو متعدد API کالز کو بیک وقت ہینڈل کرنے کی اجازت ملتی ہے، جو Azure Functions جیسے ہائی تھرو پٹ سسٹمز کے لیے اہم ہے۔
- ساختی لاگنگ کا کیا فائدہ ہے؟
- سٹرکچرڈ لاگنگ فارمیٹس، جیسے JSON لاگز، Azure Monitor یا Splunk جیسے ٹولز کا استعمال کرتے ہوئے اصل وقت میں غلطیوں کا تجزیہ اور نگرانی کرنا آسان بناتے ہیں۔
- عارضی غلطیوں کا مؤثر طریقے سے انتظام کیسے کیا جا سکتا ہے؟
- ناکامیوں کو کیپچر کرنے کے لیے ڈیکوریٹر کے ساتھ ایکسپونیشنل بیک آف کے ساتھ دوبارہ کوشش کی منطق کو نافذ کرنا، اس بات کو یقینی بناتا ہے کہ عارضی مسائل مستقل غلطیوں کا باعث نہیں بنتے ہیں۔
- استثنیٰ ہینڈلنگ میں اصل سیاق و سباق کو برقرار رکھنا کیوں ضروری ہے؟
- اصل پیغام کو محفوظ کرنا، جیسے پے لوڈ پر عملدرآمد کیا جا رہا ہے، ڈیبگنگ اور ٹریسنگ کے مسائل کے لیے انمول معلومات فراہم کرتا ہے، خاص طور پر تقسیم شدہ نظاموں میں۔
تقسیم شدہ نظاموں میں استثنیٰ ہینڈلنگ، جیسے Azure Functions، بلا تعطل آپریشنز کو یقینی بنانے کے لیے اہم ہے۔ ڈیکوریٹر میں غلطیوں کو سمیٹ کر اور اصل سیاق و سباق کو برقرار رکھ کر، ڈویلپر ڈیبگنگ کو آسان بناتے ہیں اور سسٹم کی شفافیت کو ہموار کرتے ہیں۔ یہ نقطہ نظر متحرک، حقیقی دنیا کے ماحول میں خاص طور پر مددگار ہے جہاں مسائل ناگزیر ہیں۔
غیر مطابقت پذیر پروگرامنگ اور سٹرکچرڈ لاگنگ جیسی جدید تکنیکوں کا امتزاج کرتے ہوئے، پائتھون لچکدار نظاموں کو تیار کرنے کا ایک طاقتور ٹول بن جاتا ہے۔ یہ حل ٹربل شوٹنگ کے دوران وقت بچاتے ہیں اور عارضی غلطیوں کو مؤثر طریقے سے حل کرکے کارکردگی کو بہتر بناتے ہیں۔ ان طریقوں کو اپنانے سے ڈویلپرز کو مضبوط اور قابل توسیع ایپلی کیشنز بنانے کا اختیار ملتا ہے، جس سے روزمرہ کے چیلنجز کو قابل انتظام بنایا جا سکتا ہے۔ 🛠️
- Python میں مستثنیات کو سنبھالنے سے متعلق مواد Python کی سرکاری دستاویزات سے متاثر تھا۔ مزید معلومات کے لیے ملاحظہ کریں۔ ازگر مستثنیات دستاویزی .
- غیر مطابقت پذیر HTTP کلائنٹ کے بارے میں تفصیلات پر مبنی تھیں۔ httpx لائبریری کی سرکاری دستاویزات ، جو HTTP درخواستوں کو بلاک نہ کرنے کے لیے اس کی صلاحیتوں کی وضاحت کرتا ہے۔
- ساختی لاگنگ کے اصولوں کی بصیرت سے رہنمائی کی گئی۔ Azure مانیٹر ، تقسیم شدہ نظاموں میں مرکزی لاگنگ کے لیے ایک ٹول۔
- پر ایک ٹیوٹوریل کے ذریعے ازگر کے فنکشنز کو ریپ کرنے کے لیے ڈیکوریٹرز کے بارے میں گائیڈنس دی گئی۔ اصلی ازگر .
- عارضی غلطیوں کو سمجھنا اور دوبارہ کوشش کرنے کے طریقہ کار کے مضامین پر مبنی تھا۔ AWS آرکیٹیکچر بلاگز ، جو تقسیم شدہ ماحول میں غلطی کی لچک پر تبادلہ خیال کرتے ہیں۔