كيفية توسيع نطاق خدمة SignalR مع مثيلات متعددة؟
تدعم حزمة SDK لخدمة SignalR نقاط نهاية متعددة لمثيلات خدمة SignalR. يمكنك استخدام هذه الميزة لتوسيع نطاق الاتصالات المتزامنة، أو استخدامها للمراسلة عبر المناطق.
ل ASP.NET كور
كيفية إضافة نقاط نهاية متعددة من التكوين؟
التكوين باستخدام المفتاح Azure:SignalR:ConnectionString أو Azure:SignalR:ConnectionString: لسلسلة اتصال خدمة SignalR.
إذا كان المفتاح يبدأ ب Azure:SignalR:ConnectionString:، فيجب أن يكون بالتنسيق Azure:SignalR:ConnectionString:{Name}:{EndpointType}، حيث Name تكون خصائص الكائن ، EndpointType ويمكن الوصول إليها من التعليمات البرمجية ServiceEndpoint .
يمكنك إضافة سلاسل اتصال مثيل متعددة باستخدام الأوامر التالية dotnet :
dotnet user-secrets set Azure:SignalR:ConnectionString:east-region-a <ConnectionString1>
dotnet user-secrets set Azure:SignalR:ConnectionString:east-region-b:primary <ConnectionString2>
dotnet user-secrets set Azure:SignalR:ConnectionString:backup:secondary <ConnectionString3>
كيفية إضافة نقاط نهاية متعددة من التعليمات البرمجية؟
يتم ServicEndpoint تقديم فئة لوصف خصائص نقطة نهاية خدمة Azure SignalR.
يمكنك تكوين نقاط نهاية مثيل متعددة عند استخدام Azure SignalR Service SDK من خلال:
services.AddSignalR()
.AddAzureSignalR(options =>
{
options.Endpoints = new ServiceEndpoint[]
{
// Note: this is just a demonstration of how to set options.Endpoints
// Having ConnectionStrings explicitly set inside the code is not encouraged
// You can fetch it from a safe place such as Azure KeyVault
new ServiceEndpoint("<ConnectionString0>"),
new ServiceEndpoint("<ConnectionString1>", type: EndpointType.Primary, name: "east-region-a"),
new ServiceEndpoint("<ConnectionString2>", type: EndpointType.Primary, name: "east-region-b"),
new ServiceEndpoint("<ConnectionString3>", type: EndpointType.Secondary, name: "backup"),
};
});
كيفية تخصيص جهاز توجيه نقطة النهاية؟
بشكل افتراضي، تستخدم SDK DefaultEndpointRouter لالتقاط نقاط النهاية.
السلوك الافتراضي
توجيه طلب العميل
عندما يكون العميل
/negotiateمع خادم التطبيق. بشكل افتراضي، تقوم SDK بتحديد نقطة نهاية واحدة عشوائيا من مجموعة نقاط نهاية الخدمة المتوفرة.توجيه رسائل الخادم
عند إرسال رسالة إلى اتصال معين، ويتم توجيه الاتصال الهدف إلى الخادم الحالي، تنتقل الرسالة مباشرة إلى نقطة النهاية المتصلة تلك. وإلا، يتم بث الرسائل إلى كل نقطة نهاية Azure SignalR.
تخصيص خوارزمية التوجيه
يمكنك إنشاء جهاز التوجيه الخاص بك عندما يكون لديك معرفة خاصة لتحديد نقاط النهاية التي يجب أن تذهب إليها الرسائل.
يتم تعريف جهاز التوجيه المخصص أدناه كمثال عندما تنتقل المجموعات التي تبدأ دائما east- إلى نقطة النهاية المسماة east:
private class CustomRouter : EndpointRouterDecorator
{
public override IEnumerable<ServiceEndpoint> GetEndpointsForGroup(string groupName, IEnumerable<ServiceEndpoint> endpoints)
{
// Override the group broadcast behavior, if the group name starts with "east-", only send messages to endpoints inside east
if (groupName.StartsWith("east-"))
{
return endpoints.Where(e => e.Name.StartsWith("east-"));
}
return base.GetEndpointsForGroup(groupName, endpoints);
}
}
مثال آخر أدناه ، يتجاوز سلوك التفاوض الافتراضي ، لتحديد نقاط النهاية يعتمد على مكان وجود خادم التطبيق.
private class CustomRouter : EndpointRouterDecorator
{
public override ServiceEndpoint GetNegotiateEndpoint(HttpContext context, IEnumerable<ServiceEndpoint> endpoints)
{
// Override the negotiate behavior to get the endpoint from query string
var endpointName = context.Request.Query["endpoint"];
if (endpointName.Count == 0)
{
context.Response.StatusCode = 400;
var response = Encoding.UTF8.GetBytes("Invalid request");
context.Response.Body.Write(response, 0, response.Length);
return null;
}
return endpoints.FirstOrDefault(s => s.Name == endpointName && s.Online) // Get the endpoint with name matching the incoming request
?? base.GetNegotiateEndpoint(context, endpoints); // Or fallback to the default behavior to randomly select one from primary endpoints, or fallback to secondary when no primary ones are online
}
}
لا تنس تسجيل جهاز التوجيه في حاوية DI باستخدام:
services.AddSingleton(typeof(IEndpointRouter), typeof(CustomRouter));
services.AddSignalR()
.AddAzureSignalR(
options =>
{
options.Endpoints = new ServiceEndpoint[]
{
new ServiceEndpoint(name: "east", connectionString: "<connectionString1>"),
new ServiceEndpoint(name: "west", connectionString: "<connectionString2>"),
new ServiceEndpoint("<connectionString3>")
};
});
ASP.NET
كيفية إضافة نقاط نهاية متعددة من التكوين؟
التكوين باستخدام المفتاح Azure:SignalR:ConnectionString أو Azure:SignalR:ConnectionString: لسلسلة اتصال خدمة SignalR.
إذا كان المفتاح يبدأ ب Azure:SignalR:ConnectionString:، فيجب أن يكون بالتنسيق Azure:SignalR:ConnectionString:{Name}:{EndpointType}، حيث Name تكون خصائص الكائن ، EndpointType ويمكن الوصول إليها من التعليمات البرمجية ServiceEndpoint .
يمكنك إضافة سلاسل اتصال مثيل متعددة إلى web.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="Azure:SignalR:ConnectionString" connectionString="<ConnectionString1>"/>
<add name="Azure:SignalR:ConnectionString:en-us" connectionString="<ConnectionString2>"/>
<add name="Azure:SignalR:ConnectionString:zh-cn:secondary" connectionString="<ConnectionString3>"/>
<add name="Azure:SignalR:ConnectionString:Backup:secondary" connectionString="<ConnectionString4>"/>
</connectionStrings>
...
</configuration>
كيفية إضافة نقاط نهاية متعددة من التعليمات البرمجية؟
يتم ServicEndpoint تقديم فئة لوصف خصائص نقطة نهاية خدمة Azure SignalR.
يمكنك تكوين نقاط نهاية مثيل متعددة عند استخدام Azure SignalR Service SDK من خلال:
app.MapAzureSignalR(
this.GetType().FullName,
options => {
options.Endpoints = new ServiceEndpoint[]
{
// Note: this is just a demonstration of how to set options.Endpoints
// Having ConnectionStrings explicitly set inside the code is not encouraged
// You can fetch it from a safe place such as Azure KeyVault
new ServiceEndpoint("<ConnectionString1>"),
new ServiceEndpoint("<ConnectionString2>"),
new ServiceEndpoint("<ConnectionString3>"),
}
});
كيفية تخصيص جهاز التوجيه؟
الفرق الوحيد بين ASP.NET SignalR و ASP.NET Core SignalR هو نوع سياق http ل GetNegotiateEndpoint. بالنسبة ASP.NET SignalR ، فهو من نوع IOwinContext.
فيما يلي مثال التفاوض المخصص ل ASP.NET SignalR:
private class CustomRouter : EndpointRouterDecorator
{
public override ServiceEndpoint GetNegotiateEndpoint(IOwinContext context, IEnumerable<ServiceEndpoint> endpoints)
{
// Override the negotiate behavior to get the endpoint from query string
var endpointName = context.Request.Query["endpoint"];
if (string.IsNullOrEmpty(endpointName))
{
context.Response.StatusCode = 400;
context.Response.Write("Invalid request.");
return null;
}
return endpoints.FirstOrDefault(s => s.Name == endpointName && s.Online) // Get the endpoint with name matching the incoming request
?? base.GetNegotiateEndpoint(context, endpoints); // Or fallback to the default behavior to randomly select one from primary endpoints, or fallback to secondary when no primary ones are online
}
}
لا تنس تسجيل جهاز التوجيه في حاوية DI باستخدام:
var hub = new HubConfiguration();
var router = new CustomRouter();
hub.Resolver.Register(typeof(IEndpointRouter), () => router);
app.MapAzureSignalR(GetType().FullName, hub, options => {
options.Endpoints = new ServiceEndpoint[]
{
new ServiceEndpoint(name: "east", connectionString: "<connectionString1>"),
new ServiceEndpoint(name: "west", connectionString: "<connectionString2>"),
new ServiceEndpoint("<connectionString3>")
};
});
مقاييس نقطة نهاية الخدمة
لتمكين جهاز التوجيه المتقدم، توفر حزمة SDK لخادم SignalR مقاييس متعددة لمساعدة الخادم على اتخاذ قرار ذكي. الخصائص تحت ServiceEndpoint.EndpointMetrics.
| اسم المقياس | الوصف |
|---|---|
ClientConnectionCount |
إجمالي عدد اتصالات العميل المتصلة المتزامنة على جميع الموزعات لنقطة نهاية الخدمة |
ServerConnectionCount |
إجمالي عدد اتصالات الخادم المتصلة المتزامنة على جميع الموزعات لنقطة نهاية الخدمة |
ConnectionCapacity |
إجمالي حصة الاتصال لنقطة نهاية الخدمة، بما في ذلك اتصالات العميل والخادم |
فيما يلي مثال لتخصيص جهاز التوجيه وفقا ل ClientConnectionCount.
private class CustomRouter : EndpointRouterDecorator
{
public override ServiceEndpoint GetNegotiateEndpoint(HttpContext context, IEnumerable<ServiceEndpoint> endpoints)
{
return endpoints.OrderBy(x => x.EndpointMetrics.ClientConnectionCount).FirstOrDefault(x => x.Online) // Get the available endpoint with minimal clients load
?? base.GetNegotiateEndpoint(context, endpoints); // Or fallback to the default behavior to randomly select one from primary endpoints, or fallback to secondary when no primary ones are online
}
}
خدمة المقياس الديناميكينقاط النهاية
من الإصدار 1.5.0 من SDK، نقوم بتمكين ServiceEndpoints على نطاق ديناميكي للإصدار الأساسي ASP.NET أولا. لذلك لا يتعين عليك إعادة تشغيل خادم التطبيق عندما تحتاج إلى إضافة / إزالة ServiceEndpoint. نظرا لأن ASP.NET Core يدعم التكوين الافتراضي كما هو الحال appsettings.json مع reloadOnChange: true، فلن تحتاج إلى تغيير رمز وهو مدعوم بطبيعته. وإذا كنت ترغب في إضافة بعض التكوين المخصص والعمل مع إعادة التحميل السريع ، فيرجى الرجوع إلى هذا.
ملاحظة
بالنظر إلى أن وقت إعداد الاتصال بين الخادم / الخدمة والعميل / الخدمة قد يكون مختلفا ، لضمان عدم فقدان الرسالة أثناء عملية المقياس ، لدينا فترة تدريج في انتظار أن تكون اتصالات الخادم جاهزة قبل فتح ServiceEndpoint الجديد للعملاء. عادة ما يستغرق الأمر ثوان لإكماله وستتمكن من رؤية السجل Succeed in adding endpoint: '{endpoint}' الذي يشير إلى اكتمال العملية. ولكن لبعض الأسباب غير المتوقعة مثل مشكلة الشبكة عبر المناطق أو التكوين غير المتناسق على خوادم التطبيقات المختلفة ، لن تتمكن فترة التدريج من الانتهاء بشكل صحيح. نظرا لأنه يمكن القيام بأشياء محدودة في هذه الحالات ، فإننا نختار الترويج للمقياس كما هو. يقترح إعادة تشغيل App Server عندما تجد أن عملية القياس لا تعمل بشكل صحيح.
فترة المهلة الافتراضية للمقياس هي 5 دقائق، ويمكن تخصيصها عن طريق تغيير القيمة في ServiceOptions.ServiceScaleTimeout. إذا كان لديك الكثير من خوادم التطبيقات ، فمن المقترح توسيع القيمة أكثر قليلا.
التكوين في السيناريوهات عبر المناطق
يحتوي الكائن ServiceEndpoint على خاصية EndpointType ذات قيمة primary أو secondary.
primary نقاط النهاية هي نقاط النهاية المفضلة لاستقبال حركة مرور العملاء ، وتعتبر أن لديها اتصالات شبكة أكثر موثوقية ؛ secondary تعتبر نقاط النهاية ذات اتصالات شبكة أقل موثوقية وتستخدم فقط لنقل حركة مرور الخادم إلى العميل ، على سبيل المثال ، بث الرسائل ، وليس لنقل حركة مرور العميل إلى الخادم.
في الحالات عبر المناطق ، يمكن أن تكون الشبكة غير مستقرة. بالنسبة لخادم تطبيق واحد يقع في شرق الولايات المتحدة، يمكن تكوين نقطة نهاية خدمة SignalR الموجودة في نفس منطقة شرق الولايات المتحدة كنقاط primary نهاية في مناطق أخرى تحمل علامة .secondary في هذا التكوين، يمكن لنقاط نهاية الخدمة في مناطق أخرى تلقي رسائل من خادم تطبيقات شرق الولايات المتحدة هذا، ولكن لن يكون هناك عملاء عبر المناطق يتم توجيههم إلى خادم التطبيق هذا. تظهر الهندسة المعمارية في الرسم البياني أدناه:

