معالجة الرسائل الكبيرة باستخدام التقسيم في Azure Logic Apps

وينطبق ذلك على: Azure Logic Apps (الاستهلاك)

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

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

ملاحظة

لا تدعم Azure Logic Apps تقسيم المشغلات بسبب زيادة الحمل من تبادل رسائل متعددة. أيضًا، تنفذ Azure Logic Apps التقسيم لإجراءات HTTP باستخدام بروتوكولها الخاص كما هو موضح في هذه المقالة. لذلك، حتى إذا كان موقع الويب أو خدمة الويب الخاصة بك تدعم التقسيم، فلن تعمل مع تقسيم إجراءات HTTP. لاستخدام تقسيم إجراء HTTP مع موقع الويب أو خدمة الويب، يجب عليك تنفيذ البروتوكول نفسه الذي تستخدمه Azure Logic Apps. وإلا، لا تقم بتمكين التقسيم على إجراء HTTP.

توفر هذه المقالة نظرة عامة حول كيفية عمل التقسيم في Azure Logic Apps وكيفية إعداد التقسيم على الإجراءات المدعومة.

ما الذي يجعل الرسائل "كبيرة"؟

الرسائل "كبيرة" استنادًا إلى الخدمة التي تعالج هذه الرسائل. يختلف حد الحجم الدقيق للرسائل الكبيرة عبر Logic Apps والموصلات. لا يمكن لكل من Logic Apps والموصلات استخدام الرسائل الكبيرة مباشرة، والتي يجب تقسيمها. للحصول على حد حجم رسالة Logic Apps، راجع حدود Logic Apps وتكوينها. للحصول على حد حجم الرسالة لكل موصل، راجع الوثائق المرجعية للموصل.

معالجة الرسائل المقسمة لـ Logic Apps

لا يمكن لـ Logic Apps استخدام المخرجات مباشرة من الرسائل المقسمة التي تكون أكبر من حد حجم الرسالة. يمكن فقط للإجراءات التي تدعم التقسيم الوصول إلى محتوى الرسالة في هذه المخرجات. لذلك، يجب أن يفي الإجراء الذي يعالج الرسائل الكبيرة بهذه المعايير:

  • يدعم في الأصل التقسيم عندما ينتمي هذا الإجراء إلى موصل.
  • تمكين دعم التقسيم في تكوين وقت تشغيل هذا الإجراء.

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

معالجة الرسائل المقسمة للموصلات

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

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

بالنسبة للإجراءات التي تدعم وتمكن للتقسيم، لا يمكنك استخدام نصوص ومتغيرات وتعبيرات المشغلات مثل @triggerBody()?['Content'] لأن استخدام أي من هذه الإدخالات يمنع عملية التقسيم من الحدوث. بدلاً من ذلك، استخدم الإجراءإنشاء . على وجه التحديد، يجب إنشاء body حقل باستخدام إجراء الإنشاء لتخزين إخراج البيانات من نص ومتغير وتعبير المشغل وما إلى ذلك، على سبيل المثال:

"Compose": {
    "inputs": {
        "body": "@variables('myVar1')"
    },
    "runAfter": {
        "Until": [
            "Succeeded"
        ]
    },
    "type": "Compose"
},

ثم، للإشارة إلى البيانات، في إجراء التقسيم، استخدم @body('Compose') .

"Create_file": {
    "inputs": {
        "body": "@body('Compose')",
        "headers": {
            "ReadFileMetadataFromServer": true
        },
        "host": {
            "connection": {
                "name": "@parameters('$connections')['sftpwithssh_1']['connectionId']"
            }
        },
        "method": "post",
        "path": "/datasets/default/files",
        "queries": {
            "folderPath": "/c:/test1/test1sub",
            "name": "tt.txt",
            "queryParametersSingleEncoded": true
        }
    },
    "runAfter": {
        "Compose": [
            "Succeeded"
        ]
    },
    "runtimeConfiguration": {
        "contentTransfer": {
            "transferMode": "Chunked"
        }
    },
    "type": "ApiConnection"
},

