Runtime: Singleton HttpClient๋Š” DNS ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์กด์ค‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 08์›” 29์ผ  ยท  77์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dotnet/runtime

๋‹ค์Œ ๊ฒŒ์‹œ๋ฌผ์— ์„ค๋ช…๋œ ๋Œ€๋กœ: http://byterot.blogspot.co.uk/2016/07/singleton-httpclient-dns.html , ์ผ๋‹จ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๊ณต์œ  HttpClient ์ธ์Šคํ„ด์Šค๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด, ์žฅ์•  ์กฐ์น˜ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๊ฐ€ DNS ๋ ˆ์ฝ”๋“œ ์—…๋ฐ์ดํŠธ๋ฅผ ์กด์ค‘ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋Š” ConnectionLeaseTimeout ์˜ ๊ธฐ๋ณธ๊ฐ’์ด -1 ๋ฌดํ•œ๋Œ€๋กœ ์„ค์ •๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๋งŒ ๋‹ซํžˆ๋ฏ€๋กœ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

์ˆ˜์ • ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„œ๋น„์Šค ์ง€์ ์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

var sp = ServicePointManager.FindServicePoint(new Uri("http://foo.bar/baz/123?a=ab"));
sp.ConnectionLeaseTimeout = 60*1000; // 1 minute

๋ถˆํ–‰ํžˆ๋„ ํ˜„์žฌ๋Š” .NET Core๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

ServicePointManager๋ฅผ .NET Core๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•˜๊ฑฐ๋‚˜ ์ด์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

area-System.Net.Http enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. @darrelmiller๊ฐ€ ์ œ์•ˆํ•œ ์†”๋ฃจ์…˜์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

Azure Traffic Manager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค์˜ ์ƒํƒœ๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์งง์€ TTL๋กœ DNS ์œ„์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ๋Š” ์ž์‹ ์ด ๋น„์ •์ƒ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ๋งˆ์ˆ ์ฒ˜๋Ÿผ ์•Œ์ง€ ๋ชปํ•˜๊ณ  C ์—ฐ๊ฒฐ : ๋‹ซ๊ธฐ ํ—ค๋”๋ฅผ ๋ฐœํ–‰ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ์ž๋Š” ๋น„์ •์ƒ ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ DNS ํ™•์ธ์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ค๊ณ„์ƒ ์ด๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ์™€ ํ˜ธ์ŠคํŠธ์— ์™„์ „ํžˆ ํˆฌ๋ช…ํ•ฉ๋‹ˆ๋‹ค... ๊ทธ๋Œ€๋กœ ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ์ž๊ฐ€ DNS๋ฅผ ํ™•์ธํ•˜๋Š” ์ •์  HttpClient(๋ฌด์˜์‹์ ์œผ๋กœ)๊ฐ€ ์žˆ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ด์ „์— ํ™•์ธ๋œ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋น„์ •์ƒ ์ƒํƒœ๊ฐ€ ๋  ๋•Œ ์ƒˆ ํ˜ธ์ŠคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

netcore 1.1 ํ˜„์žฌ ์ด ์ •ํ™•ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋‚˜๋Š” ํƒ€๊ณ ๋‚œ ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ•œ๋‹ค.

๋ชจ๋“  77 ๋Œ“๊ธ€

๊ธฐ๋ณธ๊ฐ’์€ 60์ดˆ์ด๋ฉฐ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/dotnet/corefx/blob/d0dc5fc099946adc1035b34a8b1f6042eddb0c75/src/System.Net.Http.WinHttpHandler/src/System/Net/Http/WinHttpHandler.cs#L76

๊ฐ™์€ ์†์„ฑ์ด ์•„๋‹Œ๊ฐ€ ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ConnectionLeaseTimeout์ด ์•„๋‹ˆ๋ผ ์—ฐ๊ฒฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ์ž…๋‹ˆ๋‹ค.

https://msdn.microsoft.com/en-us/library/system.net.servicepoint.connectionleasetimeout.aspx ์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ .NET Core์—์„œ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ„๋ช…ํ•œ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

@onovotny ์˜ˆ, ๋ช…์‹œ์  ์—ฐ๊ฒฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ด์ƒํ•œ ์ผ์ž…๋‹ˆ๋‹ค. ํŠน์ • ์‹œ๊ฐ„ ํ”„๋ ˆ์ž„ ํ›„์— ๋‹ซ์Šต๋‹ˆ๋‹ค . ์ •๋ง ์›ํ•œ๋‹ค๋ฉด ๋ฏธ๋“ค์›จ์–ด๋กœ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ HTTP ํ—ค๋”์ž…๋‹ˆ๋‹ค.

@darrelmiller ๊ทธ๋ž˜์„œ ์ œ ์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ... ์›๋ž˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์„œํ™”๋œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ํฐ ์ด์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@onovotny , .NET Core์—๋Š” ServicePointManager ํด๋ž˜์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ .NET Framework(๋ฐ์Šคํฌํƒ‘) ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. UserVoice ๋˜๋Š” Connect์—์„œ ๋ฌธ์ œ๋ฅผ ์—ฌ์‹ญ์‹œ์˜ค.

@onovotny ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ์›๋ž˜ ๋ฌธ์ œ๋Š” ์„œ๋ฒ„ ์ธก์—์„œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ DNS ํ•ญ๋ชฉ์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ํ˜ธ์ŠคํŠธ A์— ๋Œ€ํ•œ ๋ชจ๋“  ํ–ฅํ›„ ์š”์ฒญ์ด ์ƒˆ IP ์ฃผ์†Œ๋กœ ์ด๋™ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— ๊ฐ€์žฅ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ DNS ํ•ญ๋ชฉ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ํ˜ธ์ŠคํŠธ A์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ํ–ฅํ›„ ๋ชจ๋“  ์‘๋‹ต์—์„œ ํด๋ผ์ด์–ธํŠธ์— C ์—ฐ๊ฒฐ : ๋‹ซ๊ธฐ ํ—ค๋”๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ง€์‹œํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ์„ ๋Š๊ณ  ์ƒˆ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๊ฐ’์„ ๊ฐ–์ง€ ์•Š๋„๋ก ํ•˜์—ฌ ํ•ด๋‹น "์ž„๋Œ€" ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋งŒ๋ฃŒ๋  ๋•Œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ : ๋‹ซ๊ธฐ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. @darrelmiller๊ฐ€ ์ œ์•ˆํ•œ ์†”๋ฃจ์…˜์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

Azure Traffic Manager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค์˜ ์ƒํƒœ๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์งง์€ TTL๋กœ DNS ์œ„์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ๋Š” ์ž์‹ ์ด ๋น„์ •์ƒ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ๋งˆ์ˆ ์ฒ˜๋Ÿผ ์•Œ์ง€ ๋ชปํ•˜๊ณ  C ์—ฐ๊ฒฐ : ๋‹ซ๊ธฐ ํ—ค๋”๋ฅผ ๋ฐœํ–‰ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ์ž๋Š” ๋น„์ •์ƒ ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ DNS ํ™•์ธ์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ค๊ณ„์ƒ ์ด๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ์™€ ํ˜ธ์ŠคํŠธ์— ์™„์ „ํžˆ ํˆฌ๋ช…ํ•ฉ๋‹ˆ๋‹ค... ๊ทธ๋Œ€๋กœ ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ์ž๊ฐ€ DNS๋ฅผ ํ™•์ธํ•˜๋Š” ์ •์  HttpClient(๋ฌด์˜์‹์ ์œผ๋กœ)๊ฐ€ ์žˆ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ด์ „์— ํ™•์ธ๋œ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋น„์ •์ƒ ์ƒํƒœ๊ฐ€ ๋  ๋•Œ ์ƒˆ ํ˜ธ์ŠคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

netcore 1.1 ํ˜„์žฌ ์ด ์ •ํ™•ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋‚˜๋Š” ํƒ€๊ณ ๋‚œ ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ•œ๋‹ค.

@kudoz83 ๋งž์Šต๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ๋Š” ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ์ž๊ฐ€ DNS ํ™•์ธ์„ ์กฐ์ •ํ•œ ๋•Œ๋ฅผ ๋งˆ์ˆ ์ฒ˜๋Ÿผ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ๋งํ•œ ์ด์œ ๋Š”

ํ•ด๋‹น DNS ํ•ญ๋ชฉ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ˜ธ์ŠคํŠธ A์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์•Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ : ๋‹ซ๊ธฐ ํ—ค๋”๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์›๋ณธ ์„œ๋ฒ„์— ์•Œ๋ฆฌ๋Š” ๊ฒƒ์ด ์‹ค์šฉ์ ์ด์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ์„ ํƒ๋งŒ ๋‚จ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ์ฃผ๊ธฐ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ๋˜๋Š” ๋ฏธ๋“ค์›จ์–ด์™€์˜ ์—ฐ๊ฒฐ์„ ๋‹ซ๊ณ  ํ•ด๋‹น ์—ฐ๊ฒฐ์„ ๋‹ค์‹œ ์—ฌ๋Š” ๋น„์šฉ์„ ์ค‘๋ณต ์ง€๋ถˆํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋น„์Šค๋ฅผ ํด๋งํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์žฌ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ์‹œ๊ธฐ๋ฅผ ์•Œ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • DNS๊ฐ€ ์–ธ์ œ ์ „ํ™˜๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์„ ๋งŒํผ ๋˜‘๋˜‘ํ•œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜์— ๊ด€ํ•ด์„œ๋Š” ์œ ์Šค ์ผ€์ด์Šค๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์›๋ž˜ ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ”„๋กœ๋•์…˜ ๋ฐ ์Šคํ…Œ์ด์ง• ์Šฌ๋กฏ ๊ฐ„ ์ „ํ™˜๊ณผ ๊ด€๋ จ๋˜๊ณ  ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ์•„๋ฌด ๊ด€๋ จ์ด ์—†๋Š” ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ชจ๋‘ DNS/์Šฌ๋กฏ ์Šค์œ„์น˜ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

AFAIK ์‹คํŒจํ•œ ํ˜ธ์ŠคํŠธ์— ์‹คํŒจํ–ˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๊นŒ? ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์€ ์ผ์ข…์˜ ์˜ค๋ฅ˜ ์ƒํƒœ์— ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ์€ ์žฅ์•  ์กฐ์น˜ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Azure Traffic Manager๋Š” https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-monitoring์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

DNS ์ˆ˜์ค€์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ์™€ ํ˜ธ์ŠคํŠธ์— ํˆฌ๋ช…ํ•ฉ๋‹ˆ๋‹ค. DNS ํ™•์ธ์„ ์œ„ํ•ด Traffic Manager๋ฅผ ํ†ตํ•ด ์„œ๋กœ ํ†ต์‹ ํ•˜๋Š” Azure ์ธ์Šคํ„ด์Šค๋Š” HttpClient์— ๋Œ€ํ•œ DNS ์ƒˆ๋กœ ๊ณ ์นจ์—์„œ TTL์„ ์„ค์ •ํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ์—์„œ ํ”ผํด ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

