๐Ÿ˜ˆ ์›น ํฌ๋กค๋Ÿฌ 'ํšŒํ”ผ ๊ธฐ๋™' (์ž‘์„ฑ์ค‘)

mowinckelยท2020๋…„ 5์›” 1์ผ
17
post-thumbnail

๐Ÿค— ์ด ๊ธ€์—๋Š” ์š•์„ค์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

โœ๏ธ ์ด ๊ธ€์€ ์•„์ง ๋ฏธ์™„์„ฑ์ธ ์ƒํƒœ๋กœ ์—ด์‹ฌํžˆ ์ž‘์„ฑ ์ค‘์ธ ๊ธ€์ž…๋‹ˆ๋‹ค.

๐Ÿค” ํšŒํ”ผ ๊ธฐ๋™์ด๋ž€?

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

๐Ÿ’ก ์•„์ด๋””์–ด

์ฒ˜์Œ ์ƒ๊ฐ ํ•ด ๋†“์€ ์•„์ด๋””์–ด๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€์ด๋‹ค. ๋‘๊ฐœ์˜ NIC์˜ ์žฅ์ฐฉํ•œ ์„œ๋ฒ„๋ฅผ ์ž„๋Œ€ํ•˜๊ฑฐ๋‚˜ Google Cloud๋‚˜ AWS๋กœ๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ๊ฐœ์˜ IP๋ฅผ ํ• ๋‹น ๋ฐ›์•„ ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉฐ ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฐฉ๋ฒ•์€ ๋Œ€์ถฉ ์ƒ๊ฐ ํ•ด ๋ด๋„ "ํ• ๋‹น ๋ฐ›์€ IP ์ „๋ถ€ ์ฐจ๋‹จ ๋‹นํ•˜๋ฉด ์–ด์ฉ”๊ฑด๋ฐ?"๋ผ๋Š” ๋ฌผ์Œ์—์„œ ๋‹ต์„ ์ฐพ๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค. ๋˜ ์—ฌ๋Ÿฌ๊ฐœ์˜ IP๋ฅผ ์ž„๋Œ€ ํ•  ์ˆ˜๋ก ๋น„์šฉ๋„ ๋Š˜์–ด ๋‚  ๊ฒƒ์ด๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๋‚ด ๋‚˜๋ฆ„๋Œ€๋กœ ํšจ๊ณผ๋ฅผ ๋ณธ ๋ฐฉ๋ฒ• ๋‘๊ฐ€์ง€๋ฅผ ๋ฉ”๋ชจ ํ•ด ๋‘๋ ค ํ•œ๋‹ค.

์‚ฌ์‹ค ์›น ํฌ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ณธ ์‚ฌ๋žŒ๋“ค์ด๋ผ๋ฉด target ์›น ํŽ˜์ด์ง€๋ฅผ ์ˆ˜๋ถ„์— ํ•œ ๋ฒˆ ์ •๋„ ๊ธ๋Š” ์ •๋„๋ผ์„œ IP Block๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋Š” ์ž˜ ์—†์œผ๋ฆฌ๋ผ ์ƒ๊ฐ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ target site๋ฅผ ์‹ค์‹œ๊ฐ„์— ๊ฐ€๊น๊ฒŒ content ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ ํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— IP ํšŒํ”ผ ๊ธฐ๋™์„ ์ƒ๊ฐ ํ•ด ๋‚ด์•ผ๋งŒ ํ–ˆ๋‹ค.