إعداد التقسيم عبر HTTP

في سيناريوهات HTTP العامة، يمكنك تقسيم تنزيلات المحتوى الكبير وتحميله عبر HTTP، بحيث يمكن لتطبيق المنطق ونقطة النهاية تبادل الرسائل الكبيرة. ومع ذلك، يجب عليك تقسيم الرسائل بالطريقة التي تتوقعها Logic Apps.

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

أيضًا، إذا لم يقم إجراء HTTP بالفعل بتمكين التقسيم، يجب عليك أيضًا إعداد التقسيم في خاصية الإجراء runTimeConfiguration. يمكنك تعيين هذه الخاصية داخل الإجراء، إما مباشرة في محرر عرض التعليمات البرمجية كما هو موضح لاحقًا، أو في مصمم Logic Apps كما هو موضح هنا:

  1. في الزاوية العلوية اليمنى لإجراء HTTP، اختر زر علامة الحذف (...)، ثم اختر الإعدادات.

    في هذا الإجراء، افتح قائمة الإعدادات

  2. ضمن نقل المحتوى، قم بتعيين السماح بالتقسيم إلى تشغيل.

    تشغيل التقسيم

  3. لمتابعة إعداد التقسيم للتنزيلات أو التحميلات، تابع الأقسام التالية.

تنزيل المحتوى في مجموعات

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

للتحقق مما إذا كانت نقطة النهاية يمكنها دعم المحتوى الجزئي، أرسل طلب HEAD. يساعدك هذا الطلب على تحديد ما إذا كانت الاستجابة تحتوي على عنوان Accept-Ranges. بهذه الطريقة، إذا كانت نقطة النهاية تدعم التنزيلات المقسمة ولكنها لا ترسل محتوى مقسم، يمكنك اقتراح هذا الخيار عن طريق تعيين عنوان Range في طلب HTTP GET.

تصف هذه الخطوات العملية التفصيلية التي تستخدمها Logic Apps لتنزيل المحتوى المقسم من نقطة نهاية إلى تطبيق المنطق الخاص بك:

  1. يرسل تطبيق المنطق طلب HTTP GET إلى نقطة النهاية.

    يمكن أن يتضمن عنوان الطلب اختياريًا حقل Range الذي يصف نطاق بايت لطلب مجموعات المحتوى.

  2. تستجيب نقطة النهاية برمز الحالة "206" ونص رسالة HTTP.

    تظهر تفاصيل حول المحتوى في هذه المجموعة في عنوان الاستجابة Content-Range، بما في ذلك المعلومات التي تساعد Logic Apps على تحديد بداية التقسيم ونهايته، بالإضافة إلى الحجم الإجمالي للمحتوى بأكمله قبل التقسيم.

  3. يرسل تطبيق المنطق تلقائيًا طلبات HTTP GET للمتابعة.

    يرسل تطبيق المنطق طلبات GET للمتابعة حتى يتم استرداد المحتوى بأكمله.

على سبيل المثال، يعرض تعريف الإجراء هذا طلب HTTP GET الذي يعين عنوان Range. يقترح العنوان أن نقطة النهاية يجب أن تستجيب بمحتوى مقسم:

"getAction": {
    "inputs": {
        "headers": {
            "Range": "bytes=0-1023"
        },
       "method": "GET",
       "uri": "http://myAPIendpoint/api/downloadContent"
    },
    "runAfter": {},
    "type": "Http"
}

يعين طلب GET عنوان "النطاق" إلى "بايت=0-1023"، وهو نطاق وحدات البايت. إذا كانت نقطة النهاية تدعم طلبات المحتوى الجزئي، تستجيب نقطة النهاية بمجموعة محتوى من النطاق المطلوب. استنادًا إلى نقطة النهاية، يمكن أن يختلف التنسيق الدقيق لحقل عنوان "النطاق".

تحميل المحتوى في مجموعات

