سؤال

نحن نستخدم SharpZipLib.يجب أن نكون قادرين على فك ضغط الملفات الموجودة على الخادم ووضعها في مجلد منفصل.سيكون طلب فك ضغط الملف من المستخدم على صفحة الويب.أتصور أنه إذا كانت الملفات كبيرة بدرجة كافية، فسوف يستغرق فك ضغطها وقتًا طويلاً. لا نريد أن يظل المستخدمون عالقين في الصفحة أثناء انتظار اكتمال عملية فك الضغط لمواصلة تصفح الموقع.

ما هي الطريقة الجيدة للتعامل مع هذا السيناريو:قم بتدوير موضوع مختلف للاهتمام بفك ضغط الملف، أو إنشاء خدمة Windows منفصلة لفك ضغط الملفات، أو .... ماذا؟

ما هي إيجابيات وسلبيات القيام بذلك عبر خيط منفصل أو خدمة نافذة؟

هل كانت مفيدة؟

المحلول

مزايا عملية منفصلة
يمكن فصل العمل المنجز في عملية منفصلة بمرور الوقت، وكذلك فعليًا، ومن وجهة نظر أمنية، عن تدفق الصفحة.فصل في الوقت المناسب:إذا اخترت ذلك، يمكنك تخزين طلبات فك ضغط الأشياء مؤقتًا حتى "في وقت لاحق" عندما يكون التحميل أقل وعندما يكون لديك دورات وحدة المعالجة المركزية الاحتياطية للقيام بذلك.

مفصولة جسديا أيضا؛بالنسبة لنظام واسع النطاق، يمكن أن يكون لديك عمليات عاملة متعددة، حتى يتم نشرها على أجهزة مستقلة متعددة، والقيام بهذا العمل بشكل غير متزامن، ويمكن توسيع طبقة المعالجة هذه بشكل مستقل عن معالجة صفحة الويب.توجد اختناقات في أي نظام، وتتمثل ميزة عمليات النشر الموزعة في أنه يمكنك قياس أحمال العمل المنفصلة بشكل مستقل، للتخلص من الاختناقات بشكل أكثر كفاءة.

ومع ذلك، أود أن أقول إن هذه الميزة الأخيرة مفيدة فقط في الأنظمة واسعة النطاق جدًا.في معظم الحالات، لن يكون لديك نوع حجم المعاملات الذي قد يستفيد من طبقة القياس الفعلية المستقلة.وهذا صحيح ليس فقط لك عبء العمل، ولكن 98٪ من جميع أعباء العمل.ينطبق مبدأ YAGNI على قابلية التوسع أيضًا.

كما يسمح الفصل المادي أيضًا بتطوير أعباء العمل المتباينة (تدفق الصفحة وتفريغ الملفات المضغوطة) بشكل مستقل.بمعنى آخر، لنفترض أن عنصر العمل لم يكن مجرد "فك ضغط ملف" ولكنه كان شيئًا أكثر تعقيدًا، مع وجود خطوات ونقاط قرار متعددة على طول الطريق.يسمح تصميم معالج العمل في عملية منفصلة ببناء تدفق الصفحة واختباره بشكل مستقل عن معالجة عنصر العمل.يمكن أن تكون هذه ميزة جيدة إذا كان عليهم أن يتطوروا بشكل مستقل.

يُعد هذا الفصل المادي أمرًا رائعًا أيضًا إذا كانت عناصر العمل ستصل عبر قنوات مختلفة.لنفترض أن صفحة الويب ليست هي الطريقة الوحيدة لوصول عنصر العمل.لنفترض أن لديك ftp drop، أو خدمة ويب، أو صندوق بريد إلكتروني مراقب آليًا يمكنه أيضًا تلقي عناصر العمل.في هذه الحالات، سيكون من المنطقي أن يتم فصل معالجة عنصر العمل فعليًا عن معالجة صفحة الويب.

وأخيرًا، يتم فصل هذه الأشياء في الأمان أثناء وقت التشغيل.في بعض عمليات نشر خادم تطبيقات الويب، تمنع قواعد الأمان خادم الويب من الكتابة على القرص - لا تحتوي خوادم الويب على مساحة تخزين على القرص قابلة للكتابة.يمكن نشر عملية عاملة غير متزامنة منفصلة في جزء منفصل من الشبكة، مع مساحة تخزين كبيرة وربما تكون مقيدة بمجموعة منفصلة من متطلبات الأمان.قد ينطبق هذا عليك وقد لا ينطبق عليك.

مزايا المعالجة الخيوط
ميزة القيام بالعمل في موضوع منفصل هو أنه أسهل بكثير.يؤدي الفصل إلى التعقيد والتكلفة.من خلال إدارة العمل في سلسلة رسائل منفصلة، ​​ليس لديك أي من النفقات التشغيلية لإدارة عملية منفصلة، ​​ومن المحتمل أن تكون آلة منفصلة.لا يوجد أي تكوين إضافي، ولا توجد خطوة بناء/نشر جديدة.لا توجد نسخة احتياطية إضافية.لا توجد هوية أمنية إضافية للحفاظ عليها.لا يوجد تبادل اتصالات يدعو للقلق (بخلاف إرسال الخيط).

