إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
يدعم SignalR Service SDK نقاط نهاية متعددة لمثيلات خدمة SignalR. يمكنك استخدام هذه الميزة لتوسيع نطاق الاتصالات المتزامنة، أو استخدامها للمراسلة عبر المناطق.
هام
تظهر سلسلة الاتصال الأولية في هذه المقالة لأغراض العرض التوضيحي فقط.
يتضمن سلسلة الاتصال معلومات التخويل المطلوبة لتطبيقك للوصول إلى خدمة Azure SignalR. مفتاح الوصول داخل سلسلة الاتصال يشبه كلمة مرور الجذر للخدمة الخاصة بك. في بيئات الإنتاج، قم دائما بحماية مفاتيح الوصول الخاصة بك. استخدم Azure Key Vault لإدارة مفاتيحك وتدويرها بأمان وتأمين سلسلة الاتصال باستخدام معرف Microsoft Entra وتخويل الوصول باستخدام معرف Microsoft Entra.
تجنب توزيع مفاتيح الوصول إلى مستخدمين آخرين، أو ترميزها ترميزًا ثابتًا، أو حفظها في أي مكان في نص عادي يمكن للآخرين الوصول إليه. قم بتدوير المفاتيح الخاصة بك إذا كنت تعتقد أنها قد تعرضت للخطر.
بالنسبة إلى ASP.NET Core
إضافة نقاط نهاية متعددة من التكوين
تظهر سلسلة الاتصال الأولية في هذه المقالة لأغراض العرض التوضيحي فقط. في بيئات الإنتاج، قم دائما بحماية مفاتيح الوصول الخاصة بك. استخدم Azure Key Vault لإدارة مفاتيحك وتدويرها بأمان وتأمين سلسلة الاتصال باستخدام معرف Microsoft Entra وتخويل الوصول باستخدام معرف Microsoft Entra.
تكوين باستخدام المفتاح 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>
إضافة نقاط نهاية متعددة من التعليمات البرمجية
ServiceEndpoint تصف الفئة خصائص نقطة نهاية خدمة 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)
{
// Sample code showing how to choose endpoints based on the incoming request endpoint query
var endpointName = context.Request.Query["endpoint"].FirstOrDefault() ?? "";
// Select from the available endpoints, don't construct a new ServiceEndpoint object here
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>")
};
});
ServiceOptions.Endpoints يدعم أيضا إعادة التحميل السريع. يوضح نموذج التعليمات البرمجية أدناه كيفية تحميل سلسلة الاتصال من قسم تكوين واحد وعنوان URL العام المكشوف بواسطة وكلاء عكسيين من آخر، وطالما يدعم التكوين إعادة التحميل السريع، يمكن تحديث نقاط النهاية بسرعة.
services.Configure<ServiceOptions>(o =>
{
o.Endpoints = [
new ServiceEndpoint(Configuration["ConnectionStrings:AzureSignalR:East"], name: "east")
{
ClientEndpoint = new Uri(Configuration.GetValue<string>("PublicClientEndpoints:East"))
},
new ServiceEndpoint(Configuration["ConnectionStrings:AzureSignalR:West"], name: "west")
{
ClientEndpoint = new Uri(Configuration.GetValue<string>("PublicClientEndpoints:West"))
},
];
});
على سبيل 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>
إضافة نقاط نهاية متعددة من التعليمات البرمجية
ServiceEndpoint تصف الفئة خصائص نقطة نهاية خدمة 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)
{
// Sample code showing how to choose endpoints based on the incoming request endpoint query
var endpointName = context.Request.Query["endpoint"] ?? "";
// Select from the available endpoints, don't construct a new ServiceEndpoint object here
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 Core أولا. لذلك ليس عليك إعادة تشغيل خادم التطبيق عندما تحتاج إلى إضافة/إزالة ServiceEndpoint. نظرا لأن ASP.NET Core يدعم تكوينا افتراضيا مثل appsettings.json مع reloadOnChange: true، لا تحتاج إلى تغيير التعليمات البرمجية، وهو مدعوم بطبيعتها. وإذا كنت ترغب في إضافة بعض التكوين المخصص والعمل مع إعادة التحميل السريع، فراجع التكوين في ASP.NET Core.
إشعار
بالنظر إلى وقت إعداد الاتصال بين الخادم/الخدمة والعميل/الخدمة قد يكون مختلفا، لضمان عدم فقدان الرسائل أثناء عملية المقياس، لدينا فترة تشغيل مرحلي تنتظر أن تكون اتصالات الخادم جاهزة قبل فتح ServiceEndpoint الجديد للعملاء. عادة ما يستغرق إكمال العملية ثواني وستتمكن من رؤية رسالة سجل مثلها Succeed in adding endpoint: '{endpoint}' تشير إلى اكتمال العملية.
في بعض الحالات المتوقعة، مثل مشكلات الشبكة عبر المناطق أو عدم تناسق التكوين على خوادم التطبيقات المختلفة، قد لا تنتهي فترة التقسيم المرحلي بشكل صحيح. في هذه الحالات، يقترح إعادة تشغيل خادم التطبيق عندما تجد أن عملية التحجيم لا تعمل بشكل صحيح.
فترة المهلة الافتراضية للمقياس هي 5 دقائق، ويمكن تخصيصها عن طريق تغيير القيمة في ServiceOptions.ServiceScaleTimeout. إذا كان لديك الكثير من خوادم التطبيقات، فمن المقترح توسيع القيمة أكثر قليلا.
إشعار
يتم حاليا دعم ميزة نقاط النهاية المتعددة فقط على Persistent نوع النقل.
لملحقات SignalR Functions
التكوين
لتمكين مثيلات خدمة SignalR المتعددة، يجب عليك:
استخدم
Persistentنوع النقل.نوع النقل الافتراضي هو
Transientالوضع. يجب إضافة الإدخال التالي إلى ملفكlocal.settings.jsonأو إعداد التطبيق على Azure.{ "AzureSignalRServiceTransportType":"Persistent" }إشعار
عند التبديل من
Transientالوضع إلىPersistentالوضع، قد يكون هناك تغيير في سلوك تسلسل JSON، لأنه ضمنTransientالوضع،Newtonsoft.Jsonيتم استخدام المكتبة لتسلسل وسيطات أساليب المركز، ومع ذلك، ضمنPersistentالوضع،System.Text.Jsonيتم استخدام المكتبة كافتراضية.System.Text.Jsonيحتوي على بعض الاختلافات الرئيسية في السلوك الافتراضي باستخدامNewtonsoft.Json. إذا كنت تريد استخدامNewtonsoft.JsonضمنPersistentالوضع، يمكنك إضافة عنصر تكوين:"Azure:SignalR:HubProtocol":"NewtonsoftJson"فيlocal.settings.jsonملف أوAzure__SignalR__HubProtocol=NewtonsoftJsonعلى مدخل Microsoft Azure.تكوين إدخالات نقاط نهاية SignalR Service المتعددة في التكوين الخاص بك.
نستخدم كائن
ServiceEndpointلتمثيل مثيل خدمة SignalR. يمكنك تعريف نقطة نهاية الخدمة باستخدام<EndpointName>و<EndpointType>في مفتاح الإدخال، سلسلة الاتصال في قيمة الإدخال. المفاتيح بالتنسيق التالي:Azure:SignalR:Endpoints:<EndpointName>:<EndpointType><EndpointType>اختياري والإعدادات الافتراضية إلىprimary. راجع العينات أدناه:{ "Azure:SignalR:Endpoints:EastUs":"<ConnectionString>", "Azure:SignalR:Endpoints:EastUs2:Secondary":"<ConnectionString>", "Azure:SignalR:Endpoints:WestUs:Primary":"<ConnectionString>" }إشعار
عند تكوين نقاط نهاية Azure SignalR في App Service على مدخل Azure، لا تنس استبدال
":"ب"__"، التسطير السفلي المزدوج في المفاتيح. لأسباب، راجع متغيرات البيئة.يتم أيضا التعرف على سلسلة الاتصال التي تم تكوينها باستخدام المفتاح
{ConnectionStringSetting}(افتراضيات إلى "AzureSignalRConnectionString") كنقطة نهاية خدمة أساسية باسم فارغ. ولكن لا ينصح بنمط التكوين هذا لنقاط نهاية متعددة.
التوجيه
السلوكْ الافتراضي
بشكل افتراضي، يستخدم ربط الوظائف DefaultEndpointRouter لالتقاط نقاط النهاية.
توجيه العميل: حدد نقطة نهاية واحدة عشوائيا من نقاط النهاية الأساسية عبر الإنترنت . إذا كانت جميع نقاط النهاية الأساسية غير متصلة، فحدد نقطة نهاية ثانوية واحدة عبر الإنترنت عشوائيا. إذا فشل التحديد مرة أخرى، طرح استثناء.
توجيه رسالة الخادم: يتم إرجاع جميع نقاط نهاية الخدمة.
التخصيص
نموذج C# قيد المعالجة
إليك الخطوات التي يجب اتباعها:
تنفيذ جهاز توجيه مخصص. يمكنك الاستفادة من المعلومات المقدمة من
ServiceEndpointلاتخاذ قرار التوجيه. راجع الدليل هنا: تخصيص خوارزمية المسار. يرجى ملاحظة أن مشغل HTTP مطلوب في وظيفة التفاوض عندما تحتاج إلىHttpContextطريقة تفاوض مخصصة.تسجيل الموجه إلى حاوية DI.
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Azure.SignalR;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(SimpleChatV3.Startup))]
namespace SimpleChatV3
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddSingleton<IEndpointRouter, CustomizedRouter>();
}
}
}
نموذج عملية معزولة
بالنسبة للوظائف التي تعمل على نموذج معالجة معزول، ندعم تحديد نقاط النهاية الهدف في كل طلب. ستستخدم أنواع ربط جديدة للحصول على معلومات نقطة النهاية.
تحويل العميل
SignalRConnectionInfo يحدد الربط نقطة نهاية واحدة وفقا لقاعدة التوجيه الافتراضية. إذا كنت ترغب في تخصيص قاعدة التحويل، فيجب عليك استخدام SignalRNegotiation الربط بدلا من SignalRConnectionInfo الربط.
SignalRNegotiation خصائص تكوين الربط هي نفس SignalRConnectionInfo. فيما يلي نموذج function.json ملف:
{
"type": "signalRNegotiation",
"name": "negotiationContext",
"hubName": "<HubName>",
"direction": "in"
}
يمكنك أيضا إضافة بيانات ربط أخرى مثل userId، idToken ومثل claimTypeList .SignalRConnectionInfo
الكائن الذي تحصل عليه من SignalRNegotiation الربط بالتنسيق التالي:
{
"endpoints": [
{
"endpointType": "Primary",
"name": "<EndpointName>",
"endpoint": "https://****.service.signalr.net",
"online": true,
"connectionInfo": {
"url": "<client-access-url>",
"accessToken": "<client-access-token>"
}
},
{
"...": "..."
}
]
}
فيما يلي عينة استخدام JavaScript للربط SignalRNegotiation :
module.exports = function (context, req, negotiationContext) {
var userId = req.query.userId;
if (userId.startsWith("east-")) {
//return the first endpoint whose name starts with "east-" and status is online.
context.res.body = negotiationContext.endpoints.find(endpoint => endpoint.name.startsWith("east-") && endpoint.online).connectionInfo;
}
else {
//return the first online endpoint
context.res.body = negotiationContext.endpoints.filter(endpoint => endpoint.online)[0].connectionInfo;
}
}
توجيه الرسائل
يحتاج توجيه الرسائل أو الإجراءات إلى نوعين من الربط للتعاون. بشكل عام، تحتاج أولا إلى نوع SignalREndpoints ربط إدخال جديد للحصول على جميع معلومات نقطة النهاية المتوفرة. ثم تقوم بتصفية نقاط النهاية والحصول على صفيف يحتوي على جميع نقاط النهاية التي تريد الإرسال إليها. وأخيرا يمكنك تحديد نقاط النهاية الهدف في SignalR ربط الإخراج.
فيما يلي SignalREndpoints خصائص تكوين الربط في functions.json الملف:
{
"type": "signalREndpoints",
"direction": "in",
"name": "endpoints",
"hubName": "<HubName>"
}
الكائن الذي تحصل منه SignalREndpoints هو صفيف من نقاط النهاية يتم تمثيل كل منها ككائن JSON بالمخطط التالي:
{
"endpointType": "<EndpointType>",
"name": "<EndpointName>",
"endpoint": "https://****.service.signalr.net",
"online": true
}
بعد الحصول على صفيف نقطة النهاية الهدف، أضف endpoints خاصية إلى كائن ربط الإخراج. هذا مثال JavaScript:
module.exports = function (context, req, endpoints) {
var targetEndpoints = endpoints.filter(endpoint => endpoint.name.startsWith("east-"));
context.bindings.signalRMessages = [{
"target": "chat",
"arguments": ["hello-world"],
"endpoints": targetEndpoints,
}];
context.done();
}
لإدارة SDK
إضافة نقاط نهاية متعددة من التكوين
تكوين باستخدام مفتاح Azure:SignalR:Endpoints سلسلة الاتصال خدمة SignalR. يجب أن يكون المفتاح بالتنسيق Azure:SignalR:Endpoints:{Name}:{EndpointType}، حيث Name وخصائص EndpointType العنصر ServiceEndpoint ، ويمكن الوصول إليها من التعليمات البرمجية.
يمكنك إضافة مثيلات متعددة سلسلة الاتصال باستخدام الأوامر التاليةdotnet:
dotnet user-secrets set Azure:SignalR:Endpoints:east-region-a <ConnectionString1>
dotnet user-secrets set Azure:SignalR:Endpoints:east-region-b:primary <ConnectionString2>
dotnet user-secrets set Azure:SignalR:Endpoints:backup:secondary <ConnectionString3>
إضافة نقاط نهاية متعددة من التعليمات البرمجية
ServiceEndpoint تصف الفئة خصائص نقطة نهاية خدمة Azure SignalR.
يمكنك تكوين نقاط نهاية مثيل متعددة عند استخدام Azure SignalR Management SDK من خلال:
var serviceManager = new ServiceManagerBuilder()
.WithOptions(option =>
{
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"),
};
})
.BuildServiceManager();
تخصيص موجه نقطة النهاية
بشكل افتراضي، يستخدم 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 باستخدام:
var serviceManager = new ServiceManagerBuilder()
.WithOptions(option =>
{
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"),
};
})
.WithRouter(new CustomRouter())
.BuildServiceManager();
التكوين في سيناريوهات عبر المناطق
يحتوي ServiceEndpoint الكائن على خاصية بقيمة EndpointTypeprimary أو secondary.
نقاط النهاية الأساسية هي نقاط النهاية المفضلة لتلقي نسبة استخدام الشبكة للعميل لأن لديها اتصالات شبكة أكثر موثوقية. تحتوي نقاط النهاية الثانوية على اتصالات شبكة أقل موثوقية وتستخدم فقط لحركة مرور الخادم إلى العميل. على سبيل المثال، يتم استخدام نقاط النهاية الثانوية لبث الرسائل بدلا من نقل بيانات العميل إلى الخادم.
في الحالات عبر المناطق، يمكن أن تكون الشبكة غير مستقرة. بالنسبة لخادم التطبيق الموجود في شرق الولايات المتحدة، فإن نقطة نهاية SignalR Service الموجودة في نفس منطقة شرق الولايات المتحدة هي primary ونقاط النهاية في مناطق أخرى تم وضع علامة عليها ك secondary. في هذا التكوين، يمكن لنقاط نهاية الخدمة في مناطق أخرى تلقي رسائل من خادم تطبيق شرق الولايات المتحدة هذا، ولكن لا يتم توجيه أي عملاء عبر المناطق إلى خادم التطبيق هذا. يوضح الرسم التخطيطي التالي البنية الأساسية:
عندما يحاول /negotiate عميل مع خادم التطبيق مع جهاز توجيه افتراضي، يحدد SDK نقطة نهاية واحدة عشوائيا من مجموعة نقاط النهاية المتوفرةprimary. عندما لا تتوفر نقطة النهاية الأساسية، يتم تحديد SDK عشوائيا من جميع نقاط النهاية المتوفرةsecondary. يتم وضع علامة على نقطة النهاية على أنها متوفرة عندما يكون الاتصال بين الخادم ونقطة نهاية الخدمة على قيد الحياة.
في سيناريو عبر المناطق، عندما يحاول /negotiate عميل مع خادم التطبيق المستضاف في شرق الولايات المتحدة، بشكل افتراضي، فإنه يقوم دائما بإرجاع primary نقطة النهاية الموجودة في نفس المنطقة. عندما لا تتوفر جميع نقاط نهاية شرق الولايات المتحدة ، يعيد الموجه توجيه العميل إلى نقاط النهاية في مناطق أخرى. يصف قسم تجاوز الفشل التالي السيناريو بالتفصيل.
تجاوز الفشل
عندما لا primary تتوفر نقطة نهاية، يختار العميل /negotiate من نقاط النهاية المتوفرة secondary . تتطلب آلية تجاوز الفشل هذه أن تعمل كل نقطة نهاية كنقطة primary نهاية لخادم تطبيق واحد على الأقل.
الخطوات التالية
يمكنك استخدام نقاط نهاية متعددة في سيناريوهات قابلية الوصول العالية والتعافي من الكوارث.