HttpClient๊ฐ€ ํ˜„์žฌ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์€ Microsoft์˜ ์ž์ฒด Azure ์„œ๋น„์Šค ์ œ๊ณต๊ณผ ๋ชจ์ˆœ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์š”์ ์ž…๋‹ˆ๋‹ค. ๋งํ•  ๊ฒƒ๋„ ์—†์ด, ์œ ์‚ฌํ•œ ์„œ๋น„์Šค(์˜ˆ: Amazon Route 53)๋Š” ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์งง์€ DNS TTL ์ข…์†์„ฑ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ์ด ๋ฌธ์ œ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ˆœํžˆ DNS ์žฅ์•  ์กฐ์น˜(failover)๊ฐ€ ์„ฑ๊ณตํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด (์„ฑ๋Šฅ๊ณผ ๋ณต์žก์„ฑ์„ ํฌ์ƒํ•˜๋ฉด์„œ) HttpClients๋ฅผ ์ž„์˜๋กœ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๊ฒƒ ์™ธ์—๋Š” ํ˜„์žฌ๋กœ์„œ๋Š” ์ด์ƒ์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

AFAIK ์‹คํŒจํ•œ ํ˜ธ์ŠคํŠธ์— ์‹คํŒจํ–ˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๊นŒ?

"์‹คํŒจํ•œ" ํ˜ธ์ŠคํŠธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์›๋ณธ ์„œ๋ฒ„๊ฐ€ ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— HTTP ์ƒํƒœ ์ฝ”๋“œ 503์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•Œ๋ฆผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ํ™œ์„ฑ TCP/IP ์—ฐ๊ฒฐ์„ ์˜ค๋žซ๋™์•ˆ ์—ด์–ด ๋‘์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Ali๊ฐ€ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ์›๋ž˜ Twitter์—์„œ ์ด ์ฃผ์ œ๋ฅผ ์ œ๊ธฐํ–ˆ์„ ๋•Œ ๊ทธ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ณ„์†ํ•ด์„œ ์š”์ฒญํ•˜๊ณ  ๊ต์ฒด๋œ ์„œ๋ฒ„์—์„œ ์‘๋‹ต์„ ๋ฐ›์„ ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์— ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์ƒํ™ฉ์ด ๋‹ค๋ฅด๋ฉฐ ์—ฐ๊ฒฐ์„ ์•ˆ์ •์ ์œผ๋กœ ๋‹ซ์„ ์ˆ˜ ์žˆ๋Š” ์›๋ณธ ์„œ๋ฒ„์— ์˜์กดํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ๊ท€ํ•˜์˜ ์ƒํ™ฉ์— ๋Œ€ํ•ด HttpMessageHandler๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 5XX ์‘๋‹ต์„ ๊ฐ์ง€ํ•˜๊ณ  ์—ฐ๊ฒฐ์„ ๋‹ซ๊ณ  ์š”์ฒญ์„ ๋‹ค์‹œ ์‹œ๋„ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์›น ์„œ๋ฒ„๊ฐ€ 5XX ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งˆ๋‹ค ์—ฐ๊ฒฐ : ๋‹ซ๊ธฐ ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์œ ๋„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ด€์‹ฌ ์žˆ๋Š” ๋™์ž‘์ด HttpClient์— ์—†๋‹ค๋Š” ์ ๋„ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ HttpHandler ๋˜๋Š” ๊ทธ ์•„๋ž˜์— ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ ์ค‘์ธ HttpHandler์˜ ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ํ˜„์žฌ ๋™์ž‘์ด HTTP๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋œ ๋ฐฉ์‹๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์ด ์—ด๋ ค ์žˆ๋Š” ๋™์•ˆ DNS ์„ค์ •์ด ์—…๋ฐ์ดํŠธ๋  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ .net ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ HTTP ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ .net์ด ๋ฌธ์ œ๋ฅผ ๋œ ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์ด ๋ฌด์—‡์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์žฅ์•  ์กฐ์น˜ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์—ฐ๊ฒฐ์„ ๋Š๋Š” ConnectionLeaseTimeout๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค,

๋‚˜๋Š” ์–ด์ œ ๋งํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์ „ํˆฌ์ ์œผ๋กœ ๋‚˜์˜ค์ง€ ๋ง์•˜์–ด์•ผ ํ–ˆ๋‹ค. ๋‚˜์œ ํ•˜๋ฃจ๋ฅผ ๋ณด๋‚ด๊ณ  ์žˆ์—ˆ๋‹ค.

์†”์งํžˆ ConnectionLeaseTimeout์ด ๋ฎ๊ฐœ ์•„๋ž˜์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ญ์ œ๋  ๋•Œ๊นŒ์ง€ ์ด์ „ DNS ์กฐํšŒ๋ฅผ ์บ์‹ฑํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋Œ€์กฐ์ ์œผ๋กœ ์ƒˆ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ธฐ ์ „์— ์ƒˆ DNS ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก HttpClient๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ธฐ์กด ์—ฐ๊ฒฐ์„ ์ฃฝ์—ฌ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ...

@kudoz83 ๊ฑฑ์ •๋งˆ ์šฐ๋ฆฌ ๋ชจ๋‘ ๊ทธ๋Ÿฐ ๋‚ ์ด ์žˆ์–ด :-)

๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ConnectionLeaseTimeout์€ ๋ง ๊ทธ๋Œ€๋กœ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์œ ํœด ์—ฐ๊ฒฐ์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋‹ซ๋Š” ํƒ€์ด๋จธ์ž…๋‹ˆ๋‹ค. ์ฝ”์–ด์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ServicePointManager์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์—ฐ๊ฒฐ์„ ๋‹ซ๋Š” "์œ ํœด ์—ฐ๊ฒฐ" ์‹œ๊ฐ„ ์ดˆ๊ณผ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

DNS ํด๋ผ์ด์–ธํŠธ ์บ์‹œ ํ”Œ๋Ÿฌ์‹œ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” Win32 ํ˜ธ์ถœ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ƒˆ ์—ฐ๊ฒฐ์ด DNS ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธ‰ํ•˜๊ฒŒ ์ฐพ์•„๋ดค๋Š”๋ฐ ๋ชป์ฐพ์•˜๋Š”๋ฐ ๋ถ„๋ช… ์–ด๋”˜๊ฐ€์— ์žˆ์„๊ฑฐ์—์š”.

Windows์˜ .net core์—์„œ HTTP ์—ฐ๊ฒฐ ๊ด€๋ฆฌ๋Š” ์‹ค์ œ๋กœ OS์— ๋งก๊ฒจ์ง‘๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ์€ Win32 API WinHttpOpen https://github.com/dotnet/corefx/blob/master/src/System.Net.Http.WinHttpHandler/src/System/Net/Http/WinHttpHandler.cs#์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค.

DNS ํ•ญ๋ชฉ์— ๋งค์šฐ ๋‚ฎ์€ TTL์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด Azure Traffic Manager๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์ง€ ์•Š์„๊นŒ์š”? ์˜ค๋ž˜ ์ง€์†๋˜๋Š” ์—ฐ๊ฒฐ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‚ฎ์€ TTL์€ ์ฃฝ์€ ์„œ๋ฒ„์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์ด ์„ค์ •๋  ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

WinHttpHandler๊ฐ€ ๊ตฌ์ถ•๋˜๋Š” ๋ฐฉ์‹์˜ ์žฅ์ ์€ OS ์—…๋ฐ์ดํŠธ๋กœ HTTP/2์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋ฌด๋ฃŒ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ ์€ ๊ด€๋ฆฌ ์ฝ”๋“œ์—์„œ ๋งŽ์€ ์ œ์–ด ๊ถŒํ•œ์„ ์–ป์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@darrelmiller

[ConnectionLeaseTimeout]์€ Core์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ServicePointManager์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

ServicePoint.ConnectionLeaseTimeout ๊ฐ€ .Net Standard 2.0/.Net Core 1.2์—์„œ ๋‹ค์‹œ ๋‚˜์˜ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด WinHttpHandler ์—ฐ๊ฒฐ์ด ์ด๋ฅผ ์ค€์ˆ˜ํ• ์ง€ ์—ฌ๋ถ€๋Š” ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.)

์—ฌ๊ธฐ์— ์•ฝ๊ฐ„์˜ ์˜คํ•ด๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. DNS TTL์€ HTTP/TCP ์—ฐ๊ฒฐ ์ˆ˜๋ช…๊ณผ ์™„์ „ํžˆ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ƒˆ HTTP ์—ฐ๊ฒฐ์€ DNS ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐ˜ํ™˜๋œ ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋‹จ์ผ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ HTTP ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋‹จ HTTP ์—ฐ๊ฒฐ(๋ฐ ๊ธฐ๋ณธ TCP ์—ฐ๊ฒฐ)์ด ์—ด๋ฆฌ๋ฉด DNS ์กฐํšŒ๋ฅผ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์ด๋ฏ€๋กœ ๋ฉฐ์น  ๋™์•ˆ ์ง€์†๋˜๋Š” ์—ฐ๊ฒฐ์„ ํ†ตํ•ด 1000๋ฒˆ์˜ ์š”์ฒญ์„ ํ•˜๋”๋ผ๋„ ์—ฐ๊ฒฐ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— DNS ํ™•์ธ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ HTTP ์—ฐ๊ฒฐ ์„ ์„ ํ•˜๋ฉด ์ƒˆ ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ DNS ์กฐํšŒ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ด DNS ์ƒˆ๋กœ ๊ณ ์นจ์€ HttpClient ์™€ ์•„๋ฌด ๊ด€๋ จ์ด ์—†์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ HttpClientHandler ์‚ฌ์šฉํ•˜๊ณ (์ž์ฒด์ ์œผ๋กœ HttpWebRequest ์†Œ์ผ“ ์Šคํƒ์„ ์‚ฌ์šฉํ•จ) ๋ชจ๋“  DNS ํ™•์ธ์€ ํ•ด๋‹น ์Šคํƒ์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ServicePointManager ๋Š” ํŠน์ • ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์ธ ํ•ด๋‹น ์Šคํƒ์˜ ServicePoint ๊ฐœ์ฒด๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ServicePointManager ์—๋Š” ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” DNS ์กฐํšŒ์˜ ์ตœ์†Œ ํด๋ผ์ด์–ธํŠธ ์ธก ์บ์‹ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์„ค์ •์€ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ์—ฐ๊ฒฐ์ด ๋ฌด๊ธฐํ•œ ์—ด๋ ค ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฉด ์—ฐ๊ฒฐ์ด ์ž๋™์œผ๋กœ ๋Š์–ด์ ธ ์ƒˆ DNS ์กฐํšŒ๋กœ ์ƒˆ ์—ฐ๊ฒฐ์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ DNS TTL์€ ์ƒˆ ์—ฐ๊ฒฐ์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์•ฑ์— ์ฝ”๋”ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ DNS ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ์—์„œ ์—ฐ๊ฒฐ์„ ์žฌ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. TCP ์—ฐ๊ฒฐ์˜ ์ตœ๋Œ€ ์ˆ˜๋ช…์„ ๊ฐ•์ œํ•˜๊ฑฐ๋‚˜ connection: close ํ—ค๋”๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜ HttpClient ๋˜๋Š” ๊ธฐ๋ณธ ServicePoint ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Dns.GetHostAddresses DNS ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  HTTP ์š”์ฒญ ๋Œ€์‹  IP ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด ์ž‘์—…์ด ์ค‘๋‹จ๋˜๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

