আমি বি 2 সি-তে ব্যবহারকারী তৈরি করতে এমএস গ্রাফ এপিআই ব্যবহার করে প্রিম-এডি AD থেকে আজুর এডি বি 2 সি-তে কয়েক মিলিয়ন ব্যবহারকারীকে স্থানান্তরিত করছি। আমি এই মাইগ্রেশনটি সম্পাদন করতে একটি নেট নেট 3.1 কনসোল অ্যাপ্লিকেশন লিখেছি। জিনিসগুলির গতি বাড়ানোর জন্য আমি গ্রাফ API এ একযোগে কল করছি। এটি দুর্দান্ত কাজ করছে - সাজানো।
উন্নয়নের সময় আমি ভিজ্যুয়াল স্টুডিও 2019 থেকে চলাকালীন গ্রহণযোগ্য পারফরম্যান্স পেয়েছি, তবে পরীক্ষার জন্য আমি পাওয়ারশেল 7.-এর কমান্ড লাইন থেকে চালাচ্ছি Pow পাওয়ারশেল থেকে এইচটিপিপ্লিয়েন্টে সমবর্তী কলগুলির অভিনয় খুব খারাপ। দেখা যাচ্ছে যে পাওয়ারশেল থেকে চলাকালীন এইচটিটিপিকল্যান্ট অনুমতি দিচ্ছে যে সমবর্তী কলগুলির সংখ্যার একটি সীমা রয়েছে, সুতরাং 40 থেকে 50 এর বেশি অনুরোধের সমবর্তী ব্যাচে কলগুলি স্ট্যাক আপ শুরু করে। মনে হচ্ছে 40 থেকে 50 সমবর্তী অনুরোধগুলি চলছে যখন বাকী অংশগুলি অবরুদ্ধ করে।
আমি অ্যাসিঙ্ক প্রোগ্রামিংয়ে সহায়তার সন্ধান করছি না। আমি ভিজ্যুয়াল স্টুডিও রান-টাইম আচরণ এবং পাওয়ারশেল কমান্ড লাইন রান-টাইম আচরণের মধ্যে পার্থক্য চিহ্নিত করার জন্য একটি উপায় খুঁজছি। ভিজ্যুয়াল স্টুডিওর সবুজ তীর বোতাম থেকে রিলিজ মোডে চলমান প্রত্যাশার সাথে আচরণ করে। কমান্ড লাইন থেকে চালানো না।
আমি async কল সহ একটি কার্য তালিকা পূরণ করি এবং তারপরে Task.WhenAll (কার্যাদি) এর জন্য অপেক্ষা করি। প্রতিটি কল 300 থেকে 400 মিলিসেকেন্ডের মধ্যে লাগে। ভিজ্যুয়াল স্টুডিও থেকে চলার সময় এটি প্রত্যাশার মতো কাজ করে। আমি 1000 কলগুলির একযোগে ব্যাচ করি এবং প্রতিটি স্বতন্ত্রভাবে প্রত্যাশিত সময়ের মধ্যে সম্পূর্ণ হয়। পুরো টাস্ক ব্লকটি দীর্ঘতম স্বতন্ত্র কলের চেয়ে কয়েক মিলিসেকেন্ড বেশি সময় নেয়।
আমি পাওয়ারশেল কমান্ড লাইন থেকে একই বিল্ড চালানোর সময় আচরণটি পরিবর্তিত হয়। প্রথম 40 থেকে 50 টি কলগুলি প্রত্যাশিত 300 থেকে 400 মিলিসেকেন্ড নেয় তবে তারপরে পৃথক কল সময় প্রতিটি 20 সেকেন্ড পর্যন্ত বৃদ্ধি পায়। আমি কলগুলি সিরিয়ালাইজ করা হচ্ছে বলে মনে করি, তাই অন্যরা অপেক্ষা করার সময় কেবল একবারে 40 থেকে 50 টি কার্যকর করা হয়।
কয়েক ঘন্টা পরীক্ষার এবং ত্রুটির পরে আমি এটিকে এইচটিপিপ্লেইন্টে সংকুচিত করতে সক্ষম হয়েছি। সমস্যাটি বিচ্ছিন্ন করার জন্য আমি কলটি উপহাস করেছিলাম HTTPClient.SendAsync এর সাথে একটি পদ্ধতি যা টাস্ক.ডেলা (300) করে এবং একটি মক ফলাফল প্রদান করে with এই ক্ষেত্রে কনসোল থেকে চলমান ভিজ্যুয়াল স্টুডিও থেকে চলমান হিসাবে একইরকম আচরণ করে।
আমি আইএইচটিপিপ্লায়েন্টফ্যাক্টরি ব্যবহার করছি এবং আমি এমনকি সার্ভিসপয়েন্ট ম্যানেজারে সংযোগের সীমাটি সামঞ্জস্য করার চেষ্টা করেছি।
এখানে আমার নিবন্ধকরণ কোড।
public static IServiceCollection RegisterHttpClient(this IServiceCollection services, int batchSize)
{
ServicePointManager.DefaultConnectionLimit = batchSize;
ServicePointManager.MaxServicePoints = batchSize;
ServicePointManager.SetTcpKeepAlive(true, 1000, 5000);
services.AddHttpClient(MSGraphRequestManager.HttpClientName, c =>
{
c.Timeout = TimeSpan.FromSeconds(360);
c.DefaultRequestHeaders.Add("User-Agent", "xxxxxxxxxxxx");
})
.ConfigurePrimaryHttpMessageHandler(() => new DefaultHttpClientHandler(batchSize));
return services;
}
এখানে DefaultHttpClientHandler।
internal class DefaultHttpClientHandler : HttpClientHandler
{
public DefaultHttpClientHandler(int maxConnections)
{
this.MaxConnectionsPerServer = maxConnections;
this.UseProxy = false;
this.AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate;
}
}
কার্যগুলি সেট আপ করার কোডটি এখানে।
var timer = Stopwatch.StartNew();
var tasks = new Task<(UpsertUserResult, TimeSpan)>[users.Length];
for (var i = 0; i < users.Length; ++i)
{
tasks[i] = this.CreateUserAsync(users[i]);
}
var results = await Task.WhenAll(tasks);
timer.Stop();
এখানে আমি কীভাবে এইচটিটিপিপ্লায়েন্টকে উপহাস করেছি।
var httpClient = this.httpClientFactory.CreateClient(HttpClientName);
#if use_http
using var response = await httpClient.SendAsync(request);
#else
await Task.Delay(300);
var graphUser = new User { Id = "mockid" };
using var response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(JsonConvert.SerializeObject(graphUser)) };
#endif
var responseContent = await response.Content.ReadAsStringAsync();
গ্রাফপিআইয়ের মাধ্যমে 500 সমবর্তী অনুরোধগুলি ব্যবহার করে 10 কে বি 2 সি ব্যবহারকারীদের জন্য মেট্রিক রয়েছে। টিসিপি সংযোগ তৈরি হওয়ায় প্রথম 500 টি অনুরোধগুলি স্বাভাবিকের চেয়ে দীর্ঘ।
কনসোল রান মেট্রিকগুলির লিঙ্ক এখানে ।
ভিজ্যুয়াল স্টুডিও রান মেট্রিকগুলির লিঙ্ক এখানে ।
ভিএস রান মেট্রিক্সের ব্লক সময়গুলি আমি এই পোস্টে যা বলেছিলাম তার থেকে আলাদা কারণ কারণ পরীক্ষার রানগুলির জন্য যতটা সম্ভব সমস্যাযুক্ত কোডটি বিচ্ছিন্ন করার প্রয়াসে আমি সমস্ত সিঙ্ক্রোনাস ফাইল অ্যাক্সেস প্রক্রিয়াটির শেষের দিকে সরিয়ে নিয়েছি।
প্রকল্পটি নেট কোর 3.1 ব্যবহার করে সংকলিত হয়েছে। আমি ভিজ্যুয়াল স্টুডিও 2019 16.4.5 ব্যবহার করছি।