ما الذي تستخدمه لتنفيذ خادم ملفات سريع وخفيف الوزن؟

StackOverflow https://stackoverflow.com/questions/760114

  •  09-09-2019
  •  | 
  •  

سؤال

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

أنا غير مشدود لأي تكنولوجيا تابعة لذلك أنا منفتح على أي لغة برمجة، أطقم الأدوات، المكتبات طالما يمكن تشغيلها على Windows.

تأخذي الأولي هو الذهاب مع تطبيق C / C ++ باستخدام مقابس Windows أو استخدام الخدمات التي توفرها مكتبات مثل دفعة (ASIO أو UIR). لقد فكرت أيضا في Erlang، لكنني سأضطر إلى أن أتعلم وهكذا يجب أن تبرر فوائد الأداء وقت التنمية المتزايد بسبب الاضطرار إلى تعلم اللغة.

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

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

المحلول

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

  1. الأمر: 1 بايت لتحديد ما سيتم القيام به: (0x01 لطلب التحميل، 0x02 لطلب التنزيل، 0x11 لاستجابة تحميل، 0x12 لاستجابة التنزيل، إلخ).
  2. اسم الملف: يمكن أن يكون ثابت الحجم أو البادئة مع البايت للطول (على افتراض الاسم أقل من 255 بايت)
  3. المجموع الاختباري، MD5 على سبيل المثال (إذا قمت بتحميل طلب أو استجابة التنزيل)
  4. حجم الملف (إذا طلب تحميل أو تحميل التنزيل)
  5. الحمولة (إذا كان تحميل طلب أو تنزيل التنزيل)

يمكن تنفيذ ذلك على رأس مأخذ TCP بسيط. يمكنك أيضا استخدام UDP، وتجنب تكلفة إنشاء اتصال ولكن في هذه الحالة عليك التعامل مع التحكم بإعادة الإرسال.

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

هناك اقتراح آخر لتحسين الأداء هو استخدام مستودع الملفات وليس نظام الملفات، ولكن شيء مثل SQLite. يمكنك إنشاء جدول واحد يحتوي على عمود Char واحد لاسم الملف وعمود Blob واحد لمحتويات الملفات. نظرا لأن SQLite خفيف الوزن ويفعل التخزين المؤقت فعالا، فستتجزأ معظم الوقت في تجنب الوصول إلى القرص.

أنا أفترض أنك لا تحتاج إلى مصادقة العميل.

أخيرا: على الرغم من أن C ++ هو تفضيلك لإعطائك سرعة الرموز الأصلية الخام، نادرا ما يكون هذا هو الاختناق الرئيسي في هذا النوع من التطبيقات. على الأرجح ستكون الوصول إلى القرص وعرض النطاق الترددي الشبكي. أشير إلى أن هذا لأنه في Java، ربما تكون قادرا على جعل Servlet للقيام بالضبط نفس الشيء (باستخدام HTTP احصل للتنزيل ونشر التحميل) بأقل من 100 سطر من التعليمات البرمجية. استخدم Derby بدلا من SQLite في هذه الحالة، ضع هذا Servlet في أي حاوية (Tomcat، Glassfish، إلخ) ويتم ذلك.

نصائح أخرى

لماذا لا تذهب فقط مع FTP.ب يجب أن تكون قادرا على العثور على تطبيق خادم مناسب بأي لغة ومكتبات وصول العميل أيضا.

يبدو وكأنه الكثير من تعادة العجلة. منحت، بروتوكول نقل الملفات ليست مثالية، ولها عدد قليل من البقع الفردية، ولكن ... إنها هناك، إنها معيار، معروفة، وتنفيذها على نطاق واسع بالفعل.

إذا كانت جميع الأجهزة تعمل على Windows على نفس LAN، فلماذا تحتاج إلى خادم على الإطلاق؟ لماذا لا تستخدم ببساطة مشاركة ملفات Windows؟

أود أن أقترح عدم استخدام FTP أو SFTP أو أي تقنية اتصال اتصال أخرى. بدلا من ذلك، انتقل للحصول على بروتوكول أو تقنية بدون اتصال.

السبب هو أنه، إذا كنت بحاجة إلى تحميل الكثير من الملفات الصغيرة أو تنزيلها، ويجب أن تكون الاستجابة أسرع وقت ممكن، فأنت ترغب في تجنب تكلفة إعداد وتدمير الاتصالات.

أود أن أقترح أن تنظر إليك إما باستخدام تنفيذ موجود أو تنفيذ خادم / خدمة HTTP أو HTTP أو HTTP الخاص بك.

من المحتمل أن تأتي الاختناقات الخاصة بك من أحد المصادر التالية:

  • Harddisk I / O - من المفترض أن يكون لدى WD Velociraptor سرعة وصول عشوائي بحوالي 100 ميجابايت / ثانية. أيضا، من المهم ما إذا كنت قد قمت بإعدادها كأداة RAID0،1،5 أو ما لا. يقرأ البعض بسرعة ولكن كتابة بطيئة. المفاضلات.

  • شبكة الإدخال / الإدخال / الإخراج - على افتراض أن لديك أسرع أجهزة تصوير في إعداد RAID سريع، إلا إذا كنت تستخدم GBIT I / O، ستكون شبكتك بطيئة. إذا كانت أنابيبك كبيرة، فلا تزال بحاجة إلى تزويدها بالبيانات.

  • ذاكرة التخزين المؤقت للذاكرة - سوف تحتاج ذاكرة التخزين المؤقت لنظام الملفات في الذاكرة إلى أن تكون كبيرة بما يكفي لتسويق جميع الشبكة I / O بحيث لا تبطئك. وهذا يتطلب كميات كبيرة من الذاكرة لنوع العمل الذي تبحث عنه.

  • بنية نظام الملفات - على افتراض أن لديك ذاكرة غيغابايت بقيمة، فمن المرجح أن تكون عنق الزجاجة هي بنية البيانات التي تستخدمها لنظام الملفات. إذا كان بنية نظام الملفات مرهقة، فسوف يبطئك.

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

يبدو وكأنه يجب عليك استخدام خادم SFTP (SSH), ، هو جدار الحماية / NAT آمن، آمن، يفعل بالفعل ما تريد وأكثر من ذلك. يمكنك أيضا استخدام مشاركة ملف Samba أو Windows لتنفيذ أكثر بسيطة.

لماذا لا تستخدم شيئا موجود، على سبيل المثال يعالج خادم الويب العادي الكثير من الملفات الصغيرة (الصور) بشكل جيد للغاية وسريع.

والكثير من الناس قضوا بالفعل الوقت في تحسين الكود.

والمنفعة الثانية هي أن النقل يتم مع HTTP وهو بروتوكول ثابت. ويتم تشغيله بسهولة إلى SSL إذا كنت بحاجة إلى مزيد من الأمان.

بالنسبة للتحميل، فهي أيضا لا توجد مشكلة في البرنامج النصي أو وحدة نمطية مخصصة - بنفس الطريقة التي يمكنك أيضا إضافة إذن أيضا.

طالما أنك لا تحتاج إلى البحث عن الملفات بشكل حيوي، فسيكون ذلك سيكون أحد أفضل الحلول.

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

قد يكون هناك خيار واحد لتثبيت خادم Apache HTTP على الجهاز وخدمة الملف عبر ذلك. استخدم Post لتحميل وتحميل.

إذا كان العملاء داخل LAN، فلن تتمكن من مشاركة محرك الأقراص فقط؟

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