@๋งค๋‹ˆ๊ฑด๋‹ด

์—ฌ๊ธฐ์— ์•ฝ๊ฐ„์˜ ์˜คํ•ด๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. DNS TTL์€ HTTP/TCP ์—ฐ๊ฒฐ ์ˆ˜๋ช…๊ณผ ์™„์ „ํžˆ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ, DNS TTL์€ ์ƒ๋‹นํžˆ ๊ด€๋ จ์ด ์—†์ง€๋งŒ ์™„์ „ํžˆ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์ƒˆ HTTP ์—ฐ๊ฒฐ์€ DNS ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐ˜ํ™˜๋œ ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Windows์—๋Š” TTL์„ ์กด์ค‘ํ•˜๋Š” ๋กœ์ปฌ DNS ์บ์‹œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. TTL์ด ๋†’๊ณ  DNS ์„œ๋ฒ„๊ฐ€ DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•œ ๊ฒฝ์šฐ DNS ๋ ˆ์ฝ”๋“œ์˜ ํด๋ผ์ด์–ธํŠธ ์บ์‹ฑ์œผ๋กœ ์ธํ•ด ์ด์ „ IP ์ฃผ์†Œ์— ๋Œ€ํ•ด ์ƒˆ ์—ฐ๊ฒฐ์ด ์—ด๋ฆฝ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์œ ์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ํด๋ผ์ด์–ธํŠธ DNS ์บ์‹œ๋ฅผ ํ”Œ๋Ÿฌ์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋‹จ์ผ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ HTTP ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋‹จ HTTP ์—ฐ๊ฒฐ(๋ฐ ๊ธฐ๋ณธ TCP ์—ฐ๊ฒฐ)์ด ์—ด๋ฆฌ๋ฉด DNS ์กฐํšŒ๋ฅผ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ต์ฒด๋œ ์„œ๋ฒ„๊ฐ€ ์—ฌ์ „ํžˆ ์‘๋‹ตํ•˜๋Š” ํ”„๋กœ๋•์…˜/์Šคํ…Œ์ด์ง• ์Šค์™‘์—์„œ ์ด๋กœ ์ธํ•ด ๋งŽ์€ ํ–ฅํ›„ ์š”์ฒญ์ด ์ด์ „ ์„œ๋ฒ„๋กœ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉฐ ์ด๋Š” ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ๋Œ€ํ™”๋Š” ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  Traffic Manager๊ฐ€ ์ƒˆ ์„œ๋ฒ„๋กœ ๊ต์ฒด๋˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ์„œ๋ฒ„์— ๋Œ€ํ•œ ๊ธฐ์กด ์—ฐ๊ฒฐ์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‹ฌ๊ฐํ•œ ํ•˜๋“œ์›จ์–ด ์˜ค๋ฅ˜์ธ ๊ฒฝ์šฐ ์—ฐ๊ฒฐ์ด ๋Š์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ์„ ๋‹ค์‹œ ์„ค์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋‚ฎ์€ TTL์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„œ๋ฒ„ ์˜ค๋ฅ˜๊ฐ€ ์„œ๋ฒ„๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ 5XX ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ : ๋‹ซ๊ธฐ ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ํ–ฅํ›„ ์š”์ฒญ์ด ์ƒˆ ์—ฐ๊ฒฐ์—์„œ ์ด๋ฃจ์–ด์ง€๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

์ด DNS ์ƒˆ๋กœ ๊ณ ์นจ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ HttpClientHandler๋ฅผ ์‚ฌ์šฉํ•˜๋Š” HttpClient์™€ ์•„๋ฌด ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค(์ž์ฒด์ ์œผ๋กœ HttpWebRequest ์†Œ์ผ“ ์Šคํƒ์„ ์‚ฌ์šฉํ•จ).

์˜ˆ ๋ฐ ์•„๋‹ˆ์˜ค. .Net ์ฝ”์–ด์—์„œ HttpClientHandler๊ฐ€ ๋‹ค์‹œ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ๋” ์ด์ƒ HttpWebRequest๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ServicePointManager๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ์ด ๋ฌธ์ œ์˜ ์ด์œ .

IIS๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์•˜๊ณ  ์—ฐ๊ฒฐ : ๋‹ซ๊ธฐ ํ—ค๋”์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” 5XX ์‘๋‹ต์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒƒ

์ฐธ๊ณ ๋กœ ์ด ๋ฌธ์ œ์™€ ์ž„์‹œ ์†”๋ฃจ์…˜์„ ๋‹ค๋ฃจ๋Š” ๊ด€๋ จ ๊ฒŒ์‹œ๋ฌผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. HttpClient๋ฅผ ์กฐ์‹ฌํ•˜์‹ญ์‹œ์˜ค

ServicePointManager ์ค‘ ํ•˜๋‚˜๋ฅผ .NET Core๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ ํŒจ๋ฆฌํ‹ฐ๋ฅผ ์œ„ํ•ด ServicePointManager ๋ฐ HttpWebRequest๋ฅผ ๊ฐ€์ ธ์™”์ง€๋งŒ ๊ธฐ๋ณธ ์Šคํƒ์ด ๊ณ ๊ธ‰ ์ œ์–ด ๋…ธ๋ธŒ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š” WinHTTP ๋˜๋Š” Curl๋กœ ํ•ด์„๋˜๊ธฐ ๋•Œ๋ฌธ์— .Net Core์˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ServicePointManager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HttpClient๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ์€ ์‹ค์ œ๋กœ .Net Framework์—์„œ HttpWebRequest ๋ฐ ๊ด€๋ฆฌ๋˜๋Š” HTTP ์Šคํƒ์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋ถ€์ž‘์šฉ์ž…๋‹ˆ๋‹ค. WinHttpHandler/CurlHandler๋Š” .Net Core์—์„œ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— SPM์€ HttpClient ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ WinHTTP ํŒ€์˜ ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค.

  1. ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ณ„์† ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  _ํ™œ์„ฑ ์—ฐ๊ฒฐ์ด ์žˆ๋Š”_ ๋™์•ˆ WinHTTP๋Š” ๊ณ„์† ๋Œ€์ƒ IP๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์—ฐ๊ฒฐ์ด ํ™œ์„ฑ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋Š” ์‹œ๊ฐ„์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.
  2. ์›๊ฒฉ ๋์ ์— ๋Œ€ํ•œ ๋ชจ๋“  ์—ฐ๊ฒฐ์ด ์„œ๋ฒ„์— ์˜ํ•ด ๋‹ซํžˆ๋ฉด _new_ ์—ฐ๊ฒฐ์ด DNS๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ ์ƒˆ IP๋ฅผ ํ–ฅํ•ด ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋‹ค์Œ IP๋กœ ๊ฐ•์ œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์œ ์ผํ•œ ์†”๋ฃจ์…˜์€ ์„œ๋ฒ„๊ฐ€ ์ƒˆ ์—ฐ๊ฒฐ์„ ๊ฑฐ๋ถ€ํ•˜๊ณ  ๊ธฐ์กด ์—ฐ๊ฒฐ์„ ๋‹ซ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด ์Šค๋ ˆ๋“œ์—์„œ ์ด๋ฏธ ์–ธ๊ธ‰๋จ).
์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ATM ๋ฌธ์„œ ์—์„œ ์ดํ•ดํ•œ ๊ฒƒ๊ณผ ๋™์ผ

