๋ค์ ๊ฒ์๋ฌผ์ ์ค๋ช
๋ ๋๋ก: 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๋ก ๊ฐ์ ธ์์ผ ํ๊ฑฐ๋ ์ด์ ์ ์ฌํ ๊ธฐ๋ฅ์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํ์ฑํํด์ผ ํฉ๋๋ค.
๊ธฐ๋ณธ๊ฐ์ 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 ์ฐ๊ฒฐ : ๋ซ๊ธฐ ํค๋๋ฅผ ๋ฐํํ๋๋ก ์ง์ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ชจ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ์ ๋๊ณ ์ ์ฐ๊ฒฐ์ ์ค์ ํด์ผ ํฉ๋๋ค. ์๋ฃจ์ ์ ํด๋ผ์ด์ธํธ์์ ์๊ฐ ์ด๊ณผ ๊ฐ์ ๊ฐ์ง ์๋๋ก ํ์ฌ ํด๋น "์๋" ์๊ฐ ์ด๊ณผ๊ฐ ๋ง๋ฃ๋ ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ : ๋ซ๊ธฐ๋ฅผ ์ ์กํฉ๋๋ค.
์ด๊ฒ์ ์ฌ์ฉ์ ์ง์ DNS ํด์๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ DNS ์ฅ์ ์กฐ์น๋ฅผ ํ ์คํธ ํ๋ Stackoverflow
์ด๊ฒ์ ์ ๋์ ์ผ๋ก ๋ฌธ์ ์ ๋๋ค. @darrelmiller๊ฐ ์ ์ํ ์๋ฃจ์ ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ์ดํด๊ฐ ๋ถ์กฑํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
Azure Traffic Manager๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค์ ์ํ๋ฅผ ํ๊ฐํฉ๋๋ค. ์งง์ TTL๋ก DNS ์์์ ์๋ํฉ๋๋ค. ํธ์คํธ๋ ์์ ์ด ๋น์ ์์ ์ด๋ผ๋ ๊ฒ์ ๋ง์ ์ฒ๋ผ ์์ง ๋ชปํ๊ณ C ์ฐ๊ฒฐ : ๋ซ๊ธฐ ํค๋๋ฅผ ๋ฐํํ๊ธฐ ์์ํฉ๋๋ค. ํธ๋ํฝ ๊ด๋ฆฌ์๋ ๋น์ ์ ์ํ๋ฅผ ๊ฐ์งํ๊ณ ๊ทธ์ ๋ฐ๋ผ DNS ํ์ธ์ ์กฐ์ ํฉ๋๋ค. ์ค๊ณ์ ์ด๊ฒ์ ํด๋ผ์ด์ธํธ์ ํธ์คํธ์ ์์ ํ ํฌ๋ช ํฉ๋๋ค... ๊ทธ๋๋ก ํธ๋ํฝ ๊ด๋ฆฌ์๊ฐ DNS๋ฅผ ํ์ธํ๋ ์ ์ HttpClient(๋ฌด์์์ ์ผ๋ก)๊ฐ ์๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ด์ ์ ํ์ธ๋ ํธ์คํธ๊ฐ ๋น์ ์ ์ํ๊ฐ ๋ ๋ ์ ํธ์คํธ๋ฅผ ์์ ํ์ง ์์ต๋๋ค.
netcore 1.1 ํ์ฌ ์ด ์ ํํ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ๊ณ ์์ต๋๋ค. ์ด์จ๋ ๋๋ ํ๊ณ ๋ ๊ฒ์ ๋ณด์ง ๋ชปํ๋ค.
@kudoz83 ๋ง์ต๋๋ค. ํธ์คํธ๋ ํธ๋ํฝ ๊ด๋ฆฌ์๊ฐ DNS ํ์ธ์ ์กฐ์ ํ ๋๋ฅผ ๋ง์ ์ฒ๋ผ ์์ง ๋ชปํฉ๋๋ค. ๋ฐ๋ผ์ ๋ด๊ฐ ๋งํ ์ด์ ๋
ํด๋น DNS ํญ๋ชฉ์ด ๋ณ๊ฒฝ๋๋ฉด ํธ์คํธ A์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์๋ ค์ผ ํฉ๋๋ค.
์ฐ๊ฒฐ : ๋ซ๊ธฐ ํค๋๋ฅผ ๋ฐํํด์ผ ํ๋ค๊ณ ์๋ณธ ์๋ฒ์ ์๋ฆฌ๋ ๊ฒ์ด ์ค์ฉ์ ์ด์ง ์๋ค๊ณ ์๊ฐ๋๋ฉด ๋ช ๊ฐ์ง ์ ํ๋ง ๋จ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋์ ๊ดํด์๋ ์ ์ค ์ผ์ด์ค๋ฅผ ์ดํดํ์ง ๋ชปํ๋ค. ์๋ ๋ฌธ์ ๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ํ๋ก๋์ ๋ฐ ์คํ ์ด์ง ์ฌ๋กฏ ๊ฐ ์ ํ๊ณผ ๊ด๋ จ๋๊ณ ์ํ ๋ชจ๋ํฐ๋ง๊ณผ ์๋ฌด ๊ด๋ จ์ด ์๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ต๋๋ค. ๋ ์๋๋ฆฌ์ค ๋ชจ๋ 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 ํ์ ๋ต๋ณ์ ๋๋ค.
ํด๋ผ์ด์ธํธ๋ฅผ ๋ค์ IP๋ก ๊ฐ์ ์คํํ๊ธฐ ์ํด ์คํ ๊ฐ๋ฅํ ์ ์ผํ ์๋ฃจ์
์ ์๋ฒ๊ฐ ์ ์ฐ๊ฒฐ์ ๊ฑฐ๋ถํ๊ณ ๊ธฐ์กด ์ฐ๊ฒฐ์ ๋ซ๋๋ก ํ๋ ๊ฒ์
๋๋ค(์ด ์ค๋ ๋์์ ์ด๋ฏธ ์ธ๊ธ๋จ).
์ด๊ฒ์ ๋ด๊ฐ ATM ๋ฌธ์ ์์ ์ดํดํ ๊ฒ๊ณผ ๋์ผ
์์ฒด์ ์ผ๋ก DNS๋ฅผ ์บ์ฑํ๋ ๋ค๋ฅธ ๋คํธ์ํฌ ์ดํ๋ผ์ด์ธ์ค ์ฅ์น(์: ํ ๋ผ์ฐํฐ/AP)๋ฅผ ๊ณ ๋ คํ ๋ ๋ฎ์ ๋๊ธฐ ์๊ฐ, ๊ณ ๊ฐ์ฉ์ฑ ๊ธฐ์ ์ ์ํ ์๋ฃจ์ ์ผ๋ก DNS ์ฅ์ ์กฐ์น๋ฅผ ๊ถ์ฅํ์ง ์์ต๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์ ์ด๋ ์ฅ์ ์กฐ์น์ ๋ํ ๊ถ์ฅ ์ฌํญ์ ์ ์ ํ๊ฒ ๋ฐฐ์ ์ค์งํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ ์ ์ฉ LB(ํ๋์จ์ด ๋๋ ์ํํธ์จ์ด)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋๋ก, ํธ๋ํฝ ๊ด๋ฆฌ์์ ์ํด (๋ฌด์์์ ์ผ๋ก) DNS๋ฅผ ํ์ธํ๋ ์ ์ HttpClient๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์ ์ ํ์ธ๋ ํธ์คํธ๊ฐ ๋น์ ์ ์ํ๊ฐ ๋ ๋ ์ ํธ์คํธ๋ฅผ ์์ ํ์ง ์์ต๋๋ค.
์์์ ์ธ๊ธํ๋ฏ์ด ๋น์ ์์ด๋ DNS TTL์ด ๋ง๋ฃ๋ ๊ฒ์ ๊ด์ฐฐํ๋ ๋์ ์๋ฒ๊ฐ HTTP ์ค๋ฅ ์ฝ๋๋ฅผ ๋ฐํํ๊ณ TCP ์ฐ๊ฒฐ์ ๋ซ๋ ๊ฒ์ ์๋ฏธํ๋ค๋ฉด ์ด๊ฒ์ ์ค์ ๋ก ๋ฒ๊ทธ์ ๋๋ค.
์๋๋ฆฌ์ค๋ฅผ ๋ ์์ธํ ์ค๋ช ํ์ญ์์ค.
ipconfig /showdns
๋ฐ nslookup -type=soa <domain_name>
๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๊ณ๊ฐ ์๊ฐํ๋ TTL๊ณผ ์ ๋ขฐํ ์ ์๋ NS์ TTL์ ๋น๊ตํ ์ ์์ต๋๋ค.netstat /a /n /b
๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ ๋ฐ ์ด๋ฅผ ์์ ํ๋ ํ๋ก์ธ์ค๋ฅผ ๋ณผ ์ ์์ต๋๋ค.์ปดํจํฐ์ ์ฐ๊ฒฐํ๊ณ 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 ๋ณ๊ฒฝ/์ฐ๊ฒฐ :๋ซ๊ธฐ ํค๋์ ๊ด๋ จํ์ฌ ์ ๋๋ก ์๋ํ๋์ง ์ฌ๋ถ๋ ๊ณ ์ฌํ๊ณ ์ด๋ค ํธ์คํธ๊ฐ ํธ์ถ๋ ์ง ๋ฏธ๋ฆฌ ์ ์ ์์ต๋๋ค.
HttpClient
์ธ์คํด์ค๋ฅผ ์ต์ ์ผ๋ก ๊ด๋ฆฌํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? ์๋ํฌ์ธํธ๋น ํ๋? ํธ์คํธ/์คํค๋ง/ํฌํธ๋น ํ๋? ๋ง ๊ทธ๋๋ก ์ด ํ๋์ ์ฑ๊ธํค? (์๋น์๊ฐ ๊ธฐ๋ณธ ํค๋ ๋ฑ์ ํ์ฉํ๊ธฐ๋ฅผ ์ํ ์๋ ์๊ธฐ ๋๋ฌธ์ ์์ฌ์ค๋ฝ์ต๋๋ค.)
์ด 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๋ฅผ ์ป๋ ๊ฒ์ ๊ดํ ๊ฒ์
๋๋ค.
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
๊ฐ์ ๊ด์ฐฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ํ์ฌ ์ฝ๋๋ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ์ง ์์ต๋๋ค.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์ ๋ง์ ์
๋ก๋๋ฅผ ์ํํ ๋ ๋ฐ์ํ๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ์ ๋์ ์ผ๋ก ๋ฌธ์ ์ ๋๋ค. @darrelmiller๊ฐ ์ ์ํ ์๋ฃจ์ ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ์ดํด๊ฐ ๋ถ์กฑํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
Azure Traffic Manager๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค์ ์ํ๋ฅผ ํ๊ฐํฉ๋๋ค. ์งง์ TTL๋ก DNS ์์์ ์๋ํฉ๋๋ค. ํธ์คํธ๋ ์์ ์ด ๋น์ ์์ ์ด๋ผ๋ ๊ฒ์ ๋ง์ ์ฒ๋ผ ์์ง ๋ชปํ๊ณ C ์ฐ๊ฒฐ : ๋ซ๊ธฐ ํค๋๋ฅผ ๋ฐํํ๊ธฐ ์์ํฉ๋๋ค. ํธ๋ํฝ ๊ด๋ฆฌ์๋ ๋น์ ์ ์ํ๋ฅผ ๊ฐ์งํ๊ณ ๊ทธ์ ๋ฐ๋ผ DNS ํ์ธ์ ์กฐ์ ํฉ๋๋ค. ์ค๊ณ์ ์ด๊ฒ์ ํด๋ผ์ด์ธํธ์ ํธ์คํธ์ ์์ ํ ํฌ๋ช ํฉ๋๋ค... ๊ทธ๋๋ก ํธ๋ํฝ ๊ด๋ฆฌ์๊ฐ DNS๋ฅผ ํ์ธํ๋ ์ ์ HttpClient(๋ฌด์์์ ์ผ๋ก)๊ฐ ์๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ด์ ์ ํ์ธ๋ ํธ์คํธ๊ฐ ๋น์ ์ ์ํ๊ฐ ๋ ๋ ์ ํธ์คํธ๋ฅผ ์์ ํ์ง ์์ต๋๋ค.
netcore 1.1 ํ์ฌ ์ด ์ ํํ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ๊ณ ์์ต๋๋ค. ์ด์จ๋ ๋๋ ํ๊ณ ๋ ๊ฒ์ ๋ณด์ง ๋ชปํ๋ค.