์‹ค์‹œ๊ฐ„ ์Šค์บ”์„ ํ•œ๋‹ต์‹œ๊ณ  ๋ฌด์ž‘์ • 1์ดˆ์— 1๋ฒˆ, 3์ดˆ์— 1๋ฒˆ ๋“ฑ์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒ ํ–ˆ๋‹ค๊ฐ„ ์ฐจ๋‹จ์ด ์•„๋‹ˆ๋ผ ๊ณ ์†Œ์žฅ์ด ๋‚ ์•„ ์˜ฌ ๊ฒƒ์€ ๋ถˆ ๋ณด๋“ฏ ๋ป” ํ•œ ์ผ์ด๊ธฐ์— ๊ฐ„๋‹จํ•˜๊ฒŒ '๋‹ค์Œ์— ๋ฐฉ๋ฌธํ•  ์‹œ๊ฐ„'์„ HTML ๋‚ด์šฉ ๋ณ€๊ฒฝ ์ •๋„์— ๋”ฐ๋ผ ๊ฒฐ์ •ํ•˜๋„๋ก ๊ฐ„๋‹จํ•œ ์ˆ˜์‹์„ ์ž‘์„ฑ ํ•˜์˜€๋‹ค. ์ฝ”๋“œ๋กœ ์“ฐ๋ฉด ๋Œ€์ถฉ ์•„๋ž˜์™€ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

// [Deafult]
// url.visitInterval = time.Second * 60


if time.Since(url.previousVisitedTime) <= url.visitInterval {
	url.lastVisitedTime = time.Now()
	diff = ContentDiff(lastHTML, currentHTML)
    url.visitInterval = time.Second * 10 + (time.Second * diff * -1)
}

๋Œ€์ถฉ ๊ธฐ์–ต๋‚˜๋Š”๋Œ€๋กœ ์ผ๊ธฐ ๋•Œ๋ฌธ์— ๋งž๋Š” ์ฝ”๋“œ๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์‹ ๊ฒฝ ์“ฐ์ง€ ๋ง์ž. ์š”์ ์€ HTML content์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†๊ฑฐ๋‚˜ ์ ์œผ๋ฉด nextVisit์˜ ๊ฐ’์€ ๊ฑฐ์˜ ๊ทธ ์ƒํƒœ๋กœ ์œ ์ง€ ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค. default ๊ฐ’์ด 60์ดˆ ์˜€๊ณ  ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ ๋ณ„ ๋ณ€ํ™”๊ฐ€ ์—†๋Š” ํŽ˜์ด์ง€๋ผ๋ฉด ๋ฐฉ๋ฌธ ๊ฐ„๊ฒฉ์€ ๊ฑฐ์˜ ํ•ญ์ƒ 60์ดˆ๋ฅผ ์™”๋‹ค ๊ฐ”๋‹ค ํ•  ๊ฒƒ์ด๊ณ  ์–ด๋Š ์ˆœ๊ฐ„ ํŽ˜์ด์ง€์— ๋ณ€ํ™”๊ฐ€ ๊ณ„์† ์ƒ๊ธด๋‹ค๋ฉด 50, 40, 30์œผ๋กœ ์ค„์–ด๋“ค๋ฉด์„œ ๋ฐฉ๋ฌธ ๊ฐ„๊ฒฉ์ด ์ค„์–ด ๋“ค ๊ฒƒ์ด๋‹ค.

๊ฒฐ๊ตญ 100๊ฐœ์˜ target page๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•˜๋ฉด ์ด ์ค‘ '์‹ค์ œ๋กœ ๋ณ€ํ™”๊ฐ€ ์žฆ์€ ํŽ˜์ด์ง€'๋งŒ interval ๊ฐ„๊ฒฉ์ด 0์— ์ˆ˜๋ ดํ•˜๊ฒŒ ๋˜๊ณ  ๋ณ€ํ™”๊ฐ€ ์—†๋Š” ๋…€์„๋“ค์€ itnerval์ด ์ ์  ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜๋Š” ๊ฐ„๋‹จํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง ๋Œ€๋ฅ™ ๋ถ„์‚ฐ