์ž์ฒด์ ์œผ๋กœ DNS๋ฅผ ์บ์‹ฑํ•˜๋Š” ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ์–ดํ”Œ๋ผ์ด์–ธ์Šค ์žฅ์น˜(์˜ˆ: ํ™ˆ ๋ผ์šฐํ„ฐ/AP)๋ฅผ ๊ณ ๋ คํ•  ๋•Œ ๋‚ฎ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„, ๊ณ ๊ฐ€์šฉ์„ฑ ๊ธฐ์ˆ ์„ ์œ„ํ•œ ์†”๋ฃจ์…˜์œผ๋กœ DNS ์žฅ์•  ์กฐ์น˜๋ฅผ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ œ์–ด๋œ ์žฅ์•  ์กฐ์น˜์— ๋Œ€ํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์€ ์ ์ ˆํ•˜๊ฒŒ ๋ฐฐ์ˆ˜ ์ค‘์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋Š” ์ „์šฉ LB(ํ•˜๋“œ์›จ์–ด ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Œ€๋กœ, ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ์ž์— ์˜ํ•ด (๋ฌด์˜์‹์ ์œผ๋กœ) DNS๋ฅผ ํ™•์ธํ•˜๋Š” ์ •์  HttpClient๊ฐ€ ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด์ „์— ํ™•์ธ๋œ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋น„์ •์ƒ ์ƒํƒœ๊ฐ€ ๋  ๋•Œ ์ƒˆ ํ˜ธ์ŠคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋น„์ •์ƒ์ด๋ž€ DNS TTL์ด ๋งŒ๋ฃŒ๋œ ๊ฒƒ์„ ๊ด€์ฐฐํ•˜๋Š” ๋™์•ˆ ์„œ๋ฒ„๊ฐ€ HTTP ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  TCP ์—ฐ๊ฒฐ์„ ๋‹ซ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค.

  1. ์žฅ์•  ์กฐ์น˜ ์ค‘ ํด๋ผ์ด์–ธํŠธ ์‹œ์Šคํ…œ์˜ DNS ์บ์‹œ ๋ฐ TTL์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ipconfig /showdns ๋ฐ nslookup -type=soa <domain_name> ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๊ณ„๊ฐ€ ์ƒ๊ฐํ•˜๋Š” TTL๊ณผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” NS์˜ TTL์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์›๊ฒฉ ์„œ๋ฒ„์— ๋Œ€ํ•œ ํ™œ์„ฑ ์—ฐ๊ฒฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ? netstat /a /n /b ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ ๋ฐ ์ด๋ฅผ ์†Œ์œ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์žฌํ˜„์„ ์ƒ์„ฑํ•˜๋ฉด ๋งŽ์€ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. .Net Core/Framework ๋ฒ„์ „, ํด๋ผ์ด์–ธํŠธ/์„œ๋ฒ„์šฉ ์ฝ”๋“œ, ๋„คํŠธ์›Œํฌ ์ถ”์ , ์›๊ฒฉ DNS LB/ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ์ž ๊ด€๋ จ ๋“ฑ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ •๋ณด๋ฅผ ์ฒจ๋ถ€ํ•˜์‹ญ์‹œ์˜ค.

์ปดํ“จํ„ฐ์— ์—ฐ๊ฒฐํ•˜๊ณ  TCP/HTTP ์—ฐ๊ฒฐ์ด ๊ณ„์† ์ž‘๋™ํ•œ๋‹ค๋ฉด ์™œ ์–ด๋Š ์‹œ์ ์—์„œ ์„œ๋ฒ„๊ฐ€ ๋” ์ด์ƒ ์ ์ ˆํ•˜์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Azure ์ธก๋ฉด์—์„œ ๊ฐœ์„ ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ์Šคํ…œ์ด ๋น„์ •์ƒ์ ์ด๊ฑฐ๋‚˜ ํ™˜๊ฒฝ์„ ์Šค์™€ํ•‘ํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ์กด ์—ฐ๊ฒฐ์„ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ๊ทธ๋ƒฅ ... ๊ธฐ๋ณธ ServicePoint ์ฒ˜๋ถ„ํ•˜์‹ญ์‹œ์˜ค.

@manigandham ์–ด๋–ป๊ฒŒ? ๊ทธ๊ฒƒ์€ ์ผํšŒ์šฉ์ด ์•„๋‹ˆ๋ฉฐ ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๊ด€๋ จ ๋ฐฉ๋ฒ•์€ ๊ทธ๋ฃน ์ด๋ฆ„์ด ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ (ํ˜„์žฌ ์ฒ˜๋ฆฌ๊ธฐ์˜ ์ผ๋ถ€ ํ•ด์‹œ)์ด๋ฏ€๋กœ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” CloseConnectionGroup ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ HttpClient ์—์„œ ServicePoint๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ(ํŠนํžˆ ๋™์‹œ์—) ServicePoint๋ฅผ ํ๊ธฐํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@ohadschn

.NET Core 2.0์€ ServicePoint ํด๋ž˜์Šค ๋ฐ ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepoint?view=netcore-2.0

์—ฐ๊ฒฐ ์ž„๋Œ€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ์„ค์ •ํ•˜๊ธฐ ์ „์— ํ™œ์„ฑ ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ์ตœ๋Œ€ ์‹œ๊ฐ„ ํ”„๋ ˆ์ž„์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HttpClient ์š”์ฒญ์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ์—ฐ๊ฒฐ์„ ๋‹ซ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด์ƒํ•œ ์ ์€ ์—†์œผ๋ฉฐ ์ธํ„ฐ๋„ท์„ ํƒ์ƒ‰ํ•  ๋•Œ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์ด ์ ˆ๋Œ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ฑฐ๋‚˜ ์š”์ฒญ์ด ์ด๋ฃจ์–ด์ง€๊ณ  ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค http ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•˜๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ ์ž„๋Œ€ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ฉด ์š”์ฒญ์ด ์ „์†ก๋œ ํ›„์—๋งŒ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹œ๊ฐ„ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๋Š” ๋‹ค์Œ ์š”์ฒญ ์ „์— ์žฌ์„ค์ •ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.NET Core 2.0์€ ServicePoint ํด๋ž˜์Šค ๋ฐ ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepoint?view=netcore-2.0
์—ฐ๊ฒฐ ์ž„๋Œ€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ์„ค์ •ํ•˜๊ธฐ ์ „์— ํ™œ์„ฑ ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ์ตœ๋Œ€ ์‹œ๊ฐ„ ํ”„๋ ˆ์ž„์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ๊ทธ๊ฒƒ์€ ๊ธฐ๋Šฅ์„ ์™„์ „ํžˆ ๋˜๋Œ๋ ค์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. API ํ‘œ๋ฉด์ด ๋Œ์•„์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ HTTP ์Šคํƒ์ด ํ•ด๋‹น ๊ฐœ์ฒด ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ: @stephentoub @geoffkizer

์ด ์Šค๋ ˆ๋“œ์˜ ๋งŽ์€ ์ฐธ๊ฐ€์ž๊ฐ€ ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด "๋“œ๋ฆผ ํŒ€"์˜ ์ผ๋ถ€๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์˜ค๋Š˜๋‚  ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ๋Œ€ํ•ด ํ•ฉ์˜์— ๋„๋‹ฌํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์—ฌ์ „ํžˆ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ํ•ต์‹ฌ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ด ๊ทธ๋ฃน์—์„œ ๊ฒฐ์ •์ ์ธ ๋‹ต๋ณ€์„ ์–ป๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํ”Œ๋žซํผ์ด ServicePointManager ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋งŽ์€ ํ”Œ๋žซํผ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋ฒ”์šฉ HTTP ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ๋”ฐ๋ผ HttpClient ์ธ์Šคํ„ด์Šค๋ฅผ ํ˜„๋ช…ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ๋™์ž‘์„ ์ œ๊ณตํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. DNS ๋ณ€๊ฒฝ/์—ฐ๊ฒฐ :๋‹ซ๊ธฐ ํ—ค๋”์™€ ๊ด€๋ จํ•˜์—ฌ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๊ณ ์‚ฌํ•˜๊ณ  ์–ด๋–ค ํ˜ธ์ŠคํŠธ๊ฐ€ ํ˜ธ์ถœ๋ ์ง€ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  1. HttpClient ์ธ์Šคํ„ด์Šค๋ฅผ ์ตœ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์—”๋“œํฌ์ธํŠธ๋‹น ํ•˜๋‚˜? ํ˜ธ์ŠคํŠธ/์Šคํ‚ค๋งˆ/ํฌํŠธ๋‹น ํ•˜๋‚˜? ๋ง ๊ทธ๋Œ€๋กœ ์ด ํ•˜๋‚˜์˜ ์‹ฑ๊ธ€ํ†ค? (์†Œ๋น„์ž๊ฐ€ ๊ธฐ๋ณธ ํ—ค๋” ๋“ฑ์„ ํ™œ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.)

  2. ์ด DNS ๋ฌธ์ œ๋ฅผ ๊ฐ€์žฅ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? 1๋ถ„ ํ›„์— ์ธ์Šคํ„ด์Šค๋ฅผ ํ๊ธฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? "๋งค์šฐ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์€" ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ํ๊ธฐ ๋™์ž‘์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

(๊ฐ€์ƒ์˜ ์ƒํ™ฉ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ €๋Š” ์ง€๊ธˆ ์ด๋Ÿฌํ•œ ์ •ํ™•ํ•œ ์งˆ๋ฌธ๊ณผ ์”จ๋ฆ„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)

๊ฐ์‚ฌ ํ•ด์š”!

๋‚˜๋Š” ๋“œ๋ฆผํŒ€ ์‹œํ—˜์— ์ดˆ๋Œ€๋˜์ง€๋„ ์•Š์•˜์ง€๋งŒ, ๋‹น์‹ ์˜ ์‹ฑ๊ธ€ํ†ค HttpClient ์ฝ”๋ฉ˜ํŠธ์— ๋Œ€ํ•ด ํ•œ ๊ฐ€์ง€ ํ†ต์ฐฐ๋ ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ, ํ•ญ์ƒ SendAsync ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํ—ค๋”์™€ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ HttpClient (์˜ˆ: ๊ธฐ๋ณธ ํ—ค๋”, ๊ธฐ๋ณธ ์ฃผ์†Œ)์™€ ์œ ์‚ฌํ•œ ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋กœ ์ด๋ฅผ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋™์ผํ•œ ๋‹จ์ผ ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ์ข‹์€ ์ ์€ ๋ชจ๋‘ ๋™์ผํ•œ HttpClientHandler ๊ณต์œ ํ•˜๋Š” ์—ฌ๋Ÿฌ HttpClient ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://github.com/dotnet/corefx/issues/5811.

DNS ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ฉ์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋‹ค์Œ IP๋กœ ๊ฐ•์ œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์œ ์ผํ•œ ์†”๋ฃจ์…˜์€ ์„œ๋ฒ„๊ฐ€ ์ƒˆ ์—ฐ๊ฒฐ์„ ๊ฑฐ๋ถ€ํ•˜๊ณ  ๊ธฐ์กด ์—ฐ๊ฒฐ์„ ๋‹ซ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Darrel Miller๋Š” https://github.com/dotnet/corefx/issues/11224#issuecomment -270498159์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์˜ต์…˜์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

@ohadschn ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ํ˜ธ์ŠคํŠธ ๊ฐ„์— ๋™์ผํ•œ HttpClient(๋˜๋Š” HttpClientHandler)๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฐ _์ด์ _์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒˆ ํ˜ธ์ŠคํŠธ๋Š” ์ƒˆ DNS ์กฐํšŒ, ์ƒˆ ์—ฐ๊ฒฐ, ์ƒˆ ์†Œ์ผ“์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. TIME_WAIT์˜ ์†Œ์ผ“์„ ํšŒ์ˆ˜ํ•˜๊ณ  ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ํ™•์‹คํžˆ ๋‚ด ์ „๋ฌธ ์ง€์‹์˜ ํ•œ๊ณ„์— ๋„๋‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์—ฌ๋Ÿฌ ํ˜ธ์ŠคํŠธ์—์„œ HttpClient ์‹ฑ๊ธ€ํ†ค์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์ ์ด ์•„๋‹๊นŒ์š”?

DNS ์กฐ์–ธ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ€์žฅ ํ•ฉ์˜๊ฐ€ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด๋ผ๊ณ  ๋Š๊ผˆ๊ณ  ์ดํ•ดํ•  ๋งŒํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์„ ์ œ์–ดํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์„œ๋ฒ„๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ๊ธฐ๋˜๋Š” ๊ฒƒ์„ _ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค_. ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ ˆ์ถฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ํŒ๋‹จ์„ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ์€ ์ „์ ์œผ๋กœ ๋‚˜์—๊ฒŒ ๋‹ฌ๋ ค์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. :)

