تنفيذ تجمع اتصال WCF لـ .Net Core باستخدام HttpClientFactory

تم تطوير منتجاتنا على منصة .Net Core 2.2 باستخدام WCF 4.5 للتفاعل مع خدمة عملاء SOAP. أثناء الخدمة ، لاحظ مطورو ناقل البيانات حمولة عالية على الخادم. علاوة على ذلك ، بدأت مشاكل الوصول إلى الخدمة في الظهور. نتيجة لذلك ، وجد أن السبب يكمن في عدد المركبات النشطة.

هناك مشكلة مثل استنفاد الاتصال. قد تنشأ بسبب نقص المنافذ المتاحة عند إنشاء اتصال أو الحد من عدد الاتصالات للخدمات الخارجية أو الداخلية. هناك حلان:

• زيادة الموارد المتاحة ،
• تقليل عدد الاتصالات.

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



فكرة


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

في منتجنا ، استخدمنا بالفعل HttpClientFactory للتفاعل مع الخدمات الأخرى ، وكان استخدام المصنع في WCF يبدو كبديل جيد لعميل WCF ثابت. في هذه الحالة ، لن نضطر إلى إجراء تغييرات على تنفيذ خدمة WCF. لكن يمكنهم استخدام المجموعة التي يمكن أن يعمل بها المصنع. بالإضافة إلى ذلك ، سمح لنا ذلك بحل مشكلة مصادقة NTLM في Linux ، الموضحة في هذه المقالة ، لأنه عند تكوين عميل http ، يمكنك تعيين نظام المصادقة لمعالج الرسائل.

تطبيق


للعمل مع HttpClientFactory ، ما عليك سوى إضافة وصف تكوين العميل إلى ConfigureServices. هناك يمكنك إضافة العديد من العملاء الذين تمت تسميتهم أو كتابتهم باستخدام التكوين الخاص بك. في هذه الحالة ، سيستخدم كل عميل تجمع الاتصال الخاص به. في المثال ، نستخدم عميل مسمى.

services.AddHttpClient("ClientName"); 

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

وبالتالي ، عند إعادة المعالج من تجمع المصنع ، سنستبدل المعالج الوارد به. للحصول على المعالج من تجمع المصنع ، نستخدم HttpMessageHandlerFactory. وللوصول إلى معلمات الربط ، سيكون من الضروري تطبيق فئة موروثة من IEndpointBehavior. ثم قم بإضافته إلى عميل WCF الخاص بنا.

بشكل تخطيطي ، تبدو الخوارزمية لإنشاء عميل جديد على جانب WCF هكذا.



نحن ننفذ CustomEndpointBehaviour.

 public class CustomEndpointBehavior : IEndpointBehavior { private readonly Func<HttpMessageHandler> _httpHandler; public CustomEndpointBehavior(IHttpMessageHandlerFactory factory) { //       _httpHandler = () => factory.CreateHandler("ClientName"); } public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { //      bindingParameters.Add(new Func<HttpClientHandler, HttpMessageHandler>(handler => _httpHandler())); } public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { } public void Validate(ServiceEndpoint endpoint) { } } 

بعد ذلك ، أضف EndpointBehavior إلى عميل WCF.

 var httpMessageHandler = serviceProvider.GetRequiredService<IHttpMessageHandlerFactory>(); var client = new WcfClient(); client.Endpoint.EndpointBehaviors.Add(new CustomEndpointBehavior(httpMessageHandler)); 

الآن عند إنشاء اتصالات من خلال WCF ، كلما أمكن ذلك ، سيتم استخدام مثيلات معالج من التجمع. هذا سوف يقلل من عدد المركبات النشطة.

اختبار


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

مراقبة الاتصالات دون تجمع:



مراقبة اتصالات بركة:



استنتاج


قمنا في True Engineering بتنفيذ تجمع اتصال في WCF ، والذي لا يعتمد على تنفيذ العمل مع عميل WCF. كما أنه يوفر بشكل فعال الموارد على جانب الخادم حيث يتم تشغيل التطبيق ، وعلى جانب مزود الخدمة.

لقد قضينا الكثير من الوقت في البحث عن خيارات التحسين ، ولكن تبين أن الحل نفسه موجز وبسيط. خذها بينما الجو حار)

Source: https://habr.com/ru/post/ar465255/


All Articles