์ฒซ ๋ฒˆ์งธ ์•„์ด๋””์–ด๋Š” ๊ฐ ๋Œ€๋ฅ™๋ณ„๋กœ ํฌ๋กค๋Ÿฌ๋“ค์„ ๋ถ„์‚ฐ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. AWS๋‚˜ GCP๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ค์šด ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ์•„์ด๋””์–ด๋ฅผ ์„ค๋ช…ํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ์„œ์šธ, ๋„์ฟ„, ํ™์ฝฉ์— ํฌ๋กค๋Ÿฌ๋“ค์„ ๋ถ„์‚ฐ ์‹œ์ผœ ๋‘”๋‹ค.
  2. '๋„์ฟ„'์˜ ํฌ๋กค๋Ÿฌ๊ฐ€ target์— request๋ฅผ ๋ณด๋‚ด๋ฉฐ ํฌ๋กค์„ ์‹œ์ž‘ํ•œ๋‹ค.
  3. '๋„์ฟ„'๊ฐ€ IP block ๋์„ ๊ฒฝ์šฐ ์‹คํŒจํ•œ URL์„ '์„œ์šธ' ํฌ๋กค๋Ÿฌ์—๊ฒŒ Fetchํ•ด ์ค€๋‹ค.
  4. ๋„์ฟ„๊ฐ€ ์‹คํŒจํ•œ URL์€ ์ดํ›„๋กœ IP block์ด ํ’€๋ฆด ๋•Œ ๊นŒ์ง€ ์„œ์šธ ํฌ๋กค๋Ÿฌ๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค.

๊ฐ ๋Œ€๋ฅ™๋ณ„๋กœ ํฌ๋กค๋Ÿฌ๋“ค์„ ๋ถ„์‚ฐํ•˜๋ฉด ์™„์ „ํžˆ ๋‹ค๋ฅธ IP ๋Œ€์—ญ์„ ๊ฐ–๊ฒŒ ๋˜๊ณ  ์ด๋Š” IP black list๋ฅผ ํšŒํ”ผํ•˜๊ธฐ ์šฉ์ด ํ•ด ์ง„๋‹ค.

๋ถ„์‚ฐ ์›น ํฌ๋กค๋ง

๋‹ค๋งŒ ์œ„์˜ ์•„์ด๋””์–ด๋Š” ๊ฐ ๋ฆฌ์ „์— ์œ„์น˜ํ•œ ํฌ๋กค๋Ÿฌ ์„ธ ๋Œ€๊ฐ€ ๋ชจ๋‘ ํ˜‘์—…์„ ์ž˜ ํ•œ๋‹ค๋Š” ๊ฐ€์ •ํ•˜๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์•ผ๊ธฐ๋‹ค. Distributed ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ์•„์ฃผ ๋งค๋ ฅ์ ์ด๊ณ  ๋” ๊ณ ๋‚œ๋„์˜ ๊ธฐ์ˆ ์ด์ง€๋งŒ ์„ธ ๋Œ€์˜ ํฌ๋กค๋Ÿฌ๊ฐ€ ๋ฐฉ๋ฌธํ•˜๋Š” URL๋“ค์ด ์„œ๋กœ ์ž˜ ๊ณต์œ ๊ฐ€ ๋˜์–ด์•ผ ํ•˜๊ณ  '๋™๊ธฐํ™”' ํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ๋Œ€๋ฅ™ ๋ณ„๋กœ ๋ถ„์‚ฐ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์€ latency๊ฐ€ ํ•„์—ฐ์ ์œผ๋กœ ํด ์ˆ˜ ๋ฐ–์— ์—†๋‹ค๋Š” ๊ฒƒ์ด๊ณ  ์ด๋ฅผ ํ•ด๊ฒฐํ•  ๋ฉ‹์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”ํ•˜๋‹ค. ํฌ๋กค๋Ÿฌ๋“ค์ด ๋ถ„์‚ฐ ํ˜‘์—…์„ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ˆœ๊ฐ„, ์‚ฌ์ดํŠธ๋กœ ๋ถ€ํ„ฐ block ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ ํฌ๋กค๋Ÿฌ๋ผ๋ฆฌ์˜ ํ†ต์‹ ์ด ๋Š์–ด์ง€๋Š” ๊ฒฝ์šฐ๋„ ์ž˜ ์ƒ๊ฐํ•ด์•ผ๋งŒ ํ–ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ URL Fetcher๊ฐ€ ๋’ค์ ธ๋ฒ„๋ฆฌ๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜์ง€? Single Point of Failure๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ Zookeeper๊ฐ€ ๋™์›๋˜๊ณ  ์ด ์ฏค ๋˜๋ฉด ๋Œ€๋žต ์ •์‹ ์ด ๋ฉ ํ•ด ์ง€๋ฉด์„œ ๋‚ด๊ฐ€ ์ผ๊ฐœ ์›น ํŽ˜์ด์ง€ ํฌ๋กค๋ง ์ข€ ํ•˜๊ฒ ๋‹ต์‹œ๊ณ  ์ด๋ ‡๊ฒŒ๊นŒ์ง€ ํ•ด์•ผํ•˜๋‚˜ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