๋™์ผํ•œ HttpClient [ Handler ] ๊ณต์œ ์˜ ๊ฐ€์žฅ ํ™•์‹คํ•œ ์ด์ ์€ ๋‹จ์ˆœํ•จ์ž…๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ๋งคํ•‘๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” TIME_WAIT์— ๋Œ€ํ•ด ์ž˜ ์•Œ์ง€ ๋ชปํ•˜๋ฉฐ ๋‚ด ์ „๋ฌธ ์ง€์‹๋„ ์•„๋‹™๋‹ˆ๋‹ค.

DNS์™€ ๊ด€๋ จํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์ œ์–ดํ•˜์ง€ ์•Š์„ ๋•Œ ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. DNS๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ฟผ๋ฆฌํ•˜๊ณ  ์‹ค์ œ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ธ์Šคํ„ด์Šค๋ฅผ ํ๊ธฐํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ธก์—์„œ ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š” ์ผ์„ ์ง€์ •ํ•˜๋Š” ์ฃผ์–ด์ง„ ๋‹ต๋ณ€์€ ์ด์ƒ์ ์ธ ์„ธ๊ณ„์—์„œ๋Š” ์ •ํ™•ํ•˜์ง€๋งŒ ์‹ค์ œ ๊ฐœ๋ฐœ์ž๋Š” ์ข…์ข… ํ†ต์‹ ํ•˜๋Š” ์ „์ฒด ์„œ๋ฒ„ ์ธก ์Šคํƒ์„ ์ œ์–ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ ์—์„œ ์ €๋Š” ConnectionLeaseTimeout์ด๋ผ๋Š” ๊ฐœ๋…์„ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. John๊ณผ Jane Doeveloper์˜ ์ผ์ƒ ์ƒํ™œ ํ˜„์‹ค์— ๋Œ€ํ•œ ์–‘๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€๊ฐ€ .NET Core์—์„œ ์ด๋Ÿฌํ•œ ์‹œ๊ฐ„ ์ œํ•œ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. NodaTime ๋ฐ System.Collections.Immutable์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ด ํด๋ž˜์Šค๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ?

    public class ConnectionLeaseTimeoutHandler : DelegatingHandler
    {
        private static string GetConnectionKey(Uri requestUri) => $"{requestUri.Scheme}://{requestUri.Host}:{requestUri.Port}";

        private readonly IClock clock;
        private readonly Duration leaseTimeout;
        private ImmutableDictionary<string, Instant> connectionLeases = ImmutableDictionary<string, Instant>.Empty;

        public ConnectionLeaseTimeoutHandler(HttpMessageHandler innerHandler, IClock clock, Duration leaseTimeout)
            : base(innerHandler)
        {
            this.clock = clock;
            this.leaseTimeout = leaseTimeout;
        }

        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            string key = GetConnectionKey(request.RequestUri);
            Instant now = clock.GetCurrentInstant();

            Instant leaseStart = ImmutableInterlocked.GetOrAdd(ref connectionLeases, key, now);

            if (now - leaseStart > leaseTimeout)
            {
                request.Headers.ConnectionClose = true;
                ImmutableInterlocked.TryRemove(ref connectionLeases, key, out leaseStart);
            }

            return base.SendAsync(request, cancellationToken);
        }
    }

@snboisen ์ œ ์ƒ๊ฐ์—๋Š” ๊ทธ๊ฒŒ ๋งž๋Š” ๊ฒƒ

๋‚˜์—๊ฒŒ ๋” ํฐ ์งˆ๋ฌธ์€ Connection: close ํ—ค๋”๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ธ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. @darrelmiller ๊ฐ€ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ด‰๋ฐœํ•œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์˜ ๋Œ“๊ธ€ ์—์„œ ๋งํ•œ ๊ฒƒ์„ ์—ฌ๊ธฐ์„œ ๋ฐ˜๋ณตํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ConnectionLeaseTimeout์€ ์˜ค๋Š˜ Oren์ด ์–ธ๊ธ‰ํ•  ๋•Œ๊นŒ์ง€ ๋‚ด๊ฐ€ ์•Œ์ง€ ๋ชปํ–ˆ๋˜ ์ด์ƒํ•œ ์ง์Šน์ž…๋‹ˆ๋‹ค. ์ž„๋Œ€๊ฐ€ ๋งŒ๋ฃŒ๋œ ํ›„ ๋‚˜๊ฐ€๋Š” ์š”์ฒญ์— C onnection:Close ํ—ค๋”๊ฐ€ ํฌํ•จ๋˜์–ด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์„ ๋ณด๋‚ธ ํ›„ ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ๊ทน์ ์œผ๋กœ ์š”์ฒญ์„ ํ•  ๋•Œ ๊ฐ•์ œ๋กœ ์—ฐ๊ฒฐ์„ ๋‹ซ๋Š” ์ด์ƒํ•œ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋ฌดํ•œ๋Œ€๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ์ด์œ ๋Š” ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” Darrel์˜ ์˜๊ฒฌ์„ ์กด์ค‘ํ•˜๋ฉฐ ์ด ์ „์ฒด ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋‹ค์†Œ ํ•ด์ปค์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์„œ๋ฒ„ ์ธก์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์„ ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด _๋•Œ๋•Œ๋กœ_ ์ž‘๋™ํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ์ตœ์„ ์˜ ์„ ํƒ์ด ์•„๋‹๊นŒ์š”? ์ฃผ๊ธฐ์ ์œผ๋กœ HttpClient๋ฅผ ํ๊ธฐํ•˜๊ฑฐ๋‚˜ ์ฃผ๊ธฐ์ ์œผ๋กœ DSN ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ™•์‹คํžˆ "์ €๋ ด"ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด Azure ํ‹ฐ์ผ“์ด ์—ด๋ ค ์žˆ์Šต๋‹ˆ๊นŒ?
๋‚ด ๊ด€์ ์—์„œ ๋ณด๋ฉด Azure์˜ ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ์ž์—์„œ ์ด๊ฒƒ์ด ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ์‹์„ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ €๋Š” Azure ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋ฉ€๋ฆฌ์„œ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@tmds ๋‚˜๋Š” ๋ณธ ์ ์ด ์—†์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ๋‹จ์ˆœํ•œ Azure Traffic Manager ์ด์ƒ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. AWS๋Š” ์œ ์‚ฌํ•œ ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์Šคํ…Œ์ด์ง•/ํ”„๋กœ๋•์…˜ ์Šฌ๋กฏ ์Šค์™€ํ•‘์ด ์žˆ๋Š” Azure App Service๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด๋„ ์ด ์Šค์™€ํ•‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@snboisen AWS ๋ฐ ๊ธฐํƒ€ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด(์–ด๋Š ์ชฝ?)๋„ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด DNS ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋ง์”€์ด์‹ ๊ฐ€์š”?

@tmds AWS์˜ ๊ฒฝ์šฐ ์˜ˆ, ์ตœ์†Œํ•œ ์žฅ์•  ์กฐ์น˜์˜ ๊ฒฝ์šฐ: https://aws.amazon.com/route53/faqs/#adjust_ttl_to_use_failover
๋‹ค๋ฅธ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์— ๋Œ€ํ•ด์„œ๋Š” ๋ชจ๋ฅด์ง€๋งŒ ์ผ๋ถ€ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@tmds AWS์˜ ๊ฒฝ์šฐ ์˜ˆ, ์ตœ์†Œํ•œ ์žฅ์•  ์กฐ์น˜์˜ ๊ฒฝ์šฐ: https://aws.amazon.com/route53/faqs/#adjust_ttl_to_use_failover
๋‹ค๋ฅธ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์— ๋Œ€ํ•ด์„œ๋Š” ๋ชจ๋ฅด์ง€๋งŒ ์ผ๋ถ€ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ˜„์žฌ ์˜ค๋ž˜๋œ ๋ฒ„์ „์˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‹คํ–‰ ์ค‘์ธ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

DNS ์žฅ์•  ์กฐ์น˜๋Š” ์ฒซ ๋ฒˆ์งธ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. DNS(AWS, Azure ๋“ฑ)์—์„œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์„œ๋ฒ„๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.
ํด๋ผ์ด์–ธํŠธ์—์„œ ์ด๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์€ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. HttpClient์— ๊ทธ๋Ÿฌํ•œ ์†์„ฑ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์„ค์ •๋œ ์—ฐ๊ฒฐ์—์„œ ์ตœ๋Œ€ ์‘๋‹ต ์‹œ๊ฐ„ ์ดˆ๊ณผ).
ํ”„๋กœํ† ์ฝœ ์ˆ˜์ค€์—์„œ ์ตœ์‹  websocket ๋ฐ http2 ํ”„๋กœํ† ์ฝœ์€ ์—ฐ๊ฒฐ ํ™œ์„ฑ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ping/pong ๋ฉ”์‹œ์ง€๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

Azure์— ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•  ๊ฒƒ์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ๋‘ ๋ฒˆ์งธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž‘๋™ ์ค‘์ธ ์—ฐ๊ฒฐ์„ ๋‹ซ์•„์•ผ ํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๋” ์ด์ƒ ์ ํ•ฉํ•˜์ง€ ์•Š์œผ๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์„ ๋Š๊ณ  ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋„๋ก ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
AWS Blue/Green ๋ฐฐํฌ์— ๋Œ€ํ•œ ์ข‹์€ ๋ฌธ์„œ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. https://d0.awsstatic.com/whitepapers/AWS_Blue_Green_Deployments.pdf.
์—ฌ๋Ÿฌ ๊ธฐ์ˆ ์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. DNS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๊ฒฝ์šฐ _DNS TTL ๋ณต์žก์„ฑ_์„ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ _DNS ๋ณต์žก์„ฑ ์—†์Œ_.

@tmds ๋งํฌ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค.

DNS TTL์— ์˜์กดํ•˜๋Š” ๊ฒƒ๊ณผ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ผ๋ฐ˜์ ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ›จ์”ฌ ๋” ์•ˆ์ •์ ์ธ ์†”๋ฃจ์…˜์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

HttpClient ๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•˜๋Š” Azure App Services์—์„œ 2๊ฐœ์˜ ๋‹ค๋ฅธ API ์•ฑ์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์œ ์‚ฌํ•œ ๋™์ž‘์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ์—์„œ ์•ฝ 250๊ฐœ์˜ ์š”์ฒญ์„ ๋ฐœ๊ฒฌํ–ˆ๊ณ  ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  "์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค" HttpRequestException - ๋™์‹œ ์‚ฌ์šฉ์ž์ธ์ง€ ์ˆœ์ฐจ ์š”์ฒญ์ธ์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

HttpClient ๊ฐ€ ๊ฐ ์š”์ฒญ์—์„œ ์‚ญ์ œ๋˜๋„๋ก using ๋ธ”๋ก์œผ๋กœ ์ „ํ™˜ํ–ˆ์„ ๋•Œ ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ Singleton์—์„œ using ๊ตฌ๋ฌธ๊นŒ์ง€ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

