پرنٹ جابز، ایک بار ڈاؤن لوڈ، یا سپورٹ اٹیچمنٹ کو عام طور پر صرف اس وقت تک موجود رہنے کی ضرورت ہوتی ہے جب تک کہ کوئی کام مکمل نہ کرے۔ تاہم، زیادہ تر بیک اینڈ اب بھی نام کی اشیاء کو اسٹور کرتے ہیں جیسے گوگل ڈرائیو، کوئی میعاد ختم نہیں ہوتی، ڈیٹا بیس کی قطاریں جو بعد میں بازیافت کی جاسکتی ہیں، وغیرہ۔
یہ ٹیوٹوریل آپ کو پرنٹ کاسٹ بنانے میں استعمال کرنے کے لیے ایک چھوٹا نمونہ سکھائے گا۔ خیالات صرف پرنٹنگ تک محدود نہیں ہیں۔ آپ چھوٹے کاموں کے لیے اسی طرز کا استعمال کر سکتے ہیں۔ یعنی، یہ بائٹس کو تسلیم کرتا ہے، انہیں مختصر طور پر رکھتا ہے، انہیں مجاز کال کرنے والے کے پاس دیتا ہے، اور پھر انہیں ضائع کر دیتا ہے۔
آپ کو مکمل ایپ نہیں ملے گی۔ آپ کو قطار کو دستاویز کی لائبریری میں تبدیل ہونے سے روکنے کا فیصلہ کرنا ہوگا۔
انڈیکس
کیا تعمیر کرنا ہے
معاہدے کا سائز چھوٹا ہے۔
-
ایک کلائنٹ ایک کام کے لیے فائل بھیجتا ہے۔
-
API آبجیکٹ اسٹوریج پر سائفر ٹیکسٹ لکھتا ہے اور ریڈیس کو قلیل مدتی آپریشن ریکارڈ کرتا ہے۔
-
منظور شدہ کال کرنے والے فائل کو ایک بار بازیافت کرسکتے ہیں۔
-
جب کوئی کام ختم ہوتا ہے یا ٹائمر چلتا ہے، تو یہ آبجیکٹ اور ٹاسک ہسٹری کو حذف کر دیتا ہے۔
کامیابی ایک خالی بالٹی ہے، تلاش کے قابل ذخیرہ نہیں۔
Client
|
| HTTPS
v
Cloud Run (one Node service)
|-- Cloud Storage cipher-text object
|-- Cloud KMS wraps the per-file key
|-- Redis job JSON with a time to live (TTL)
|
Authorized caller <-- stream, then delete
آپ کو کیا ضرورت ہے
آپ کو پہلے ہی معلوم ہونا چاہئے:
-
تھوڑا سا Node.js اور ایکسپریس
-
HTTPS اور JSON کیا ہیں؟
-
اس کا آبجیکٹ اسٹوریج (ایمیزون ایس 3، گوگل کلاؤڈ اسٹوریج) فائلوں کو رکھتا ہے اور ریڈیس کے پاس تیز رفتار کلیدی قدر کا ڈیٹا ہے۔
کوبرنیٹس یا دوسرے "پرنٹ سرور" کی ضرورت نہیں ہے۔ اگر آپ گوگل کلاؤڈ استعمال کرتے ہیں، کلاؤڈ رن، کلاؤڈ اسٹوریج، کلاؤڈ کی مینجمنٹ سروس (کلاؤڈ کے ایم ایس)، اور ریڈیس میزبان کافی ہیں۔ اگر آپ پروڈکٹ کا نام تبدیل کرتے ہیں تو یہی تقسیم دوسرے بادلوں میں بھی کام کرے گی۔
ایک خدمت، بیڑا نہیں۔
20 منٹ تک چلنے والی فائلوں کے لیے گاہک کے دفتر میں ہمیشہ آن ورچوئل مشینوں، کلسٹرز یا بکسوں کی ضرورت نہیں ہوتی ہے۔
اپنی ویب سائٹ اور API کو ایک کلاؤڈ رن سروس میں رکھیں۔ کلاؤڈ رن درخواست کے عمل کے دوران CPU کو چارج کرتا ہے۔ آپ قطار کے نظام کو وہاں بیٹھنے کے لیے ادائیگی نہیں کر رہے ہیں اگر کوئی اسے اپ لوڈ نہیں کرتا ہے۔
اس انتخاب کے اپنے نقصانات ہیں۔ کلاؤڈ رن ایک سے زیادہ مثالوں پر چل سکتا ہے۔ اگر ہر ایک مثال آپریشنز کو اپنی میموری میں رکھتی ہے، مثال A مثال B کے ذریعہ قبول کردہ کارروائیوں کو نہیں دیکھ سکتا۔ یہ صارف کو تازہ دم کر دے گا اور کام کو "غائب" کر دے گا۔ یا بدتر، یہ غلط کام پرنٹ کرتا ہے۔
تو:
اگر Redis نیچے ہے، تیاری ناکام ہو جانا چاہئے. ایک فعال چیک جو صرف یہ ثابت کرتا ہے کہ "نوڈ اپ ہے" قطار کے بارے میں حقیقت کو جانے بغیر ٹریفک کو سروس پر بھیجتا ہے۔ ناکامی بند۔ درخواست کردہ نقل کی مقامی ڈسک پر واپس نہ جائیں۔
app.get("/up", (_req, res) => {
res.status(200).send("ok");
});
app.get("/health", async (_req, res) => {
const redisUp = await pingRedis();
if (!redisUp) return res.status(503).send("queue down");
res.status(200).send("ok");
});
استعمال کریں /health لوڈ بیلنسرز یا کلاؤڈ رن پروبس کے لیے۔ استعمال کریں /up بس یہ یقینی بنانے کے لیے کہ کنٹینر جواب دے سکتا ہے۔
اپنی اشیاء کو بورنگ نام دیں۔
اگر آپ کی آبجیکٹ کیز ہیں: aadhaar-ramesh.pdfآپ پہلے ہی فائلنگ کیبنٹ بنا چکے ہیں۔ اگلی خصوصیت کی درخواست تلاش ہے۔
بے ترتیب IDs کے ساتھ بائٹس کو اسٹور کریں۔
const { randomUUID } = require("crypto");
function objectName() {
return `jobs/${randomUUID()}.bin`;
}
اگر ضروری ہو تو، اپنی کام کی تاریخ میں کسی شخص کی فائل کا نام مختصر زندگی کے لیے رکھیں۔ اسے آبجیکٹ کے نام میں مت ڈالیں۔ اگر کامیابی کی شرط کو حذف کر دیا گیا ہے، تو بالٹی کو دوسرے براعظم میں "محفوظ ہونے کے لیے" کاپی نہ کریں۔ آپ اس ڈیٹا کو نقل کرنے کے لیے ادائیگی کریں گے جسے آپ پھینکنا چاہتے ہیں۔
ان فائلوں کی تعداد کو محدود کریں جو آپ ایک وزٹ میں شامل کر سکتے ہیں۔ کوئی صارف نیا دورہ شروع کرنے سے پہلے اس کی سخت حدود ہیں جیسے کہ پانچ فائلیں، اسٹوریج کی حد، کلیدی آپریشنز، اور قطار کا سائز۔ لامحدود اپ لوڈز یہ ہیں کہ کس طرح آپ کا پرنٹ کاؤنٹر ایک ردی دراز بن جاتا ہے۔
اسٹوریج کے لیے انکرپٹ کریں اور ڈکرپشن کے بارے میں ایماندار بنیں۔
رازداری پوسٹ دو مختلف پیشوں کا مرکب ہے۔
پرنٹر، پیش نظارہ، یا "ایک بار ڈاؤن لوڈ کریں" کے بٹن کو عام طور پر دوسرے کی ضرورت ہوتی ہے، پہلے کی نہیں۔ ایک مجاز شخص کو بائٹس کی تصدیق کرنی ہوگی۔ اپنے مضامین اور مصنوعات میں ایسا کہیں۔ اگر API فائل کو کھولتا ہے، تو "سرور فائل کو نہیں دیکھ سکتا" نہ لکھیں۔
ایک عملی نمونہ یہ ہوگا:
-
براؤزر اپ لوڈ کرنے سے پہلے AES-GCM کے ساتھ انکرپٹ کرتے ہیں، لہذا ایک باقاعدہ نیٹ ورک کیپچر پڑھنے کے قابل PDF نہیں ہوگا۔
-
سرور اس پرت کو کھولتا ہے، میجک بائٹس (پی ڈی ایف، جے پی ای جی، پی این جی) کی شناخت کرتا ہے، اور پھر اسے اسٹوریج کے لیے ایک نئی ڈیٹا کلید کے ساتھ دوبارہ انکرپٹ کرتا ہے۔
-
کلاؤڈ KMS (یا آپ کے کلاؤڈ کی بنیادی سروس) سے اس ڈیٹا کلید کو لپیٹنے کے لیے کہیں۔ لپیٹے ہوئے کلید کو آپریشن کے آگے اسٹور کریں، آبجیکٹ کے نام کے نہیں۔
-
مجاز ریڈز پر ڈیٹا کیز کو غیر مقفل کریں، ڈکرپٹ کریں اور اسٹریم کریں۔
جادو کے کاٹنے کی جانچ کر رہا ہے کہ آپ راستے میں کیوں پیک کھولتے ہیں۔ اگر آپ اسے چھوڑ دیتے ہیں تو لوگ HTML یا ردی اپ لوڈ کریں گے اور آپ کو بدترین ممکنہ لمحے پر پتہ چل جائے گا۔
ذیل میں ایک خاکہ ہے، مکمل کرپٹو لائبریری نہیں۔
const crypto = require("crypto");
function encryptForStorage(plainBuffer) {
const dataKey = crypto.randomBytes(32);
const iv = crypto.randomBytes(12);
const cipher = crypto.createCipheriv("aes-256-gcm", dataKey, iv);
const ciphertext = Buffer.concat([cipher.update(plainBuffer), cipher.final()]);
const tag = cipher.getAuthTag();
return { ciphertext, iv, tag, dataKey };
}
جانے دو dataKey KMS پر جائیں اور صرف لپیٹے ہوئے نتائج رکھیں۔ AES-GCM میں تصدیق کا ٹیگ اہم ہے۔ اگر کوئی بالٹی میں بٹس پلٹتا ہے، تو ڈیکرپشن خراب پی ڈی ایف کو واپس کرنے کے بجائے ناکام ہو جائے گی جو آدھی اصلی نظر آتی ہے۔
KMS کالیں غیر میعاد ختم ہونے والی بالٹیوں کے ساتھ سستی ہیں۔ پیسے بچانے کے لیے انکرپشن کو چھوڑنا یہ ہے کہ آپ کی لیک شدہ بالٹی آپ کا لیک شدہ پڑوسی کیسے بن جاتی ہے۔
کاؤنٹر پر موجود شخص اب بھی صفحہ دیکھتا ہے۔ کاغذ تصویریں لے سکتا ہے۔ فن تعمیر مستقل کاپیوں کو ختم کرتا ہے۔ اس کا مطلب یہ نہیں ہے کہ آپ کا پرنٹر اندھا ہو جائے گا۔
قطار کی میعاد ختم ہو رہی ہے۔
Redis لائیو آپریشنز رکھتا ہے، فائلیں نہیں۔
const JOB_TTL_SECONDS = 60 * 60;
async function saveJob(redis, job) {
await redis.set(
`job:${job.id}`,
JSON.stringify({
id: job.id,
objectName: job.objectName,
shopId: job.shopId,
status: "queued",
createdAt: Date.now()
}),
"EX",
JOB_TTL_SECONDS
);
}
1 گھنٹہ ایک پروڈکٹ کا انتخاب ہے، قانون نہیں۔ ایک TTL منتخب کریں جو آپ کے اصل دوروں سے مماثل ہو۔ کاپی کو کسی قطار کی ضرورت نہیں ہے جس سے اگلے سال استفسار کیا جا سکے۔
اس کے علاوہ محفوظ کریں:
-
فائل میٹا ڈیٹا کا مختصر ذخیرہ
-
"اس وزٹ سے فائلیں" کا کاؤنٹر
-
ایک ہی وقت میں کلاؤڈ رن کی دو مثالوں کو کلین اپ چلانے سے روکنے کے لیے لاک کلید
Redis میں PDFs ذخیرہ نہ کریں۔ ریڈیس ان خطوط پر ہے۔ کلاؤڈ اسٹوریج بائٹس ہے۔ TTL کے 0 تک پہنچنے کے بعد، آپ کی ملازمت کی تاریخ غائب ہو جائے گی، چاہے آپ اسے خود حذف کرنا بھول گئے ہوں۔ یہی بات ہے۔
جان بوجھ کر حذف کرنے کے بعد آپ نے جو کھویا اسے منظم کریں۔
ایک بار جب مجاز کال کرنے والا ختم ہو جائے:
async function completeJob({ storage, redis, bucket, job }) {
await storage.bucket(bucket).file(job.objectName).delete({ ignoreNotFound: true });
await redis.del(`job:${job.id}`);
}
پہلے اعتراض کو حذف کریں اور پھر پوائنٹر کو حذف کریں۔ پوائنٹر کو حذف کرنے اور کسی شے کو حذف کرنے میں ناکامی کے نتیجے میں یتیم فائل کا واحد نقشہ ضائع ہو سکتا ہے۔ اگر آبجیکٹ ڈیلیٹ کرنے میں ناکام ہو جاتا ہے تو آپریشن جاری رکھیں اور دوبارہ کوشش کریں۔
لوگ ٹیبز بند کر دیتے ہیں۔ درخواست مر جاتی ہے۔ جھاڑو دینے والے کو ہر چند منٹ بعد دوڑنا چاہیے۔
-
اگر ٹاسک پہلے ہی مکمل ہو چکا ہے تو، باقی آئٹمز کو حذف کر دیں۔
-
اگر اعتراض اس مدت سے زیادہ پرانا ہے (اگر آپریشن میں خلل پڑتا ہے تو تقریباً 30 منٹ کافی ہیں)، اسے حذف کر دیں۔
-
ہم دونوں مثالوں کو دوہرا حذف ہونے سے روکنے کے لیے Redis لاکنگ کا استعمال کرتے ہیں۔
async function withLock(redis, fn) {
const ok = await redis.set("lock:sweep", "1", "NX", "EX", 55);
if (ok !== "OK") return;
try {
await fn();
} finally {
await redis.del("lock:sweep");
}
}
فائر اسٹور، پوسٹگریس، یا دیگر ڈیٹا بیس اسٹورز، مالکان اور استعمال کاؤنٹرز کو برقرار رکھ سکتے ہیں۔ آپ کو پی ڈی ایف کی دوسری کاپی نہیں رکھنی چاہیے۔ فائل بائٹس اور گاہک کی فہرست کو ایک ہی ٹیبل میں رکھنے سے آپ کے مواد کے نظام کو وسعت ملتی ہے۔ استعمال "یہ دورہ ہوا" کہہ سکتا ہے۔ یہ تھمب نیل گیلری نہیں ہونی چاہیے۔
کیا دعوی نہیں کرنا ہے
براہ کرم README میں درج ذیل حدود کو نوٹ کریں تاکہ آپ کو بعد میں ان پر دوبارہ جانے کی ضرورت نہ پڑے۔
-
سرور جمع کرنے (دوبارہ خفیہ کاری اور توثیق) اور تصدیق شدہ ڈاؤن لوڈ پر سادہ متن دیکھ سکتا ہے۔ یہ علم کی مکمل عدم موجودگی نہیں ہے۔
-
حذف شدہ چیز بالٹی سے غائب ہو گئی ہے۔ یہ وصول کنندہ کی اسکرین، پرنٹر یا کیمرے سے غائب نہیں ہوگا۔
-
اگر Redis نیچے چلا جاتا ہے، تو نئی ملازمتیں کام کرنا بند کر دیں گی۔ جعلی مقامی قطار فراہم کرنا 503 سے بھی بدتر ہے۔
-
بے ترتیب آبجیکٹ کے نام رسائی کنٹرول نہیں ہیں۔ سٹریمنگ بائٹس سے پہلے ایک تصدیقی جانچ کی ضرورت ہے۔
آگے کہاں جانا ہے۔
ایک کلاؤڈ رن سروس میں سب سے چھوٹا لوپ بنائیں۔
-
POST /jobsاستعمال کرتے ہوئے ciphertext اور Redis ریکارڈ لکھیں:EX. -
GET /jobs/:idتوثیق کی توثیق کرتا ہے، سادہ متن کو چلاتا ہے، اور پھر اسے مسترد کر دیتا ہے۔ -
صفائی کھڑکی سے پرانی ہر چیز کو ہٹا دیتی ہے۔
-
/healthاگر Redis نیچے ہے، تو یہ 503 لوٹاتا ہے۔
اگر وہ لوپ بورنگ ہے، تو آپ نے یہ ٹھیک کیا۔ بوریت وہی ہے جو فائیو منٹ فائلوں کو دستاویز کمپنی بننے سے روکتی ہے۔
میں یہ پیٹرن Docsy سے استعمال کرتا ہوں، ایک پرنٹ ریلے جو میں نے ہندوستان میں بنایا تھا۔ ممبئی میں کلاؤڈ رن خدمات میں سے ایک (asia-south1)، Cloud Storage، Cloud KMS، اور Redis۔