๐Ÿ“Ž http://ilpubs.stanford.edu:8090/733/1/2002-9.pdf

๋ถ„์‚ฐ ์›น ํฌ๋กค๋ง์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ์ฝ์–ด๋ด์•ผํ•  ๋…ผ๋ฌธ์ด ์žˆ๋‹ค. ์—ฌ๋Ÿฌ๋Œ€์˜ node๋กœ ๊ตฌ์„ฑ๋œ ํฌ๋กค๋Ÿฌ๊ฐ€ www๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ์ œ์‹œํ•˜๊ณ  ์žˆ๋‹ค.

ํšจ๊ณผ์ ์ธ๊ฐ€?

๋ญ๋“ ์ง€ '๋ถ„์‚ฐ'ํ•˜๋Š” ๊ฒƒ์€ ์‰ฌ์šด ์ผ์€ ์•„๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ์ตœ์ดˆ์—๋Š” ๋Œ€๋ฅ™ ๋ถ„์‚ฐ๋งŒ์„ ํ•ด๋‘๊ณ  ํฌ๋กค๋Ÿฌ ์„ธ ๋Œ€ ์ค‘ ํ•œ๋Œ€๋งŒ์„ ๊ฐ€๋™ํ–ˆ๋‹ค. ๋งŒ์•ฝ Failed URL์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ์ œ์„œ์•ผ ๋‹ค๋ฅธ '์„œ์šธ'์ด๋‚˜ 'ํ™์ฝฉ'์˜ ํฌ๋กค๋Ÿฌ๋“ค์ด ๊นจ์–ด๋‚˜์„œ ํ•ด๋‹น URL๋งŒ ๊ธ๊ณ  ๋‹ค์‹œ ์ž ๋“ค์–ด ๋ฒ„๋ฆฌ๋„๋ก ํ•˜์˜€๋‹ค.