using ๋ธ”๋ก์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ HttpClient ๊ฐ€ ๊ฐ ์š”์ฒญ์—์„œ ์‚ญ์ œ๋˜๋„๋ก ํ–ˆ์„ ๋•Œ ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋Š” ์ˆ˜์‹ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‹ฑ๊ธ€ํ†ค์—์„œ using ๊ตฌ๋ฌธ๊นŒ์ง€ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋ฐ˜๋“œ์‹œ ์„ฑ๋Šฅ์— ๊ด€ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ TCP ์—ฐ๊ฒฐ์„ ๋ˆ„์ถœํ•˜์ง€ ์•Š๊ณ  SocketException s๋ฅผ ์–ป๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

MSDN์—์„œ :

HttpClient๋Š” ํ•œ ๋ฒˆ ์ธ์Šคํ„ด์Šคํ™”๋˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ˆ˜๋ช… ๋™์•ˆ ์žฌ์‚ฌ์šฉ๋˜๋„๋ก ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์„œ๋ฒ„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹๋Œ€ํ•ด ์ƒˆ HttpClient ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ณผ๋ถ€ํ•˜ ์ƒํƒœ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์†Œ์ผ“ ์ˆ˜๊ฐ€ ์†Œ์ง„๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด SocketException ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/์„ ์ฐธ์กฐ

@khellang ๋งํฌ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค( SocketException s์— ๋Œ€ํ•œ ์„ค๋ช…, ์ €๋Š” ๋ถ„๋ช…ํžˆ ๊ฑฐ๊ธฐ์—์„œ ์˜คํ•ด๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค)- ์ €๋Š” ๊ทธ ๊ฒŒ์‹œ๋ฌผ๊ณผ ์ด์™€ ๋˜‘๊ฐ™์€ ๋‚ด์šฉ์„ ์„ค๋ช…ํ•˜๋Š” 3~4๊ฐœ์˜ ๋‹ค๋ฅธ ๊ฒŒ์‹œ๋ฌผ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋‹จ์ผ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ์˜๋„๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ Azure App Services์—์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ƒ๋‹นํžˆ ์ ๋‹นํ•œ ๋ถ€ํ•˜(์œ„์—์„œ ์–ธ๊ธ‰ํ•œ 250๊ฐœ์˜ ์ˆœ์ฐจ ์š”์ฒญ)์—์„œ ์ง€์†์ ์œผ๋กœ HttpRequestExceptions ์— ๋„๋‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์ด ์—†๋Š” ํ•œ HttpClient ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ์ผ๊ด€๋œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ชจ๋“  ๋ณด๋ฅ˜์ค‘์ธ ์š”์ฒญ์ด ๋ช…์‹œ ์ ์œผ๋กœ ์ฒ˜๋ถ„ ์ทจ์†Œํ•˜๋Š” "๋ณด๋‹ค ์ •ํ™•ํ•œ"์†”๋ฃจ์…˜์€ ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ์žˆ์œผ๋ฆฌ๋ผ ๋ฏฟ๊ณ ์žˆ์–ด HttpClient , ๋‹ค์‹œ ์ธ์Šคํ„ด์Šคํ™”์—๊ฒŒ HttpClient , ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์š”์ฒญ์„ ๋‹ค์‹œ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

๋ญ”๊ฐ€ ์ข€ ์—‰๋ง์ธ ๊ฒƒ ๊ฐ™๋‹ค.

ํ•œ ๋ฒˆ ์ธ์Šคํ„ด์Šคํ™”๋˜๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜๋ช… ๋™์•ˆ ์žฌ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋” ๊นจ๋—ํ•œ ์†”๋ฃจ์…˜์„ ์›ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ ์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•œ๊ณ„์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ‹€๋ ธ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์˜๋„ํ•œ ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@snboisen ConnectionLeaseTimeoutHandler๋ฅผ ํ…Œ์ŠคํŠธ

HttpClient ์ธ์Šคํ„ด์Šค์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ๋ชจ๋“  ๊ฐœ๋ณ„ ์—ฐ๊ฒฐ์— ๋Œ€ํ•ด "๋‹ซ๊ธฐ"๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ์ด์ƒ์ ์ด์ง€๋งŒ ๋‚ด๊ฐ€ ํ•  ์ผ์€ HttpClient์— ๋Œ€ํ•ด GetOrCreate() ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ชจ๋“  ์ƒˆ ์—ฐ๊ฒฐ์ด ์ƒ์„ฑ๋˜๋„๋ก 120์ดˆ๋งˆ๋‹ค ์ƒˆ HttpClient ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์„ ๋‹ซ๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๋ฉด ์ด์ „ HttpClient ์ธ์Šคํ„ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์š”์ฒญ๋‹น ์ƒˆ HttpClient ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ๋œ ์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— .NET์ด ์ด๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ƒˆ๋กœ ๊ณ ์นจ์ด ๋ฐœ์ƒํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” DNS ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋‚˜ ๋ฏธ๋“ค์›จ์–ด ํ†ต์‹ ์„ ์ฑ…์ž„์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. DNS์˜ ๋ชฉ์ ์€ IP์— ๋Œ€ํ•œ ์นœ์ˆ™ํ•œ ์ด๋ฆ„์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์กฐ์ • ์—†์ด ์–ธ์ œ๋“ ์ง€ IP๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด๋Ÿฌํ•œ ์ฑ…์ž„์„ ์ƒ์‡„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™„๋ฒฝํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” AWS ํƒ„๋ ฅ์  IP ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ DNS์—๋งŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. AWS๋Š” ec2 ์ธ์Šคํ„ด์Šค์—์„œ ์‹คํ–‰๋˜๋Š” ์›น ์„œ๋ฒ„์—์„œ "๋‹ซ๊ธฐ" ํ—ค๋”๋ฅผ ๋ณด๋‚ด๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. AWS๋Š” ๊ด€๋ฆฌํ•˜๋Š” ec2 ์ธ์Šคํ„ด์Šค ์œ„์— ์žˆ๋Š” ๋ชจ๋“  ์›น ์„œ๋ฒ„๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. "๋‹ซ๊ธฐ" ํ—ค๋”๋ฅผ ํ†ตํ•ด ์ „์†กํ•˜์ง€ ์•Š๋Š” ์ด์ „ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋™์ผํ•œ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ DNS์— ์˜ํ•ด ์ „ํ™˜๋œ ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ๊ณผ ํ•จ๊ป˜ ์ƒˆ ์„œ๋ฒ„์— ๋ฐฐํฌ๋˜๋Š” ์ƒˆ ์„œ๋ฒ„ ๋ฐฐํฌ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋‹ค์‹œ ์ „ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ด์ „ ์„œ๋ฒ„์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด DNS๋กœ ํ•œ ๊ณณ์—์„œ ์›ํ™œํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋…ผ์˜๋œ ๋” ํฐ ๋ฌธ์ œ์™€ ์ƒ๊ด€์—†์ด ์ด์ œ ConnectionLeaseTimeout์ด ์ฝ”์–ด์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ง€๊ธˆ ๋ง‰ ๋ฌธ์ œ ์—†์ด ์›๋ณธ ๊ฒŒ์‹œ๋ฌผ๊ณผ ๋˜‘๊ฐ™์€ ์˜ˆ์ œ๋ฅผ ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚ด ์—ฐ๊ฒฐ DNS ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ํ•ต์‹ฌ์— ๊ตฌํ˜„๋œ _seems_ ConnectionLeaseTimeout _is_์ž…๋‹ˆ๋‹ค.

ServicePointMananager.ConnectionLeaseTimeout์€ .NET Core์—์„œ ๊ตฌํ˜„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .NET Core์—์„œ ์ด ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ธˆ๋ฌผ์ž…๋‹ˆ๋‹ค. .NET Framework์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ์†์„ฑ์€ .NET Framework์—์„œ "๊บผ์ง"์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

๋‹จ์ผ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ์˜๋„๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ Azure App Services์—์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฝค ์ ๋‹นํ•œ ๋ถ€ํ•˜(์œ„์—์„œ ์–ธ๊ธ‰ํ•œ 250๊ฐœ์˜ ์ˆœ์ฐจ ์š”์ฒญ)์—์„œ HttpRequestExceptions๊ฐ€ ์ง€์†์ ์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์ด ์—†๋Š” ํ•œ HttpClient๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ์ผ๊ด€๋œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  http ์š”์ฒญ์ด ๋™์ผํ•œ HttpClient ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ API์—์„œ HttpClient ๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ์†Œ์ผ“ ๊ณ ๊ฐˆ ๋ฌธ์ œ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. , RestSharp ๋น„์Šทํ•˜์ง€๋งŒ ์ด๊ฒƒ๋„ ์žฅ์  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์€ lock{} ๋’ค์— ์žˆ์Šต๋‹ˆ๋‹ค. 60๋ถ„๋งˆ๋‹ค ์ƒˆ๋กœ์šด HttpClient ๋งŒ๋“ค๊ณ  ๋Œ€์‹  ๋‹ค์‹œ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋Œ€๋Ÿ‰์˜ http ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(๋งŽ์€ ํ†ตํ•ฉ์œผ๋กœ ์ธํ•ด). ์—ฌ์ „ํžˆ ๋‹ซํžˆ์ง€ ์•Š์€ ์ด์ „ ์—ฐ๊ฒฐ์„ ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•ฝ 1๋…„ ๋™์•ˆ ์ด ์ž‘์—…์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด ์™”์Šต๋‹ˆ๋‹ค(์†Œ์ผ“ ๊ณ ๊ฐˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ํ›„).

๋‚˜๋Š” ์ด๊ฒƒ์— ์—ฌ์ „ํžˆ ์„ฑ๋Šฅ์ƒ์˜ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ(ํŠนํžˆ ๋ชจ๋“  ์ž ๊ธˆ์œผ๋กœ ์ธํ•ด) ์†Œ์ผ“ ๊ณ ๊ฐˆ๋กœ ์ธํ•ด ์ฃฝ์–ด๊ฐ€๋Š” ๋ชจ๋“  ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

@KallDrexx ์™œ '๊ธ€๋กœ๋ฒŒ' ์ธ์Šคํ„ด์Šค๋ฅผ ์ž 

HttpClient ๋ฅผ ์–ป๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

```c#
var timeSinceCreated = DateTime.UtcNow - _lastCreatedAt;
if (timeSinceCreated.TotalSeconds > SecondsToRecreateClient)
{
์ž๋ฌผ์‡ (์ž๋ฌผ์‡ )
{
timeSinceCreated = DateTime.UtcNow - _lastCreatedAt;
if (timeSinceCreated.TotalSeconds > SecondsToRecreateClient)
{
_currentClient = ์ƒˆ๋กœ์šด HttpClient();
_lastCreatedAt = DateTime.UtcNow;
}
}
}

        return _currentClient;

```

