আমাদের ওয়েব অ্যাপ্লিকেশন। নেট ফ্রেমওয়ার্ক 4.0 এ চলছে। ইউআই এজ্যাক্স কলগুলির মাধ্যমে নিয়ন্ত্রণকারী পদ্ধতিগুলিকে কল করে।
আমাদের বিক্রেতার কাছ থেকে আমাদের আরএসটি পরিষেবা গ্রহণ করা দরকার। নেট নেট 4.0.০ এ REST পরিষেবা কল করার সর্বোত্তম উপায়টি আমি মূল্যায়ন করছি। আরআরএসটি পরিষেবাটির জন্য বেসিক অথেনটিকেশন স্কিম প্রয়োজন এবং এটি এক্সএমএল এবং জেএসএন উভয় ক্ষেত্রেই ডেটা ফেরত দিতে পারে। বিশাল ডেটা আপলোড / ডাউনলোড করার প্রয়োজন নেই এবং ভবিষ্যতে আমি কিছুই দেখতে পাচ্ছি না। আমি আরএসটি ব্যবহারের জন্য কয়েকটি ওপেন সোর্স কোড প্রকল্পগুলি দেখেছি এবং প্রকল্পে অতিরিক্ত নির্ভরতা সাব্যস্ত করার জন্য তাদের কোনও মান খুঁজে পাইনি। মূল্যায়ন শুরু WebClient
এবং HttpClient
। আমি নিউগেট থেকে .NET 4.0 এর জন্য এইচটিপিপিলেটটি ডাউনলোড করেছি।
আমি মধ্যে পার্থক্য অনুসন্ধান WebClient
এবং HttpClient
এবং এই সাইটের উল্লেখ করেন যে, একক HttpClient সব ব্যবস্থা করতে সক্ষম সমবর্তী কল এবং এটা ডিএনএস, কুকি কনফিগ এবং প্রমাণীকরণ সমাধান পুনরায় ব্যবহার করতে পারেন। আমি এখনও ব্যবহারিক মান দেখতে পেলাম না যা পার্থক্যের কারণে আমরা লাভ করতে পারি।
WebClient
(সিঙ্ক কলগুলি), HttpClient
(সিঙ্ক এবং অ্যাসিঙ্ক) কীভাবে সম্পাদন করে তা খুঁজে পেতে আমি একটি দ্রুত পারফরম্যান্স পরীক্ষা করেছি । এবং ফলাফল এখানে:
HttpClient
সমস্ত অনুরোধের জন্য একই উদাহরণ ব্যবহার করে (সর্বনিম্ন - সর্বোচ্চ)
ওয়েবক্লিয়েন্ট সিঙ্ক: 8 এমএস - 167
এমএসএস এইচটিপিপ্লিনেন্ট সিঙ্ক: 3 এমএস - 7228
এমএসএস এইচটিটিপি ক্লায়েন্ট অ্যাসিঙ্ক: 985 - 10405 এমএস
HttpClient
প্রতিটি অনুরোধের জন্য একটি নতুন ব্যবহার (মিনিট - সর্বাধিক)
ওয়েবক্লিয়েন্ট সিঙ্ক: 4 এমএস - 297
এমএসএস এইচটিপিপ্লিনেন্ট সিঙ্ক: 3 এমএস - 7953
এমএসএস এইচটিপিপ্লাইয়েন্ট অ্যাসিঙ্ক: 1027 - 10834 এমএস
কোড
public class AHNData
{
public int i;
public string str;
}
public class Program
{
public static HttpClient httpClient = new HttpClient();
private static readonly string _url = "http://localhost:9000/api/values/";
public static void Main(string[] args)
{
#region "Trace"
Trace.Listeners.Clear();
TextWriterTraceListener twtl = new TextWriterTraceListener(
"C:\\Temp\\REST_Test.txt");
twtl.Name = "TextLogger";
twtl.TraceOutputOptions = TraceOptions.ThreadId | TraceOptions.DateTime;
ConsoleTraceListener ctl = new ConsoleTraceListener(false);
ctl.TraceOutputOptions = TraceOptions.DateTime;
Trace.Listeners.Add(twtl);
Trace.Listeners.Add(ctl);
Trace.AutoFlush = true;
#endregion
int batchSize = 1000;
ParallelOptions parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = batchSize;
ServicePointManager.DefaultConnectionLimit = 1000000;
Parallel.For(0, batchSize, parallelOptions,
j =>
{
Stopwatch sw1 = Stopwatch.StartNew();
GetDataFromHttpClientAsync<List<AHNData>>(sw1);
});
Parallel.For(0, batchSize, parallelOptions,
j =>
{
Stopwatch sw1 = Stopwatch.StartNew();
GetDataFromHttpClientSync<List<AHNData>>(sw1);
});
Parallel.For(0, batchSize, parallelOptions,
j =>
{
using (WebClient client = new WebClient())
{
Stopwatch sw = Stopwatch.StartNew();
byte[] arr = client.DownloadData(_url);
sw.Stop();
Trace.WriteLine("WebClient Sync " + sw.ElapsedMilliseconds);
}
});
Console.Read();
}
public static T GetDataFromWebClient<T>()
{
using (var webClient = new WebClient())
{
webClient.BaseAddress = _url;
return JsonConvert.DeserializeObject<T>(
webClient.DownloadString(_url));
}
}
public static void GetDataFromHttpClientSync<T>(Stopwatch sw)
{
HttpClient httpClient = new HttpClient();
var response = httpClient.GetAsync(_url).Result;
var obj = JsonConvert.DeserializeObject<T>(
response.Content.ReadAsStringAsync().Result);
sw.Stop();
Trace.WriteLine("HttpClient Sync " + sw.ElapsedMilliseconds);
}
public static void GetDataFromHttpClientAsync<T>(Stopwatch sw)
{
HttpClient httpClient = new HttpClient();
var response = httpClient.GetAsync(_url).ContinueWith(
(a) => {
JsonConvert.DeserializeObject<T>(
a.Result.Content.ReadAsStringAsync().Result);
sw.Stop();
Trace.WriteLine("HttpClient Async " + sw.ElapsedMilliseconds);
}, TaskContinuationOptions.None);
}
}
}
আমার প্রশ্নগুলো
- আরআরএসটি কলগুলি 3-4- তে ফিরে আসে যা গ্রহণযোগ্য। আরএসএসটি পরিষেবার জন্য কলগুলি নিয়ামক পদ্ধতিতে শুরু করা হয় যা এজ্যাক্স কল থেকে শুরু হয়। শুরুতে, কলগুলি আলাদা থ্রেডে চলে এবং ইউআইকে অবরুদ্ধ করে না। সুতরাং, আমি কি কেবল সিঙ্ক কলগুলি দিয়ে আটকাতে পারি?
- উপরের কোডটি আমার লোকালবক্সে চালিত হয়েছিল। প্রোড সেটআপে, ডিএনএস এবং প্রক্সি লুকআপ জড়িত থাকবে।
HttpClient
ওভার ব্যবহারের কোনও সুবিধা আছেWebClient
? HttpClient
সম্মতি কি এর চেয়ে ভালWebClient
? পরীক্ষার ফলাফল থেকে, আমিWebClient
সিঙ্ক কলগুলি আরও ভাল সম্পাদন করতে দেখছি ।- হবে
HttpClient
আরো ভালো নকশা পছন্দ যদি আমরা নেট 4.5 এ আপগ্রেড হবে? পারফরম্যান্স মূল নকশা ফ্যাক্টর।
GetDataFromHttpClientAsync
এটি প্রথমে চালিত হওয়ার পক্ষে অন্যায় , অন্য আহ্বানগুলি সম্ভাব্যভাবে ক্যাশেড ডেটা (স্থানীয় মেশিনে বা আপনার এবং গন্তব্যের মধ্যে কোনও স্বচ্ছ প্রক্সিতে থাকায়) লাভ করে এবং এটি আরও দ্রুত হবে। এছাড়াও, সঠিক অবস্থার অধীনেvar response = httpClient.GetAsync("http://localhost:9000/api/values/").Result;
থ্রেডপুলের থ্রেডগুলি ক্লান্ত করার কারণে আপনার অচলাবস্থার সৃষ্টি হতে পারে। থ্রেডপুল থ্রেডগুলিতে থ্রেড পুলের উপর নির্ভর করে এমন কোনও ক্রিয়াকলাপ আপনার কখনও আটকানো উচিত নয়,await
পরিবর্তে এটি থ্রেডটি পুলটিতে ফিরিয়ে দেয় should