์ด ์•„์ด๋””์–ด๋Š” ๋Œ€๋ฅ™ ๋ณ„๋กœ ํ˜‘์—…์„ ํ•˜๋Š” ๋“ฏํ•œ ๋ถ„์œ„๊ธฐ๋กœ ์•„์ฃผ ๋ฉ‹์ง„ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋‹ค์ง€ ํšจ์œจ์ ์ด์ง€ ์•Š๋‹ค. ์„ธ ๋Œ€์˜ ์„œ๋ฒ„ ๋น„์šฉ์„ ๊ฐ๋‹น ํ•ด์•ผํ•˜๊ณ  ๋ถ„์‚ฐ ๋œ ํฌ๋กค๋Ÿฌ๋“ค์„ ์ž˜ ๋™๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•˜๋ฉฐ ์ด ๋•Œ Master / Slave ๊ตฌ์กฐ๋กœ์„œ URL Fetcher ์„œ๋ฒ„๊ฐ€ ๋”ฐ๋กœ ํ•„์š” ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํฌ๋กค๋Ÿฌ๋“ค์ด P2P ๊ตฌ์กฐ๋กœ ๊ฐ์ž๊ฐ€ ํ•˜๋‚˜์˜ ๋…๋ฆฝ๋œ ํฌ๋กค๋Ÿฌ๋ผ๋ฉด ์ค‘๋ณต ๋ฐฉ๋ฌธ์„ ์–ด๋–ป๊ฒŒ ์ž˜ ๊ด€๋ฆฌ ํ• ์ง€๊ฐ€ ๊ณ ๋ฏผ์ด๋‹ค.

  • ํ•ด์™ธ ์•„์ดํ”ผ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ฒฝ์šฐ ์„œ์šธ ๋ฆฌ์ „์˜ ํฌ๋กค๋Ÿฌ ์™ธ์—” ๋ชจ๋‘ Block๋˜์–ด ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ˆœํžˆ ํฌ๋กค๋Ÿฌ 3๋Œ€์˜ IP๋ฅผ ๋ชจ๋‘ ์ฐจ๋‹จํ•˜๋ฉด ๋ฌด์šฉ์ง€๋ฌผ์ด ๋œ๋‹ค.
  • ์„œ๋ฒ„ ๋น„์šฉ์ด 3๋ฐฐ๋‹ค. ํ•„์š” ํ•  ๋•Œ๋งŒ Wakeํ•˜๊ณ  ๋‹ค์‹œ Sleepํ•˜๊ฒŒ ํ•œ๋‹ค๋ฉด ๋น„์šฉ์ด ์ค„๊ฒ ์ง€๋งŒ Wake ์‹œ๊ฐ„ ๋•Œ๋ฌธ์— '์‹ค์‹œ๊ฐ„' ํฌ๋กค๋ง๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€์–ด์ง„๋‹ค.
  • ๋ถ„์‚ฐ ํฌ๋กค๋ง์˜ ๋ชจ๋ธ์ด ๋ฌด์—‡์ด๋“ ๊ฐ„์— ํฌ๋กค๋Ÿฌ ์„œ๋ฒ„ 3๋Œ€ ์™ธ์— ๊ด€๋ฆฌ ํ•ด์•ผํ•  ์„œ๋ฒ„๊ฐ€ ๋” ๋Š˜์–ด ๋‚  ์ˆ˜ ์žˆ๋‹ค. k8s์™€ ๊ฐ™์ด docker๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐ ํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

๐Ÿ˜Ž ํ”„๋ก์‹œ ์„œ๋ฒ„, Request ๋ถ„์‚ฐ

๋‹จ ํ•˜๋‚˜์˜ ๋จธ์‹ ๋งŒ์œผ๋กœ๋„ 1์ดˆ์— 5๋ฒˆ 10๋ฒˆ์”ฉ request๋ฅผ ๋‚ ๋ ค๋„ block ๋‹นํ•˜์ง€ ์•Š๊ณ  ์ง€์†์ ์œผ๋กœ page๋ฅผ ํฌ๋กค ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ? ์ด๋ฒˆ ์•„์ด๋””์–ด๋Š” ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๊ตฌ์„ฑํ•˜๊ณ  ํฌ๋กค๋Ÿฌ์˜ Request๋ฅผ Load Balancingํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

L5/L7 Load Balancer๋Š” ํด๋ผ์ด์–ธํŠธ์˜ Request๋ฅผ ์ž˜ ๋ถ„์‚ฐํ•ด์„œ WAS์— ์ „๋‹ฌํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ๋Š” ๊ทธ ๋ฐ˜๋Œ€๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ํฌ๋กค๋Ÿฌ์˜ ์š”์ฒญ์„ ์ž˜ ๋ถ„์‚ฐํ•ด์„œ target domain์— ์ „๋‹ฌ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์•ž์„œ ๋งํ•œ ๋Œ€๋ฅ™ ๋ถ„์‚ฐ์€ ์‹ค์ œ๋กœ ํฌ๋กค๋Ÿฌ๋“ค์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ํ•ด๋‹น ๋ฆฌ์ „์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๊ตณ์ด ํฌ๋กค๋Ÿฌ๋ฅผ '๊ทธ ์ง€์—ญ'์— ๋ฐฐ์น˜ํ•˜์ง€ ์•Š๊ณ ์„œ๋„ '๊ทธ ์ง€์—ญ'์ธ ์ฒ™ ํ‰๋‚ด๋ฅผ ๋‚ผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. AWS๋‚˜ GCP๋Š” ๋ชจ๋‘ '์„œ์šธ'๋ฆฌ์ „๋งŒ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์— ๋น„ํ•ด ํ”„๋ก์‹œ ์„œ๋ฒ„๋Š” ๊ตญ๋‚ด์˜ ๋” ์ •ํ™•ํ•œ ์œ„์น˜์ธ ๋Œ€์ „, ๋Œ€๊ตฌ, ๊ด‘์ฃผ, ๋ถ€์‚ฐ๋“ฑ์˜ ์œ„์น˜๋กœ ๋” ์ •๊ตํ•˜๊ฒŒ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์–ด IP block์— ๋” ์ž˜ ๋Œ€ํ•ญ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•ด์™ธ์˜ ์œ„์น˜๋„ ๋„์ฟ„, ์˜ค์‚ฌ์นด, ์ง€๋ฐ” ๋“ฑ์œผ๋กœ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ฒ˜์Œ์—๋Š” ์ „๊ตญ์— ์˜คํ”ˆ ๋˜์–ด ์žˆ๋Š” SOCK4/5 ๋˜๋Š” HTTP/S ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ list๋กœ ๊ตฌ์ถ•ํ•˜๊ณ  Round Robin์œผ๋กœ Request๋ฅผ ๋‚ ๋ ธ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ์ „๊ตญ ํŒ”๋„ ์‚ฌ๋‚˜์ด๋“ค์ด ๋ชฝ๋‘ฅ์ด ๋“ค๊ณ  ์„œ์šธ์—ญ์—์„œ ๋งŒ๋‚˜์„œ ๋‹ค๊ฐ™์ด ๋ˆ„๊ตด ๋‘๋“ค๊ฒจ ํŒจ๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ€์Šด์ด ์›…์žฅํ•ด์ง„๋‹ค.

์‹ฑ๊ธ€ ๋จธ์‹ 

์ด๋ ‡๊ฒŒ ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๊ฐ–๊ณ  Http ์š”์ฒญ์„ ๊ฒฝ์œ ํ•˜๊ฒŒ ํ•˜๋ฉด ๋‹จ ํ•œ ๋Œ€์˜ ๋จธ์‹ ์œผ๋กœ ๋ถ„์‚ฐ ํฌ๋กค๋ง์„ ํ‰๋‚ด ๋‚ด๋ฉด์„œ IP ์—ญ์‹œ ํšŒํ”ผ ๊ธฐ๋™ ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

๋Œ€์ถฉ ์•„๋ž˜ ์ฒ˜๋Ÿผ ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ Circular ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅํ•ด ๋‘๊ณ  http ์š”์ฒญ์„ ๋‚ ๋ฆด ๋•Œ ๋งˆ๋‹ค ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ด๋™ํ•ด์„œ ๋‚ ๋ฆฌ๋„๋ก ํ•œ๋‹ค.

struct type ProxyServerNode {
    Host string
    Next *ProxyServerNode
}

func RequestBalancing(list string) {
	var byUsingThisNode *ProxyServerNode = ...
    
	for l := range list {
            httpRequest(l, byUsingThisNode)
    	    byUsingThisNode = byUsingThisNode.Next
    }
}