๋”ฐ๋ผ์„œ ์ž ๊ธˆ์€ ๋ถ„๋‹น ํ•œ ๋ฒˆ๋งŒ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ƒˆ HttpApiClient ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋” ์ ๊ทน์ ์œผ๋กœ ์ž ๊ทธ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค, ๊ทธ๋ž˜์„œ ํŽธ์˜์ƒ ์ด์œ ์ž…๋‹ˆ๋‹ค.
๋˜๋Š” ํƒ€์ด๋จธ ๊ธฐ๋ฐ˜(๋น„๋™๊ธฐ) ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ƒ์„ฑํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜(์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ง€์—ฐ ์ดˆ๊ธฐํ™” ์Šคํƒ€์ผ), ๋‹ค๋ฅธ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์ƒ์„ฑ ์‹œ๊ฐ„ ๋™์•ˆ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ๊ฒƒ์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค, ๊ทธ๋ž˜์„œ ํŽธ์˜์ƒ ์ด์œ ์ž…๋‹ˆ๋‹ค.

ํŽธ์˜์‹œ์„ค๋กœ ๋ถ„๋ฅ˜ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋„ˆ๋ฌด ๋งŽ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ƒˆ๋กœ์šด HttpClient ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋งค๋ถ„ ์ƒ์„ฑ๋˜๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์Šค๋ ˆ๋“œ๋กœ ์ธํ•ด ์†Œ์ผ“์ด ๊ณ ๊ฐˆ๋  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด์ „ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ทธ 1๋ถ„ ๋™์•ˆ ์†Œ์ผ“์„ ์ œ๋Œ€๋กœ ์ •๋ฆฌํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. (์บ์Šค์ผ€์ด๋“œ ๋ฐœ์ƒ).

๊ฒŒ๋‹ค๊ฐ€, ๋‚˜๋Š” DateTime ์—…๋ฐ์ดํŠธ๊ฐ€ ์›์ž์  ์—ฐ์‚ฐ์ธ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์–ด๋Š ์ •๋„์˜ ์ž ๊ธˆ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ถ€ ์Šค๋ ˆ๋“œ๋Š” _lastCreatedAt ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ด์ „ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋™์‹œ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒˆ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ๋ณต์žกํ•œ ๋…ผ๋ฆฌ๊ฐ€ ๋งŽ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒˆ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋งํ•  ๊ฒƒ๋„ ์—†์ด ์šฐ๋ฆฌ๋Š” ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ _currentClient ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๋ณด์žฅํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์ž ๊ธˆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๋•์…˜์—์„œ ์œ„ํ—˜์„ ๊ฐ์ˆ˜ํ•˜๊ธฐ์—๋Š” ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๊ฒƒ์ด ๋„ˆ๋ฌด ๋งŽ๊ณ  ๋ณต์žก์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@KallDrexx

  • ReaderWriterLockSlim ๊ฐ€ ๊ท€ํ•˜์˜ ์šฉ๋„์— ๋” ์ ํ•ฉํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • DateTime ํ• ๋‹น์€ ์‹ค์ œ x64๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์›์ž์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋‹จ์ผ ulong ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—). ์ž ๊ธˆ ์™ธ๋ถ€์—์„œ DateTime ๊ฐ’์„ ๊ด€์ฐฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ˜„์žฌ ์ฝ”๋“œ๋Š” ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • @karelz ๊ฐ€ ์ œ์•ˆํ•œ ํƒ€์ด๋จธ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ DateTime ๊ฐ€ ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค... ํƒ€์ด๋จธ๋Š” ๋‹จ์ˆœํžˆ HttpClient ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ HttpClient ํ•„๋“œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์žฅ๋ฒฝ์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค( volatile , Interlocked.Exchange ๋“ฑ).

ReaderWriterLockSlim์ด ๊ท€ํ•˜์˜ ์šฉ๋„์— ๋” ์ ํ•ฉํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊น”๋”ํ•œ ๊ทธ ์ˆ˜์—…์— ๋Œ€ํ•ด ๋ชฐ๋ž์–ด์š”! ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์„ ์–ธ๊ธ‰ํ•˜๋ฉด SemaphoreSlim ๋„ ๋น„๋™๊ธฐ/๋Œ€๊ธฐ ์นœํ™”์ ์ด๊ธฐ ๋•Œ๋ฌธ์—( ReaderWriterLockSlim ๋˜์ง€ ์•Š์Œ) ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•œ ์Šค๋ ˆ๋“œ ๊ฒฝํ•ฉ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ HttpClient ์ด(๊ฐ€) ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์‹œ ReaderWriterLockSlim ๊ท€ํ•˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง€์ ํ•œ ์ž ์žฌ์ ์ธ DateTime ๋น„์›์ž์„ฑ ๋ฌธ์ œ๋ฅผ ๋” ์ž˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ์ƒ๊ฐ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@karelz ๊ฐ€ ์ œ์•ˆํ•œ ํƒ€์ด๋จธ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ DateTime์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค... ํƒ€์ด๋จธ๋Š” ๋‹จ์ˆœํžˆ HttpClient๋ฅผ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ HttpClient ํ•„๋“œ๋ฅผ ์ผ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ ์žฅ๋ฒฝ(ํœ˜๋ฐœ์„ฑ, Interlocked.Exchange ๋“ฑ)์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„ ๋ฌด์Šจ ๋ง์ธ์ง€ ์ž˜๋ชป ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋ง์ด ๋˜์ง€๋งŒ, ์ œ๋Œ€๋กœ ํ•˜๋ ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋” ์ต์ˆ™ํ•ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”.

ํŽธ์ง‘: ๋ง๋ถ™์ด์ž๋ฉด, ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ๋‚ด์žฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ข‹์€ ์ด์œ ์ด๋ฏ€๋กœ HttpClient ์˜ ๋ชจ๋“  ์†Œ๋น„์ž๋Š” ์ด๊ฒƒ์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ํ†ต๊ณผํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

.net core 2.0์—์„œ๋„ ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ DNS ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

.net core 2.0์—์„œ๋„ ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ DNS ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์ดํ•ด๋Š” ๊ทธ๊ฒƒ์ด Dns ์ž์ฒด์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ HttpClient ๊ฐ€ ๊ธฐ์กด ์—ฐ๊ฒฐ์„ ์žฌ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฏ€๋กœ(์†Œ์ผ“ ๊ณ ๊ฐˆ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด) ๋”ฐ๋ผ์„œ DNS๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์—ฌ์ „ํžˆ ์ด์ „ ์—ฐ๊ฒฐ์— ์—ฐ๊ฒฐํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ „ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์ด๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„.

@KallDrexx , ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ฒญ๋ก์ƒ‰ ๋ฐฐํฌ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

@ ๋‚ด ์ดํ•ด์—์„œ 1๋…„ HttpClient ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ Production Green์— ๋Œ€ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Blue๋กœ Production์„ ๊ต์ฒด HttpClient ๋Š” ์—ฐ๊ฒฐ์ด ๋‹ซํž ๋•Œ๊นŒ์ง€ Green์— ๋Œ€ํ•œ ์—ด๋ฆฐ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ค๋ž˜๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ ์ธก์ •์— DateTime.UtcNow๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Stopwatch.GetTimestamp์™€ ๊ฐ™์€ ๋‹จ์œ„ ์‹œ๊ฐ„ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์šด์˜์ž ๋˜๋Š” ์‹œ๊ฐ„ ๋™๊ธฐํ™”์— ์˜ํ•œ ํ˜„์ง€ ์‹œ๊ฐ„ ์กฐ์ •์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. QPC ๊ฐ’์„ ๋˜๋Œ๋ฆฌ๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ์นฉ์…‹์ด ๋ช‡ ๊ฐ€์ง€ ์žˆ์—ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ๊ทธ ์ค‘ ์ƒ๋‹น์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

var sp = ServicePointManager.FindServicePoint(new Uri("http://foo.bar/baz/123?a=ab"));
sp.ConnectionLeaseTimeout = 60*1000; // 1 ๋ถ„

์ด ์ฝ”๋“œ๋Š” ์ƒ์„ฑ์ž์— ์žˆ์Šต๋‹ˆ๊นŒ?

@whynotme8998 @lundcm ์•„๋‹Œ ๊ฒƒ ๊ฐ™์•„์š”. HttpClient ๊ฐ€ ์‹ฑ๊ธ€ํ†ค์ด๊ณ  ์—ฌ๋Ÿฌ ์—”๋“œํฌ์ธํŠธ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒฝ์šฐ ์ƒ์„ฑ์ž๊ฐ€ ์ด๋ฅผ ๋ฐฐ์น˜ํ•  ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
์ด ๊ตฌํ˜„์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ ํ”„๋กœ์ ํŠธ์˜ README์—๋Š” ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ธฐ์‚ฌ๋Š” ๋˜ํ•œ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

ConnectionLeaseTimeout ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋„๋ก ๋„์™€์ค„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์•ฑ์—์„œ 1๋ถ„์œผ๋กœ ์„ค์ •ํ•˜๋ฉด 1๋ถ„๋งˆ๋‹ค ์—ฐ๊ฒฐ ์ž„๋Œ€ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋ฉ๋‹ˆ๊นŒ? ๋‚ด ๋ฐฑ์—”๋“œ์™€ ๋Œ€ํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์‚ฌ๋žŒ๋“ค์ด ๋ฐฑ์—”๋“œ์—์„œ DNS ์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๊นŒ? ํ‘œ์ค€ Azure Web App์—์„œ ASP.NET ๋ฐฑ ์—”๋“œ๋ฅผ ๊ฒŒ์‹œํ•˜๋ฉด DNS ์ƒˆ๋กœ ๊ณ ์นจ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

1๋ถ„ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋Š” ์ž ์žฌ์ ์œผ๋กœ DNS๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์ง€๋งŒ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์•„์ง ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ์ฐฝ์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘ํ•˜๋‹ค. ์ด๊ฒƒ์„ ๊นจ๋‹ซ๋Š” ๊ฒƒ์€ .NET Standard 2.0์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

https://www.stevejgordon.co.uk/introduction-to-httpclientfactory-aspnetcore๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค.

ConnectionLeaseTimeout์„ ๋ณ€๊ฒฝํ•˜๋ฉด .netstandard 2.0์ด ์žˆ๋Š” Xamarin์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!!!

@paradisehuman ๋‚˜๋Š” ๋‹น์‹ ์ด ServicePoint.ConnectionLeaseTimeout ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. AFAIK .NET Core์—์„œ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .NET Core 2.1์—์„œ๋Š” SocketsHttpHandler.PooledConnectionLifetime ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ASP.NET์˜ ์ƒˆ๋กœ์šด HttpClientFactory ๋Š” ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
Mono/Xamarin์—๋Š” ์ž์ฒด ๋„คํŠธ์›Œํ‚น ์Šคํƒ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค(๋„คํŠธ์›Œํ‚น์— CoreFX ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ). ๋”ฐ๋ผ์„œ ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ํ•จ๊ป˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋ฒ„๊ทธ๋ฅผ ์‹ ๊ณ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ํ˜„์žฌ๋Š” .NET Core๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ServicePointManager๋ฅผ .NET Core๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•˜๊ฑฐ๋‚˜ ์ด์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@onovotny , .NET Core 2.1์˜ SocketsHttpHandler๋Š” ํ•ธ๋“ค๋Ÿฌ ์ˆ˜์ค€์—์„œ ConnectionLeaseTimeout๊ณผ ์œ ์‚ฌํ•œ ๋ชฉ์ ์„ ์ œ๊ณตํ•˜๋Š” PooledConnectionLifetime์„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ํ•ด๊ฒฐ๋œ ์ด ๋ฌธ์ œ๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@stephentoub ์ง€๊ธˆ ์ด๊ฒƒ์„ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, PooledConnectionLifetime์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ํ•„์š”ํ•œ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@onovotny @karelz @stephentoub ,

์ด๊ฒƒ์ด ์›๋ž˜์˜ ์‹ฑ๊ธ€ํ†ค HttpClient/DNS ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์š”์•ฝ์ด๋ผ๋Š” ๋ฐ ๋ชจ๋‘ ๋™์˜ํ•˜์‹ญ๋‹ˆ๊นŒ?

  • .NET Framework 2.0 ์ด์ƒ์—์„œ๋Š” ServicePoint.ConnectionLeaseTimeout ํ•ฉ๋‹ˆ๋‹ค.

  • .NET Core 2.1์—์„œ๋Š” SocketsHttpHandler.PooledConnectionLifetime ํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ๋ชจ๋“  ํ”Œ๋žซํผ/๋Œ€์ƒ/๋ฒ„์ „์˜ ๊ฒฝ์šฐ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์†”๋ฃจ์…˜/ํ•ดํ‚น/ํ•ด๊ฒฐ์ฑ…์ด ์—†์œผ๋ฏ€๋กœ ์‹œ๋„์กฐ์ฐจ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์ด ์Šค๋ ˆ๋“œ์™€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ(์˜ˆ: ConnectionLeaseTimeout ๊ฐ€ .NET Standard 2.0์˜ ํ”Œ๋žซํผ ๊ฐ„์— ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ)์—์„œ ๊ณ„์† ํ•™์Šตํ•˜๋ฉด์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“œ๋กœ์ž‰ ๋ณด๋“œ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ํ”Œ๋žซํผ/๋ฒ„์ „์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋žซํผ ์Šค๋‹ˆํ•‘์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ฃผ๊ธฐ์ ์œผ๋กœ HttpClient ํ๊ธฐ/์žฌ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ด๋ผ๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ •๊ธฐ์ ์ธ ๊ฐ„๊ฒฉ์œผ๋กœ ํ˜ธ์ŠคํŠธ์— connection:close ํ—ค๋”๋ฅผ ๋ณด๋‚ด๋Š” ์ฒซ ๋ฒˆ์งธ ์‹œ๋„์—์„œ ๋‚ด๊ฐ€ ์ž˜๋ชปํ–ˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์กฐ์–ธ์— ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

@tmenier ๋‹ค๋ฅธ ๋ชจ๋“  ํ”Œ๋žซํผ/ํƒ€๊ฒŸ/๋ฒ„์ „์˜ ๊ฒฝ์šฐ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์†”๋ฃจ์…˜/ํ•ดํ‚น/๋Œ€์ฑ…์ด ์—†์œผ๋ฏ€๋กœ ์‹œ๋„์กฐ์ฐจ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

ํ•ญ์ƒ ์ •๊ธฐ์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์ •์  ๋ณ€์ˆ˜๋กœ ์„ค์ •).
์ด๊ฒƒ์ด HttpClientFactory ๊ฐ€ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  HttpClientFactory ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@karelz ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ €์—๊ฒŒ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ๊ธธ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํ”Œ๋žซํผ ์Šค๋‹ˆํ•‘์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋ชจ๋“  ๊ณณ์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(์˜ค๋ฒ„ํ—ค๋“œ ๋“ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด)?

๊นŒ๋‹ค๋กœ์šด ๋ถ€๋ถ„์€ ์žฌํ™œ์šฉ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ํ๊ธฐํ•˜๋Š” ๊ฒƒ์ด _์–ธ์ œ_ ์•ˆ์ „ํ•œ์ง€ ์•„๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋™์‹œ์„ฑ/๋Œ€๊ธฐ ์ค‘์ธ ์š”์ฒญ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•ด์•ผ ํ•จ). ํ•˜์ง€๋งŒ HttpClientFactory ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์—ฟ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@tmenier HttpClient ํ˜ธ์ถœ๋งˆ๋‹ค ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌํ™œ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด tcp ์†Œ์ผ“์ด ๊ณ ๊ฐˆ๋ฉ๋‹ˆ๋‹ค. ์žฌํ™œ์šฉ์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์‹œ๊ฐ„ ์ดˆ๊ณผ ๋˜๋Š” ๋งŒ๋ฃŒ๋  ์ˆ˜ ์žˆ๋Š” HttpClient ์žˆ๋Š” ํ’€ ์œ ์ง€.

@KallDrexx ๋งž์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋‹จ ๋ช‡ ๋ถ„๋งˆ๋‹ค์™€ ๊ฐ™์ด ์‹ฑ๊ธ€ํ†ค(๋˜๋Š” "์˜์‚ฌ"-์‹ฑ๊ธ€ํ†ค)์„ _์ฃผ๊ธฐ์ ์œผ๋กœ_ ์žฌํ™œ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด๋ฅ˜ ์ค‘์ธ ์š”์ฒญ์ด ์—†๋Š” ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜๋ฉด ํ’€ ๊ด€๋ฆฌ์™€ ์ฃฝ์€ ์ธ์Šคํ„ด์Šค์˜ ์ง€์—ฐ๋œ ์ฒ˜๋ฆฌ๊ฐ€ ํฌํ•จ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค ์žฌํ™œ์šฉ์˜ ์˜๋ฏธ๋ฅผ ์ž˜๋ชป ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ž˜๋œ ๊ฒƒ์„ ๋ฒ„๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. GC๊ฐ€ ์ˆ˜์ง‘ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
์ฝ”๋“œ๋Š” ํƒ€์ด๋จธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ƒˆ๋กœ์šด "์˜์‚ฌ"-์‹ฑ๊ธ€ํ†ค์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์•„๋ฌด๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ํ๊ธฐํ•˜์ง€ ์•Š์œผ๋ฉด ๊ณ ์„ฑ๋Šฅ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ http ์—ฐ๊ฒฐ์ด ๋ถ€์กฑํ•  ๋•Œ ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

@tmenier .NET Core 2.1์—์„œ https://github.com/dotnet/wcf/blob/master/src/System.Private.ServiceModel/src/System/ ์— ์™„์ „ํžˆ ์บก์Šํ™”๋œ HttpClientHandler ์ƒ์„ฑ

@edavedian dotnet /wcf repo์—์„œ ์งˆ๋ฌธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. cc @mconnew @Lxiamail

๊ธฐ๋ณธ ์Šคํƒ์€ ๊ณ ๊ธ‰ ์ œ์–ด ๋…ธ๋ธŒ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š” WinHTTP ๋˜๋Š” Curl๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

.Net Core์— ์†Œ์ผ“์„ ํ†ตํ•ด ์ž‘๋™ํ•˜๋Š” HTTP ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

.Net Core์— ์†Œ์ผ“์„ ํ†ตํ•ด ์ž‘๋™ํ•˜๋Š” HTTP ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, SocketsHttpHandler์ด๋ฉฐ 2.1๋ถ€ํ„ฐ๋Š” ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ฏฟ๋Š” RestClient ์™€ ์œ ์‚ฌํ•˜๊ฒŒ HttpClient ์บ์‹œ URI'๊ฐ€ ์ ์ค‘ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ง€์›ํ•˜๋Š” ๋ฒ„์ „(.NET Core 3.0/.NET Framework 3.0 ๋“ฑ)์„ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

ํ”„๋กœ์ ํŠธ๊ฐ€ .Net Core 2.1+ ์•ฑ์ธ ๊ฒฝ์šฐ ์บ์‹ฑ์ด RestClient ์—์„œ๋งŒ ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ฏฟ๋Š” RestClient์™€ ์œ ์‚ฌํ•˜๊ฒŒ HttpClient๊ฐ€ URI๋ฅผ ์บ์‹œํ•ฉ๋‹ˆ๊นŒ?

HttpClient๋Š” ์บ์‹ฑ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@SpiritBob ์–ด๋–ค ํ˜•ํƒœ์˜ ์บ์‹ฑ์„ ๋งํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์งˆ๋ฌธ์ด ์žˆ๋Š” ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด์–ด ์ฃผ์‹œ๋ฉด ๋‹ต์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@scalablecory ๋‚˜๋Š”

๋ฐฉ๊ธˆ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์—ˆ์œผ๋ฉฐ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

HttpClientFactory ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฒฐ๊ณผ HttpClient ๋Š” ๋‹ค์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‚ด๋ถ€ SocketException ๊ฐ€ ํฌํ•จ๋œ HttpRequestException ๋ฅผ ์ˆ˜์‹ ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐ์„ ๋‹ซ๊ณ  ์ƒˆ DNS ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ๊ฐ€ ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š๊ณ  DNS๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์˜ค๋ฅ˜ ์ฝ”๋“œ 11001 - ์•Œ๋ ค์ง„ ํ˜ธ์ŠคํŠธ๊ฐ€ ์—†์Œ)?

๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ DNS ๋ ˆ์ฝ”๋“œ์—์„œ TTL์ด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „์— HttpClient ๊ฐ€ DNS ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ €๋Š” ํ˜„์žฌ HttpClientFactory ์‚ฌ์šฉ์ž ์ •์˜ HttpMessageHandler ( AddHttpClient<T, U>().ConfigurePrimaryHttpMessageHandler(...) ์‚ฌ์šฉํ•˜์—ฌ ์ข…์†์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ๊ตฌ์„ฑ)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ TTL์ด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „์— DNS ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Azure Blob Storage์— ๋งŽ์€ ์—…๋กœ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