يمكنك اختيار أن تصبح أكثر تعقيدًا فيما يتعلق بمعالجة عناصر العمل، واختياريًا القيام بالعمل بشكل متزامن عندما يبدو الملف المضغوط صغيرًا بدرجة كافية.لنفترض أنك حددت حدًا لوقت الاستجابة يبلغ 4 ثوانٍ - وفوق ذلك، تحتاج إلى حمل عمل غير متزامن، وأقل من 4 ثوانٍ، يمكنك القيام بذلك "مضمنًا".بالطبع، لا تعرف أبدًا على وجه اليقين المدة التي سيستغرقها ملف مضغوط، ولكن يمكنك إنشاء دليل إرشادي جيد استنادًا إلى حجم الملف.هذا التحسين متاح لك سواء كنت تستخدم عملية خارجية للعمل غير المتزامن، أو سلسلة منفصلة، ​​ولكن بصراحة، من الأسهل الاستفادة من التحسين عند استخدام سلسلة منفصلة.عمل إضافي أقل للقيام به.لذلك هذه ميزة للنهج المترابط.

غير التفاضل
إذا اخترت أن يكون لديك آلية استقصاء AJAX للإعلام بحالة عنصر العمل، فسيعمل ذلك إما مع العملية المنفصلة أو مع مؤشر الترابط المنفصل.لا أعرف كيف يمكنك القيام بتتبع عناصر العمل، ولكنني أفترض أنه عند اكتمال عنصر عمل معين (ملف مضغوط؟)، فسوف تقوم بتحديث سجل في مكان ما - ملف في نظام ملفات، أو جدول في قاعدة بيانات .يحدث هذا التحديث سواء تم إجراؤه بواسطة مؤشر ترابط في نفس العملية، أو من خلال عملية منفصلة (خدمة Windows).لذا فإن عميل AJAX الذي يقوم بالاستقصاء سيتحقق فقط من جدول قاعدة البيانات أو نظام الملفات في أي حال، وسيتلقى إشعارًا بحالة عنصر العمل بنفس الطريقة، بغض النظر عن قرارك بشأن الهندسة المعمارية.

كيف تقرر
النظرية مثيرة للاهتمام ولكنها غير مجدية في النهاية، دون قيود تشغيلية فعلية.

يعد عبء العمل أحد العناصر الرئيسية في العالم الحقيقي.لم تذكر حجم هذه الملفات المضغوطة، لكنني أعتقد أنها "بالحجم العادي".شيء عن 4GB أو أقل.عادةً ما يستغرق فك ملف مضغوط مثل هذا من 20 إلى 60 ثانية على الكمبيوتر المحمول الخاص بي، ولكن بالطبع على خادم مزود بنظام تخزين حقيقي ووحدة معالجة مركزية أسرع، سيكون الوقت أقل.كما أنك لم تحدد تزامن المعاملات - كم عدد هذه الأشياء التي ستحدث في أي وقت.أفترض أن التزامن ليس مرتفعًا بشكل خاص.

إذا كان الأمر كذلك، فسألتزم بنهج الخيط غير المتزامن الأبسط.أنت تفعل هذا في ASP.NET، أفترض أنه على نظام تشغيل الخادم.يتمتع CLR بإدارة جيدة لمؤشرات الترابط، ويتمتع ASP.NET بقدرة جيدة على توسيع نطاق العملية.لذلك، حتى في أحمال العمل العالية، سوف تحصل على استخدام جيد لوحدة المعالجة المركزية (CPU) وتوسيع نطاقها، دون بذل الكثير من جهد التكوين.

إذا كانت عناصر العمل تعمل لفترة أطول - دعنا نقول بترتيب الساعات أو حتى الأيام، وكان الوقت غير متوقع (مثل إغلاق أمر المخزون) - حسنًا، في هذه الحالة سأميل نحو عملية غير متزامنة.إذا كان التزامن بالآلاف في الثانية، أو مرة أخرى لا يمكن التنبؤ به على الإطلاق، فسيوصي ذلك أيضًا بعملية منفصلة.إذا كانت أوضاع الفشل معقدة بما فيه الكفاية، فقد أرغب في أن تكون عناصر العمل في عملية منفصلة فقط لإدارتها.إذا كان من المحتمل أن تتغير معالجة عناصر العمل بانتظام (إضافة خطوة إضافية، وفقًا لظروف العمل المتطورة)، فقد أرغب في ذلك في عملية منفصلة.

ولكن لا يبدو أن أيًا من هذه الأشياء صحيح في حالتك - تفريغ الملفات المضغوطة.

نصائح أخرى

عيوب موضوع منفصل هي:

  1. عندما تنتهي الصفحة، لا توجد طريقة سهلة للحصول على إشعار بشأن ما يفعله الموضوع الآخر.
  2. يمكن إعادة تشغيل التطبيق في أي وقت.
  3. سيكون من السهل بدء العملية مرتين عن طريق الخطأ إذا أرسل المستخدم الصفحة مرتين في تتابع سريع.
  4. من الصعب تصحيح التعليمات البرمجية متعددة الخيوط.

مزايا موضوع منفصل هي:

  1. رمز أقل
  2. من السهل إطلاق النار ونسيان ما إذا كان المستخدم لا يحتاج إلى إعلامه عند اكتمال فك الضغط.
  3. لا يوجد عمل إضافي للتثبيت.

إن مزايا وعيوب خدمة Windows هي عكس ما سبق تقريبًا.

وأنا شخصيا كنت السير في طريق خدمة ويندوز مع الرسائل بينهما من أجل التقدم، مثل إرجاع handle إلى بفك التي يمكن استخدامها لمراقبة الوضع.

ولكن هل يمكن أيضا أعتقد ربما تدور قبالة موضوع للقيام بذلك، وأنه سيتم تنفيذ بسعادة ويعود الصفحة.

وأود أن استخدام عملية متزامنة التي يمكنك استطلاع بسهولة من صفحة تمكين AJAX. عند الانتهاء، الجزء AJAX من الصفحة يمكن تقديم التفاصيل التي عادة قد قدمت في حين انتظر المستخدم لعملية لإكمال بشكل متزامن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top