์ด์ œ Round Robin๋ฅผ ์“ฐ๊ฑฐ๋‚˜ Response Time์ด ๊ฐ€์žฅ ๋น ๋ฅธ ์ชฝ์œผ๋กœ Reqest๋ฅผ ๋” ๋ชฐ์•„์ฃผ๋˜์ง€ ๋‹ค ์‹ซ์œผ๋ฉด ํ”„๋ก์‹œ ์„œ๋ฒ„์˜ Availability๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •์˜ ํ•ด ๋ณด๊ฑฐ๋‚˜ ํ•˜๋ฉด ๋œ๋‹ค. ๊ตญ๋‚ด์— ๊ณต๊ฐœ๋œ ํ”„๋ก์‹œ ์„œ๋ฒ„๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ HA๋ฅผ ์žฅ๋‹ดํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— response time ๋ณด๋‹ค๋Š” Availability๋ฅผ ๋”ฐ์ง€๋Š” ์ชฝ์ด ๋” ํšจ๊ณผ์ ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.

์ง์ ‘ Proxy ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ Server closeํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„์ฃผ ๋งŽ๋‹ค. ์„ฑ๊ณตํ•œ ์š”์ฒญ๋“ค์€ ๊ฑฐ์˜ 50ms ์ด๋‚ด๋กœ ๋น ๋ฅธ๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๋Ÿฐ ๊ฒฝ์šฐ๊ฐ€ ์žฆ์€๋ฐ Throttle์ด ๊ฑธ๋ ค ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

Time-out

์ด์ œ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋‚จ์•˜๋‹ค. ๋ฐ”๋กœ ํ”„๋ก์‹œ ์„œ๋ฒ„๊ฐ€ ๋ง›ํƒฑ์ด๊ฐ€๋Š” ๊ฒฝ์šฐ๋‹ค. ์‹ค์‹œ๊ฐ„์œผ๋กœ ํฌ๋กค๋ง์„ ํ•ด์•ผํ•˜๋‹ˆ timeout์„ ์ž˜ ์ƒ๊ฐ ํ•ด ๋ณด์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๋œ ๊ฒƒ์ด๋‹ค. ์•ˆ ๊ธํžˆ๋Š” ์›น ํŽ˜์ด์ง€๋ฅผ ์ฒœ๋…„ ๋งŒ๋…„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ„ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๊ธ์ง€ ๋ชปํ•˜๊ณ  ์•…์ˆœํ™˜์ด ๋ฐ˜๋ณต ๋  ๊ฒƒ์ด๋‹ค.

๋ฌผ๋ก  ๋ณ‘๋ ฌ๋กœ req ํ•œ๋‹ค๋˜์ง€ ์–ด๋–ป๊ฒŒ๋“  ํ•ด์„œ ๋™์‹œ req๋ฅผ ๋ณด๋‚ธ๋‹ค๋˜์ง€ ํ•˜๋ฉด ์•ˆ ๊ธํžˆ๋Š” ํŽ˜์ด์ง€๋Š” ๋ฌด์‹œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณ‘๋ ฌ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค๋ฉด ํ•„์—ฐ์ ์œผ๋กœ http request pool์„ ์‚ฌ์šฉ ํ•  ํ…๋ฐ pool์— ์žˆ๋Š” ์†Œ์ผ“ ํ•˜๋‚˜๋ฅผ ๋„ˆ๋ฌด ์˜ค๋žซ๋™์•ˆ ์ ์œ ํ•ด์„  ์•ˆ๋˜๋‹ˆ timeout์˜ ์„ค์ •์€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ์ด๊ฑด req๋ฅผ ๋ณด๋‚ด๋Š” ์ž…์žฅ์ด ์•„๋‹ˆ๋ผ req๋ฅผ ๋ฐ›๋Š” ์„œ๋ฒ„ ์ž…์žฅ์ด ๋˜์–ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ์•„ ์•„๋ฌดํŠผ timeout ์ค‘์š”ํ•˜๋‹ค๊ณ .

Http time out์— ๋Œ€ํ•ด์„œ๋„ ๋”ฑํžˆ ์ž˜ ์„ค๋ช…๋œ ๊ธ€์ด ์—†์–ด์„œ ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋„ ์–ธ์  ๊ฐ€ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค.

