Apollo-link-rest: طريقة أنيقة لصف طلبات الخادم بقية؟ أقصى التزامن ، المسافة الزمنية ، الاختناق 🚙⟷🚕⟷🚗؟

تم إنشاؤها على ٢٠ يناير ٢٠١٩  ·  7تعليقات  ·  مصدر: apollographql/apollo-link-rest

أنا أستخدم apollo-link-rest لإنشاء مكالمات إلى طرف ثالث مجاني. أعتقد أنها حالة استخدام رائعة.

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

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

_ مكالمتان في آن واحد_ 🚀🚀

const QUERY = gql`
  query RestData($email: String!) {
    # 1) Query for user 🚀
    users @rest(path: '/users/email?{args.email}', method: 'GET', type: 'User') {
      id @export(as: "id")
      firstName
      lastName
      # 2) Sub query for friends fires immediately as well 🚀
      friends @rest(path: '/friends/{exportVariables.id}', type: '[User]') {
        firstName
        lastName
      }
    }
  }
`;

للتخفيف من الحالات الخفيفة لمشكلة الاستعلام n + 1 (أي إحضار جميع المنتجات ، بدلاً من وصف كل منتج) ، أود أن أكون قادرًا على الحصول على شبكة أمان لأخطاء الخادم 429 (فشل بسبب تقييد المعدل من الخادم).

_ماذا أفعل الآن: إحضار التغليف_

const restProviders = new RestLink({
  endpoints: {
    mySlowEndpoint: baseUrl
  },
  customFetch: (...args) =>
    new Promise((resolve, reject) => {
      // 🚙⟷🚕⟷🚗 Implementing my queue logic to fire of fetches
        resolve(fetch(...args));
      // when enough time has elapsed. 🚙⟷🚕⟷🚗 
    })
})

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

التعليق الأكثر فائدة

ربما ينبغي علي إضافة ما أفعله الآن للآخرين القادمين من جوجل. الآن أستخدم p-throttle ( الريبو ).

// (...)
import pThrottle from "p-throttle";

const restProviders = new RestLink({
  endpoints: {
    mySlowEndpoint: baseUrl
  },
  // Throttle fetches to max 1 concurrent request 🚀 and
  //  min. delay of 0.5 seconds 🚙⟷🚕⟷🚗 .
  customFetch: pThrottle( (...args) => {
    return fetch(...args);
  }, 1, 500)
})

// (...)

ال 7 كومينتر

ربما ينبغي علي إضافة ما أفعله الآن للآخرين القادمين من جوجل. الآن أستخدم p-throttle ( الريبو ).

// (...)
import pThrottle from "p-throttle";

const restProviders = new RestLink({
  endpoints: {
    mySlowEndpoint: baseUrl
  },
  // Throttle fetches to max 1 concurrent request 🚀 and
  //  min. delay of 0.5 seconds 🚙⟷🚕⟷🚗 .
  customFetch: pThrottle( (...args) => {
    return fetch(...args);
  }, 1, 500)
})

// (...)

@ D1no كنت سأقترح ميزة الجلب المخصص ، لكنك قمت بذلك بالفعل!

لست متأكدًا من أن هذا يجب أن يكون حقًا ميزة قابلة للتكوين بشكل مباشر لـ Apollo-link-rest ، لكنني سأدعم تضمين مقتطف مثل هذا في المستندات.

هل يمكنك توجيهي إلى مكان جميل في المستند إلى العلاقات العامة لهذه المعلومات كمثال لما يمكن للمرء أن يفعله باستخدام customFetch؟ أعتقد أنك على حق؛ إن رمي قابلية تكوين كهذه في apollo-link-rest من شأنه أن يقرن منهجيات الجلب التي ليست أنيقة للغاية.

في العلاقات العامة ، كنت سأطرح قائمة الانتظار p للحصول على مثال أكثر اختراعًا للمبتدئين الذين يقرؤون. سيحتاج أي شخص يستخدم بجدية Apollo-link-rest كعقار بوابة في GraphQL إلى _ بعض إدارة التزامن / تصحيح الأخطاء_ في مرحلة ما.

مرحبًا @ D1no ، يمكنك العثور على المستندات هنا . أود أن أقترح أن يكون في العنوان Options ، أعلى من Complete options .

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

على الرغم من أنني قلت في الأصل إحضار أداة التوصيل ، إلا أن هذا ليس صحيحًا في الواقع. إنها الدعوة إلى منهجية الجلب (أي تعسفية) التي تتفشى هنا. لتكون قادرًا على ترويض Apollo-link-rest التنفيذ الأعمى / الشغوف ، قد لا تكون بعض خيارات التزامن البسيط وحدود ms كما رأينا أعلاه فكرة سيئة في النهاية.

const restProviders = new RestLink({
  endpoints: {
    mySlowEndpoint: baseUrl
  },
  maxConcurrency: 2 // Max Concurrency 🚀🚀
  minThrottle: 500 // Handling Rate Limit in ms 🚙⟷🚕⟷🚗 
})

و / أو القدرة على تحديده في الاستعلام

const QUERY = gql`
  query RestData($email: String!) {
    users @rest(path: '/users/email?{args.email}', method: 'GET', type: 'User') {
      id @export(as: "id")
      firstName
      lastName
      # NEW:       ⤥ 🚙⟷🚕     ⤥ 🚀🚀
      friends @rest(throttle: 500, concurrency: 2, path: '/friends/{exportVariables.id}', type: '[User]') {
        firstName
        lastName
      }
    }
  }
`;

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

ربما يستطيع أحد المشرفين / الموظفين (fbartho) المشاركة؟ سأكون سعيدًا بتخصيص وقت للعلاقات العامة إذا تمت الموافقة على مزاياها.

@ D1no لقد أحببت بصدق اقتراحك بتضمين المستندات في المستندات. - تعد قائمة الانتظار عكس الطريقة التي أردنا القيام بها في تطبيق شركتنا. (إلغاء التكرار هو أحد الأشياء التي قمت بإنشائها ، على سبيل المثال).

بشكل منفصل ، نظرًا لأن نقاط النهاية يمكن أن تكون مختلفة تمامًا ، فأنا متردد في تعيين "maxConcurrency / minThrottle" كمخاوف عالمية.

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

حسنًا - سأضيف العلاقات العامة إلى التوثيق أولاً. يجب أن نحصل على أدنى مستوى customFetch أولاً قبل دهن الطبقات فوقه.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات