اختبار سرعة HTTP لخدمات REST SMS
هل تحتاج إلى قياس أداء خدمة الرسائل القصيرة (SMS) المعتمدة على HTTP؟ يعد اختبار سرعة HTTP لخدمات REST SMS أداة قوية مصممة لتقييم سرعة وموثوقية نقاط نهاية واجهة برمجة التطبيقات (API) باستخدام JSON/REST. تتيح لك هذه الأداة القابلة للتنزيل محاكاة طلبات SMS عالية الحجم، وتتبع معدلات النجاح، وحساب الطلبات في الثانية - مما يساعدك على تحسين أداء الخادم تحت الحمل. سواء كنت تقوم باختبار الإجهاد في بيئة تطوير محلية أو تقييم أداء بوابة SMS في بيئة الإنتاج، توفر هذه الأداة مقاييس واضحة للطلبات الإجمالية، والاتصالات المتزامنة، وكفاءة HTTP Keep-Alive. قم بتنزيل حل C# الجاهز للاستخدام أو دمج الكود المصدري المقدم في سير عمل الاختبار الخاص بك لتحليل دقيق لأداء API.
تنزيل HttpSpeedTest.zip مثال على الاستخدام
الكود المصدري
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static readonly Random random = new Random();
static readonly string[] sampleMessages = {
"Hello, this is a test message.",
"Performance testing HTTP server capabilities.",
"Measuring requests per second for JSON API.",
"Random message content for load testing.",
"Another test message with different content.",
"Checking server capacity under load.",
"How many requests can the server handle?",
"Stress testing the SMS API endpoint.",
"This message is automatically generated.",
"Final test message in the sample set."
};
static async Task Main(string[] args)
{
Console.WriteLine("HTTP Server JSON API Performance Tester");
Console.WriteLine("---------------------------------------");
if (args.Length < 3)
{
Console.WriteLine("Usage: Program [useKeepAlive]");
Console.WriteLine("Example: Program http://198.50.122.178:8080 1000 50 true");
Console.WriteLine("Example: Program https://api.example.com/sms 5000 100 false");
Console.WriteLine("Example: Program http://localhost/innotest/innotest.php 50 10 false");
return;
}
string baseUrl = args[0];
if (!Uri.TryCreate(baseUrl, UriKind.Absolute, out Uri uriResult) ||
(uriResult.Scheme != Uri.UriSchemeHttp && uriResult.Scheme != Uri.UriSchemeHttps))
{
Console.WriteLine("Invalid base URL. Must be a valid HTTP or HTTPS URL.");
return;
}
if (!int.TryParse(args[1], out int totalRequests) || totalRequests <= 0)
{
Console.WriteLine("Invalid totalRequests value. Must be a positive integer.");
return;
}
if (!int.TryParse(args[2], out int concurrentRequests) || concurrentRequests <= 0)
{
Console.WriteLine("Invalid concurrentRequests value. Must be a positive integer.");
return;
}
bool useKeepAlive = args.Length > 3 && bool.TryParse(args[3], out bool keepAlive) && keepAlive;
Console.WriteLine($"Test Parameters:");
Console.WriteLine($"- Base URL: {baseUrl}");
Console.WriteLine($"- Total Requests: {totalRequests}");
Console.WriteLine($"- Concurrent Requests: {concurrentRequests}");
Console.WriteLine($"- HTTP Keep-Alive: {(useKeepAlive ? "Enabled" : "Disabled")}");
Console.WriteLine();
var httpClientHandler = new HttpClientHandler
{
UseProxy = false,
MaxConnectionsPerServer = concurrentRequests
};
var httpClient = new HttpClient(httpClientHandler)
{
Timeout = TimeSpan.FromSeconds(30),
BaseAddress = new Uri(baseUrl)
};
if (useKeepAlive)
{
httpClient.DefaultRequestHeaders.ConnectionClose = false;
httpClient.DefaultRequestHeaders.Connection.Add("keep-alive");
}
else
{
httpClient.DefaultRequestHeaders.ConnectionClose = true;
}
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "+
"(KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36");
httpClient.DefaultRequestHeaders.Accept.ParseAdd("application/json");
var stopwatch = Stopwatch.StartNew();
var tasks = new List(concurrentRequests);
var completedRequests = 0;
var successfulRequests = 0;
var failedRequests = 0;
Console.WriteLine("Starting test...");
var semaphore = new System.Threading.SemaphoreSlim(concurrentRequests, concurrentRequests);
var jsonOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = false
};
for (int i = 0; i < totalRequests; i++)
{
await semaphore.WaitAsync();
tasks.Add(Task.Run(async () =>
{
try
{
var requestData = new
{
sender = "+0000000",
gsm = GenerateRandomPhoneNumber(),
text = GetRandomMessage(),
usrClient = "Pruebas",
pasClient = "Pruebas"
};
var json = JsonSerializer.Serialize(requestData, jsonOptions);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync(baseUrl, content);
System.Threading.Interlocked.Increment(ref completedRequests);
if (response.IsSuccessStatusCode)
{
System.Threading.Interlocked.Increment(ref successfulRequests);
}
else
{
System.Threading.Interlocked.Increment(ref failedRequests);
Console.WriteLine($"Request failed with status: {response.StatusCode}");
}
}
catch (Exception ex)
{
System.Threading.Interlocked.Increment(ref completedRequests);
System.Threading.Interlocked.Increment(ref failedRequests);
Console.WriteLine($"Request failed: {ex.Message}");
}
finally
{
semaphore.Release();
}
}));
}
await Task.WhenAll(tasks);
stopwatch.Stop();
Console.WriteLine("\nTest completed!");
Console.WriteLine($"Total time: {stopwatch.Elapsed.TotalSeconds:F2} seconds");
Console.WriteLine($"Completed requests: {completedRequests}");
Console.WriteLine($"Successful requests: {successfulRequests}");
Console.WriteLine($"Failed requests: {failedRequests}");
Console.WriteLine($"Requests per second: {totalRequests / stopwatch.Elapsed.TotalSeconds:F2}");
}
static string GenerateRandomPhoneNumber()
{
return $"+{random.Next(100, 999)}{random.Next(1000000, 9999999)}";
}
static string GetRandomMessage()
{
return sampleMessages[random.Next(sampleMessages.Length)];
}
}
شرح الكود
1. نظرة عامة
يقوم تطبيق وحدة التحكم C# هذا باختبار الحمل لنقطة نهاية واجهة برمجة تطبيقات الرسائل القصيرة (SMS) عبر HTTP(S) عن طريق إرسال طلبات JSON متزامنة، مع قياس مقاييس الأداء مثل:
- الطلبات في الثانية (RPS)
- معدلات النجاح/الفشل
- إجمالي وقت التنفيذ
أ. الإعداد والتكوين
إنشاء بيانات عشوائية:
sampleMessages
: مجموعة محددة مسبقًا من عينات نصوص الرسائل القصيرة للاختبار الواقعي.GenerateRandomPhoneNumber()
: ينشئ أرقام هواتف وهمية (مثل+1234567890
).GetRandomMessage()
: يختار رسالة عشوائية منsampleMessages
.
وسائط سطر الأوامر:
Program <baseUrl> <totalRequests> <concurrentRequests> [useKeepAlive]
- يُدقق المدخلات (تنسيق URL، أعداد صحيحة موجبة لأعداد الطلبات).
- يُهيئ إعدادات عميل HTTP (المهلة، keep-alive، وكيل المستخدم).
ب. تكوين عميل HTTP
تخصيص HttpClient
:
MaxConnectionsPerServer
: يحدد الاتصالات المتوازية إلى الخادم.ConnectionClose
/keep-alive
: يبدل بين اتصالات HTTP المستمرة.- المهلة: 30 ثانية لكل طلب.
- الرؤوس: يضبط
User-Agent
وAccept: application/json
.
ج. تنفيذ اختبار الحمل
التحكم في التزامن:
- يستخدم
SemaphoreSlim
للتحكم في الطلبات المتزامنة (مثل 50 في وقت واحد). - Async/await (
Task.Run
) لعمليات الإدخال/الإخراج غير المعيقة.
سير عمل الطلب:
- يسلسل حمولة JSON بأرقام هواتف ورسائل عشوائية:
{ "sender": "+0000000", "gsm": "+1234567890", "text": "مرحبًا، هذه رسالة اختبار.", "usrClient": "Pruebas", "pasClient": "Pruebas" }
- يرسل طلب POST إلى نقطة النهاية المحددة.
- يتتبع النجاحات/الإخفاقات باستخدام
Interlocked
للعدادات الآمنة للخيوط.
د. المقاييس وإعداد التقارير
- Stopwatch: يقيس المدة الإجمالية للاختبار.
- مقاييس الإخراج:
- إجمالي الوقت المنقضي.
- الطلبات المكتملة/الناجحة/الفاشلة.
- الطلبات في الثانية (RPS):
totalRequests / elapsedTime
.
- سلامة الخيوط:
Interlocked.Increment
يضمن تحديث العدادات الذرية عبر الخيوط.SemaphoreSlim
يمنع إرهاق الخادم أو العميل.
- معالجة الأخطاء:
- يلتقط الاستثناءات (مثل المهلات، أخطاء الشبكة) ويسجل الإخفاقات.
- يُدقق رموز حالة HTTP (
IsSuccessStatusCode
).
- تحسينات الأداء:
- يعيد استخدام
HttpClient
(أفضل ممارسة لتجنب استنفاذ منافذ TCP). - keep-alive قابل للتكوين لمحاكاة سيناريوهات العالم الحقيقي.
- يعيد استخدام
لاختبار واجهة برمجة تطبيقات الرسائل القصيرة على http://localhost:8080/sms
مع 1000 طلب إجمالي (50 متزامن، تمكين keep-alive):
Program http://localhost:8080/sms 1000 50 true
الإخراج:
تم الانتهاء من الاختبار! إجمالي الوقت: 12.34 ثانية الطلبات المكتملة: 1000 الطلبات الناجحة: 980 الطلبات الفاشلة: 20 الطلبات في الثانية: 81.045. لماذا هذا مهم
- المعايرة: يحدد الاختناقات في واجهة برمجة التطبيقات (مثل حدود الخادم، زمن انتقال الشبكة).
- اختبار التراجع: يضمن عدم تدهور الأداء بعد التحديثات.
- تخطيط السعة: يحدد الحد الأقصى للحمل الذي يمكن أن يتحمله الخدمة.
- إضافة منطق إعادة المحاولة للأعطال العابرة.
- دعم المصادقة (OAuth/مفاتيح API).
- تصدير النتائج إلى CSV/JSON للتحليل.
هذه الأداة مثالية للمطورين وفرق DevOps للتحقق من أداء بوابة الرسائل القصيرة قبل النشر.
يوفر اختبار السرعة HTTP لخدمات REST للرسائل القصيرة حلاً قويًا وسهل الاستخدام لمعايرة أداء وموثوقية نقاط نهاية واجهة برمجة تطبيقات الرسائل القصيرة. من خلال محاكاة حركة المرور في العالم الحقيقي مع التزامن القابل للتكوين، وإنشاء رسائل عشوائية، و مقاييس أداء مفصلة، تساعد هذه الأداة المطورين وفرق ضمان الجودة في تحديد الاختناقات، والتحقق من قابلية التوسع، وتحسين استجابة واجهة برمجة التطبيقات. سواء كنت تختبر حمل نشر جديد أو تدقق بوابة رسائل قصيرة موجودة، فإن كود المصدر C# المضمن يوفر المرونة للتخصيص، بينما يوفر الملف القابل للتنفيذ المدمج رؤى سريعة وقابلة للتنفيذ. قم بتنزيل الأداة اليوم لضمان تلبية خدمة الرسائل القصيرة لتوقعات الأداء تحت الحمل — وتقديم تجربة سلسة للمستخدمين النهائيين.
More information
- اختبار أداء خادم SMPP الخاص بك
- كيفية تعيين حد للسرعة لحسابات مستخدمي SMPP
- كيفية تقييد سرعة عميل SMPP
- اختبار سرعة HTTP لخدمات الرسائل القصيرة REST
- حاسبة عرض النطاق الترددي لشبكة SMPP
- أولويات الرسائل القصيرة، خوارزمية Round Robin
- رسائل SMS عالية الحجم