لتحميل محتوى مقسم من إجراء HTTP، يجب أن يكون الإجراء قد مكن دعم التقسيم من خلال خاصية الإجراء runtimeConfiguration. يسمح هذا الإعداد بإجراء بدء بروتوكول التقسيم. يمكن لتطبيق المنطق بعد ذلك إرسال رسالة POST أو PUT أولية إلى نقطة النهاية الهدف. بعد استجابة نقطة النهاية بحجم مجموعة مقترحة، يتابع تطبيق المنطق الخاص بك عن طريق إرسال طلبات HTTP PATCH التي تحتوي على مجموعات المحتوى.

تصف الخطوات التالية العملية التفصيلية التي تستخدمها Logic Apps لتحميل المحتوى المقسم من تطبيق المنطق إلى نقطة النهاية الخاصة بك:

  1. يرسل تطبيق المنطق طلب HTTP POST أو PUT أوليًا مع نص رسالة فارغ. يتضمن عنوان الطلب المعلومات التالية حول المحتوى الذي يريد تطبيق المنطق تحميله في مجموعات:

    حقل عنوان طلب Logic Apps القيمة النوع الوصف
    x-ms-transfer-mode المقسم سلسلة يشير إلى أنه يتم تحميل المحتوى في مجموعات
    x-ms-content-length < content-length> عدد صحيح حجم المحتوى بالكامل بالبايت قبل التقسيم
  2. تستجيب نقطة النهاية برمز حالة النجاح "200" والمعلومات التالية:

    حقل عنوان استجابة نقطة النهاية النوع مطلوب الوصف
    الموقع سلسلة نعم موقع URL الذي تريد إرسال رسائل HTTP PATCH إليه
    x-ms-chunk-size عدد صحيح لا حجم المجموعة المقترحة بالبايت
  3. ينشئ تطبيق المنطق الخاص بك رسائل HTTP PATCH للمتابعة ويرسلها - كل منها بالمعلومات التالية:

    • مجموعة محتوى تستند إلى x-ms-chunk-size أو بعض الحجم المحسوب داخليًا حتى يتم تحميل كل المحتوى الإجمالي x-ms-content-length بشكل تسلسلي

    • معلومات العنوان التالية حول مجموعة المحتوى المرسلة في كل رسالة PATCH:

      حقل عنوان طلب Logic Apps القيمة النوع الوصف
      Content-Range < النطاق> سلسلة نطاق البايت لمجموعة المحتوى الحالية، بما في ذلك قيمة البداية وقيمة النهاية وحجم المحتوى الإجمالي، على سبيل المثال: "بايت=0-1023/10100"
      نوع المحتوى < content-type> سلسلة نوع المحتوى المكعب
      طول المحتوى < content-length> سلسلة طول الحجم بالبايت من المجموعة الحالية
  4. بعد كل طلب PATCH، تؤكد نقطة النهاية الإيصال لكل مجموعة عن طريق الاستجابة برمز الحالة "200" وعناوين الاستجابة التالية:

    حقل عنوان استجابة نقطة النهاية النوع مطلوب الوصف
    نطاق سلسلة نعم نطاق البايت للمحتوى الذي تم تلقيه بواسطة نقطة النهاية، على سبيل المثال: "بايت=0-1023"
    x-ms-chunk-size عدد صحيح لا حجم المجموعة المقترحة بالبايت

على سبيل المثال، يعرض تعريف الإجراء هذا طلب HTTP POST لتحميل محتوى مقسم إلى نقطة نهاية. في خاصية الإجراء runTimeConfiguration، الخاصية contentTransfer تعين transferMode إلى chunked:

"postAction": {
    "runtimeConfiguration": {
        "contentTransfer": {
            "transferMode": "chunked"
        }
    },
    "inputs": {
        "method": "POST",
        "uri": "http://myAPIendpoint/api/action",
        "body": "@body('getAction')"
    },
    "runAfter": {
    "getAction": ["Succeeded"]
    },
    "type": "Http"
}