عندما يحاول /negotiate عميل استخدام خادم التطبيق، باستخدام الموجه الافتراضي، يقوم SDK بتحديد نقطة نهاية واحدة عشوائيا من مجموعة نقاط النهاية المتوفرة primary . عندما لا تكون نقطة النهاية الأساسية متوفرة، تقوم SDK بعد ذلك بالتحديد عشوائيا من جميع نقاط النهاية المتاحة secondary . يتم وضع علامة على نقطة النهاية على أنها متوفرة عندما يكون الاتصال بين الخادم ونقطة نهاية الخدمة على قيد الحياة.
في السيناريو عبر المناطق، عندما يحاول /negotiate عميل استخدام خادم التطبيقات المستضاف في East US، فإنه يقوم افتراضيا بإرجاع primary نقطة النهاية الموجودة في نفس المنطقة. عند عدم توفر كافة نقاط نهاية شرق الولايات المتحدة ، تتم إعادة توجيه العميل إلى نقاط النهاية في مناطق أخرى. يصف قسم تجاوز الفشل أدناه السيناريو بالتفصيل.

تجاوز الفشل
عندما لا تتوفر جميع primary نقاط النهاية، يختار العميل /negotiate من نقاط النهاية المتاحة secondary . تتطلب آلية تجاوز الفشل هذه أن تكون كل نقطة نهاية بمثابة primary نقطة نهاية لخادم تطبيق واحد على الأقل.

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