java - يستجيب - مشكلة dns في ويندوز 10




عدم حجب(متزامن) DNS حل في جاوة (4)

على ما أعتقد ، يجب عليك تنفيذ بروتوكول عميل DNS بنفسك فوق UDP الأولي باستخدام دعم مآخذ أساسية أو فوق TCP باستخدام قنوات NIO.

هل هناك طريقة نظيفة لحل استعلام DNS (احصل على IP بواسطة اسم المضيف) في Java بشكل غير متزامن ، بطريقة غير قابلة للحظر (على سبيل المثال ، آلة الحالة ، لا 1 سؤال = موضوع واحد - أود تشغيل عشرات الآلاف من الاستعلامات في وقت واحد ، ولكن لا تقم بتشغيل عشرات الآلاف من المواضيع)؟

ما وجدته حتى الآن:

  • InetAddress.getByName() تطبيق InetAddress.getByName() القياسي InetAddress.getByName() مكتبات Java القياسية التي تفتقر إلى أي تطبيقات غير قابلة للحظر.
  • حل DNS في السؤال المجمع يناقش مشكلة مماثلة ، ولكن الحل الوحيد الذي تم العثور عليه هو نهج متعدد الخيوط (أي موضوع واحد يعمل على استعلام واحد فقط في كل لحظة معينة من الوقت) ، وهو غير قابل للتحجيم.
  • مكتبة dnsjava يتم حظر أيضا فقط.
  • هناك امتدادات قديمة غير قابلة للحظر إلى dnsjava يرجع تاريخها إلى عام 2006 ، وبالتالي تفتقر إلى أي من عناصر التزامن Java الحديثة مثل استخدام النموذج في Future ، والأسف ، تنفيذ محدود للغاية للصفوف فقط.
  • مشروع dnsjnio هو أيضا امتداد ل dnsjava ، لكنه يعمل أيضا في نموذج مترابطة (أي 1 استفسار = 1 موضوع).
  • يبدو أن asyncorg هو أفضل حل متوفر وجدته حتى الآن في استهداف هذه المشكلة ، ولكن:
    • انها أيضا من عام 2007 وتبدو مهجورة
    • يفتقر تقريبا أي وثائق / javadoc
    • يستخدم الكثير من التقنيات غير القياسية مثل فئة Fun

أي أفكار / تطبيقات أخرى فاتني؟

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

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

والخيط الثاني الذي سوف:

  • انتظر ملقم DNS للإجابة على أي استعلام (باستخدام أسلوب epoll / kqueue مثل)
  • اقرأ الإجابة ، واعثر على الخط الذي كانت عليه في مخزن مؤقت
  • اكتب خط مع IP حل إلى الإخراج
  • الشروع في انتظار الإجابة التالية

إن تطبيق نموذج بسيط في Perl باستخدام AnyEvent يوضح لي أن فكرتي صحيحة بشكل عام ويمكنني أن أحقق بسهولة سرعات مثل 15-20K في الثانية بهذه الطريقة (تنفيذ حظر السذاجة يحصل على 2-3 استعلامات في الثانية - فقط من أجل المقارنة - لذلك هذا مثل فرق 4 فرق من حجم). الآن أنا بحاجة إلى تطبيق نفس الشيء في Java - وأود أن أتجاوز طرح تطبيق DNS الخاص بي ؛)



لديك خيارات متعددة

الخيار 1: Java 5 Executors

  1. تجمع مؤشرات ترابط ثابت: Executors.newFixedThreadPool (int)
  2. Future : يمثل المستقبل نتيجة حساب غير متزامن. يتم توفير أساليب للتحقق من اكتمال الحساب ، انتظار اكتماله ، واسترداد نتيجة الحساب.

الخيار 2: JMS مع MessageListener

  1. يتطلب الاعتماد على مقدم خدمة JMS إلخ.

الخيار 2: الإطار القائم على الفاعل

يمكنك قياس هذا بشكل جيد مع هذا. انظر في Akka .


ليس لدي إجابة على سؤالك (لا أعرف ما إذا كانت هناك مكتبة DNS تعمل في وضع التزامن الذي تريده) وهذا طويل جدًا للتعليق.

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

بدءا من رمز dnsjava ، يجب أن تكون قادرًا على تنفيذ المحلل الخاص بك الذي سيوفر لك طريقة المرسل والمتلقي. تحقق من SimpleResolver وإلقاء نظرة على طريقة send . يجب أن تكون قادرًا على تفتيت هذه الطريقة إلى طريقتين ، واحدة لإرسال الطلب الذي يصل إلى المكالمة إما إلى TCPClient أو UDPClient (ستتعامل مع الأمر الفعلي على إرسال الأسلاك في هذه المرحلة ، كما وصفت ، مع أول مؤشر ترابط) ، وواحدة لتلقيها ، والتي سيتم استدعائها بواسطة مؤشر الترابط الثاني كرد على مقبس القراءة ، والتعامل مع تحليل الاستجابة. قد تضطر إلى نسخ كل الشفرة من SimpleResolver (الكثير من الطرق الخاصة التي ستحتاج إليها والترخيص يسمح بها ) ، أو ، يمكنك إنشاء نسختك الخاصة وتحميلها ببساطة قبل واحد في واحد في مسار دراسي الخاص بك أو قد يعكس طريقك إلى الأساليب المعنية ويضعها في متناولك .

يمكنك بسرعة بناء جانب عميل الشبكة باستخدام netty أو mina . أنا أفضل netty للمستندات.

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







event-driven