Timeout๋„ Layer ๋‹จ๊ณ„๋ณ„๋กœ TCP handshake ๊ณผ์ •์—์„œ timeout์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  Http์—์„  header๋ฅผ ์ฝ๋‹ค๊ฐ€ timeout, ๋˜๋Š” body๋ฅผ ์ฝ๋‹ค๊ฐ€ timeout์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ธ”๋กœ๊ทธ ์„ค๋ช…๊ธ€์€ ์ด timeout ๊ฐ’์„ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐ์น˜ ์•Š๊ณ  ์ฝ”๋“œ ์ƒ์— ๊ทธ๋ƒฅ '1์ดˆ' ๋˜๋Š” '5์ดˆ' ์ •๋„๋กœ ์ ๋‹นํžˆ ์จ๊ฐˆ๊ฒจ ๋†“๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ ๋งˆ๋ จ์ธ๋ฐ ์ด๋ฒˆ ๊ธฐํšŒ์— ์ •ํ™•ํžˆ ์•Œ์•„ ๋ณด์ž. ๋ฌผ๋ก  ๋‚ด๊ฐ€ ์•Œ๋ ค์ฃผ๊ธด ๊ท€์ฐฎ๊ณ  ์•„๋ž˜ ๋งํฌ ๋‹ฌ์•„๋‘๊ฒ ์Œ. ใ…‹ใ…‹.

๐Ÿ“Ž The complete guide to Go net/http timeouts


์•„๋ฌดํŠผ Go๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•œ๋‹ค๋ฉด http.Clinet์—์„œ ์„ค์ •ํ•˜๋Š” Timeout์€ Dial๊ฑฐ๋Š” ์ˆœ๊ฐ„ ๋ถ€ํ„ฐ Body์˜ ์‘๋‹ต์ด ์˜ค๋Š” ์‹œ๊ฐ„๊นŒ์ง€๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Go์˜ ํŒจํ‚ค์ง€ ์ค‘ http.Get์€ timeout์ด ์„ค์ • ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค! ์‚ฌ์šฉ์— ํ•  ๋•Œ ์ž˜ ์ƒ๊ฐ ํ•ด ๋ด์•ผํ•œ๋‹ค.

Go Doc์„ ์ž์„ธํžˆ ๋ณด๋ฉด ์•„๋ž˜ ์ฒ˜๋Ÿผ ๊ฐ ๋ ˆ์ด์–ด ๋ณ„๋กœ ์ •๋ฐ€ํ•˜๊ฒŒ timeout ๊ฐ’์„ ์„ค์ • ํ•  ์ˆ˜ ์žˆ๋‹ค.

c := &http.Client{
    Transport: &http.Transport{
        Dial: (&net.Dialer{
                Timeout:   30 * time.Second,
                KeepAlive: 30 * time.Second,
        }).Dial,
        TLSHandshakeTimeout:   10 * time.Second,
        ResponseHeaderTimeout: 10 * time.Second,
        ExpectContinueTimeout: 1 * time.Second,
    }
}

์ด ๊ฒฝ์šฐ TLS handshake๊ฐ€ 10์ดˆ ์ด์ƒ ๊ฑธ๋ฆฌ๋ฉด timeout ์—๋Ÿฌ๋ฅผ ๋‚ด๊ณ  ์ฃฝ์–ด ๋ฒ„๋ฆด ๊ฒƒ์ด๋‹ค.

(์ž‘์„ฑ์ค‘)

profile
๊ฒฝ๋ ฅ๋„ ์ด๋ ฅ๋„ ์—†๋Š” ๋ณ‘์‹  ๐Ÿ™ƒ

6๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2020๋…„ 5์›” 2์ผ

์ข‹์€ ์•„์ด๋””์–ด๋„ค์š” ๐Ÿ‘

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 9์ผ

์ž˜ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค!

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 17์ผ

๋‹จ๋ฌผ๊ฐ™์€ ๊ธ€ ์ž˜ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค

1๊ฐœ์˜ ๋‹ต๊ธ€