Sessions: FilesystemStore์˜ ๊ฒฝ์Ÿ ์กฐ๊ฑด

์— ๋งŒ๋“  2013๋…„ 06์›” 11์ผ  ยท  23์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: gorilla/sessions

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

  1. ์š”์ฒญ 1์€ ์„ธ๋ฏธ ๋กฑ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ์…˜์„ ์—ฝ๋‹ˆ ๋‹ค.
  2. ์š”์ฒญ 2๋Š” ์„ธ์…˜์„ ์—ฝ๋‹ˆ ๋‹ค.
  3. ์š”์ฒญ 2 "๋กœ๊ทธ ์•„์›ƒ"๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  4. 2 ํšŒ ์ €์žฅ ์š”์ฒญ
  5. ์š”์ฒญ 1 ์ €์žฅ, ๋งˆ์น˜ ์„ธ์…˜์ด ๋กœ๊ทธ ์•„์›ƒ๋˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด ๊ฒฐํ•จ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ cless / sessions @ f84abeda17de0b4fcd72d277412f3d3192f206f2์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์ง์ ‘์ ์ธ ๋ฐฉ๋ฒ•์€ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ˆ˜์ค€์—์„œ ์ž ๊ธˆ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ golang์—๋Š” ํŒŒ์ผ ์ž ๊ธˆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ต์ฐจ ํ”Œ๋žซํผ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋…ธ์ถœ์„ํ•˜์ง€ flock ์— syscall ํ•˜์ง€๋งŒ ๊ฒฝ์šฐ์—๋งŒ OS ์ง€์›์„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ์œ ๋‹‰์Šค์—์„œ ๋ฌด๋ฆฌ์˜ ํ–‰๋™์ด ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. flock์˜ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” NFS์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๊ฒฐ๊ตญ, ๊ฐ€์žฅ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ ์ €์žฅ์†Œ ๊ฐ์ฒด์— ์ž ๊ธˆ ๋งต์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๋ชจ๋“  ๋‹จ์ ์„ ์ ์ ˆํ•˜๊ฒŒ ๋ฌธ์„œํ™” ํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ ๋™์ž‘์ด ๋™์ผํ•˜๋‹ค๊ณ  ์‘๋‹ต ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

FilesystemStore๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š” ๋‹ค๋ฅธ ์Šคํ† ๋ฆฌ์ง€ ๋ฐฑ์—”๋“œ๋Š”์ด ๊ฒฐํ•จ์„ ๋ณต์‚ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋‚ด boj / redistore # 2 ํ”„๋กœ์ ํŠธ์˜ Redistore ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ†  ํ•  ๋•Œ์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค).

bug stale

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

์ž ๊ธˆ ๋Œ€์‹  ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? Session ๊ฐœ์ฒด๋Š” lastModified ํ•„๋“œ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ์…˜์„ ์„ธ์…˜ ์ €์žฅ์†Œ์— ๋‹ค์‹œ ์ €์žฅํ•˜๋ ค๊ณ ํ•˜๋ฉด ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฝ์€ ์ดํ›„ ์ˆ˜์ •๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์„ธ์…˜์„ ๋‹ค์‹œ ๊ฐ€์ ธ ์™€์„œ ์žฌ ์‹œ๋„ํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ •๋ฆฌํ•ด์•ผํ•˜๋Š” ์ž ๊ธˆ์ด์—†๊ณ  ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์ด ์ด๋ฏธ ์ˆ˜ํ–‰ ํ•œ ์ž‘์—…์— ๋”ฐ๋ผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋ฏธ์žˆ๋Š” ์žฌ ์‹œ๋„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž ๊ธˆ์ด ํ™•์‹คํžˆ ๋” ์•ˆ์ „ํ•œ ์˜ต์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ API๊ฐ€ ์‹คํŒจ ๊ฐ€๋Šฅ์„ฑ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฌธ์„œํ™”ํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ถ€์ง€๋Ÿฐํžˆ ์ฒ˜๋ฆฌํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์ด ํ™•์‹คํžˆ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, FilesystemStore ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€ ๋ฐฑ์—”๋“œ์— ๋Œ€ํ•ด API๋ฅผ ์ค€๋น„ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ session.Save() ๋‘ ๋ฒˆ ์ด์ƒ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด session.Release() ๋„์ž…ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค

RediStore์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. @cless ์ •๋ณด๋ฅผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

ํ˜„์žฌ๋กœ์„œ๋Š” ์žฅ๊ธฐ์ ์œผ๋กœ ์˜ณ์€ ์ผ์„ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์–ด๋–ค ์„ ํ˜ธ๋„ ์—†์Šต๋‹ˆ๋‹ค. :) ๋ฌผ๋ก  ๊ธฐ์กด API๋„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ๋ฐฉ์— ์ž ๊ธˆ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋งŽ์€ ์ถ”๊ฐ€ ๋ณต์žก์„ฑ๊ณผ ์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ํ”ผํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋‹ค๋ฅธ ์„ธ์…˜ ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๋“ค์ด ๋ฌด์—‡์„ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ PHP ์„ธ์…˜ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (PHP 5.4 tarball์—์„œ ๋ฐฉ๊ธˆ ํ™•์ธํ•œ ํŒŒ์ผ์ด ext/session/mod_files.c ์ž…๋‹ˆ๋‹ค. ext/standard/flock_compat.c ์ œ๊ณตํ•˜๋Š” ๋ฌด๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค).

php๊ฐ€ ๋ช…์„ฑ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ข‹์€ ์˜ˆ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ํ˜„์žฌ ๋‚ด๊ฐ€ ์•„๋Š” ์œ ์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Flask, Pyramid ๋˜๋Š” Django๊ฐ€ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์žˆ์œผ๋ฉด ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ๊ทธ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด Rails๋„ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ”ผ๋ผ๋ฏธ๋“œ ์™€ ํ”Œ๋ผ์Šคํฌ ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ„๋žตํžˆ ์ฝ์—ˆ์œผ๋ฏ€๋กœ ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Django๋Š” ์„œ๋ฒ„ ์ธก ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ž ์‹œ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ Django ์„ธ์…˜ ๋ฐฑ์—”๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋ฉฐ ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ต์ˆ™ํ•˜์ง€ ์•Š์€ Django ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ•ด์„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ฐฑ์—”๋“œ์—์„œ์ด ์ฃผ์„์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

        # Write the session file without interfering with other threads
        # or processes.  By writing to an atomically generated temporary
        # file and then using the atomic os.rename() to make the complete
        # file visible, we avoid having to lock the session file, while
        # still maintaining its integrity.
        #
        # Note: Locking the session file was explored, but rejected in part
        # because in order to be atomic and cross-platform, it required a
        # long-lived lock file for each session, doubling the number of
        # files in the session storage directory at any given time.  This
        # rename solution is cleaner and avoids any additional overhead
        # when reading the session data, which is the more common case
        # unless SESSION_SAVE_EVERY_REQUEST = True.
        #
        # See ticket #8616.

์ด๊ฒƒ์€ ์„ธ์…˜ ํŒŒ์ผ ๋‚ด์šฉ์ด ์ ˆ๋Œ€ ์—‰๋ง์ด๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜์ง€๋งŒ ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์žฅ๊ณ  ๊ฒฝํ—˜์ด ์žˆ๋‹ค๋ฉด cless / session @ f84abed ์™€ ๊ฐ™์€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Stackoverflow๋Š” ๋˜ํ•œ Django๊ฐ€ ์„ธ์…˜์—์„œ ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. http://stackoverflow.com/search?q=django+session+race+condition

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

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

์–ด์จŒ๋“  ๊ทธ๊ฒŒ ์ง€๊ธˆ ์ œ ์ƒ๊ฐ์ด์ง€๋งŒ ๋” ๋…ผ์˜ํ•˜๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์žฅ๊ธฐ์ ์œผ๋กœ ์ด๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋„๋ฉ”์ธ ๋ฌธ์ œ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

cless ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๊ฒŒ์‹œ ๋œ ๊ฒฝ์šฐ ์š”์ฒญ 1์ด ์š”์ฒญ 2๊ฐ€ ๋ณ‘๋ ฌ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ์„๋งŒํผ ์ถฉ๋ถ„ํžˆ ์˜ค๋ž˜ ์‹คํ–‰๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ (์˜ˆ : Angular.js๋กœ ์ž‘์„ฑ๋œ ๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ์ผ๋ถ€ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋น„๋™๊ธฐ Node.js ์•ฑ) ์žฅ๊ธฐ ์‹คํ–‰ ์š”์ฒญ์€ ์„ธ์…˜์—์„œ ๋ถ„๋ฆฌ๋˜์–ด์•ผํ•˜๋ฉฐ ๊ทธ ์‹œ์ ์—์„œ ๋…๋ฆฝ์  ์ธ ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด๊ฒƒ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋ฌธ์ œ๋ฅผ ์ง์ ‘ ํ•ด๊ฒฐํ•˜์ง€๋Š” ์•Š์ง€๋งŒ kisielk๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ž ๊ธˆ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ•œ๊ณ„์— ๊ฐ€๊นŒ์šด ๊ฒฝ์šฐ์— ๋งŽ์€ ์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์„ธ์…˜ ๊ฒฝ์Ÿ ์กฐ๊ฑด์˜ ์˜ํ–ฅ์— ๋Œ€ํ•œ ์‹ค์ œ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ๋ฒ„๊ทธ๋Š” ๋””๋ฒ„๊ทธํ•˜๊ธฐ ์–ด๋ ต๊ณ  ๋ฌด์ž‘์œ„๋กœ ํ‘œ์‹œ๋˜๋ฉฐ ๊ฐœ๋ฐœ์ž์™€ ์‚ฌ์šฉ์ž ๋ชจ๋‘์—๊ฒŒ ์„ฑ๊ฐ€์‹œ๋‹ค. ajax๋ฅผ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์ถฉ๋ถ„ํžˆ ํฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ฃผ์–ด์ง€๋ฉด ์ด๋Ÿฌํ•œ ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ์กฐ๋งŒ๊ฐ„ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
http://www.hiretheworld.com/blog/tech-blog/codeigniter-session-race-conditions
http://www.chipmunkninja.com/Troubles-with-Asynchronous-Ajax-Requests-g@

๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃจ๋Š” EllisLab / CodeIgniter # 1746์—์„œ ์ „์ฒด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์—ˆ์ง€๋งŒ CodeIgniter๊ฐ€ ๊ฐ€๋”์”ฉ ์„ธ์…˜ ID๋ฅผ ๊ฐ•์ œ๋กœ ์žฌ์ƒ์„ฑํ•˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๋…ผ์˜๊ฐ€์ด ์‚ฌ์‹ค์„ ์ค‘์‹ฌ์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค๋Š” ์‚ฌ์‹ค๋กœ ์ธํ•ด ๋ฌธ์ œ๊ฐ€ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. .

ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ธ์…˜์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ค‘๋‹จ์‹œํ‚ฌ ์ˆ˜์žˆ๋Š” API์— ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์„ ๊บผ๋ฆฌ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๋ช‡ ๊ฐ€์ง€ ์„ ํƒ์  ์ž ๊ธˆ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์  API์— ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

type Store interface {
    Get(r *http.Request, name string) (*Session, error)
    New(r *http.Request, name string) (*Session, error)
    Save(r *http.Request, w http.ResponseWriter, s *Session) error
    Lock(r *http.Request, name string) error
    Release(r *http.Request, name string) error
}

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์˜ ์‚ฌ์šฉ์€ ์ „์ ์œผ๋กœ ์„ ํƒ ์‚ฌํ•ญ์ด๋ฉฐ (๊ฐœ์ธ์ ์œผ๋กœ ์„ธ์…˜์— ์“ธ ๋ชจ๋“  ์š”์ฒญ์„ ์ž ๊ทธ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€๋งŒ) ๊ธฐ์กด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ–ฅ์„์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ ๋œ ์ž ๊ธˆ ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž ๊ธˆ์ด MySQL๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์œ ์ง€๋˜๊ณ  ์ž ๊ธˆ์„ ํš๋“ ํ•œ ํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด ์ž ๊ธˆ์„ ํ•ด์ œ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์„ธ์…˜์ด ํšจ๊ณผ์ ์œผ๋กœ ๊ต์ฐฉ ์ƒํƒœ๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ž ๊ธˆ์€ ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ๋งŒ๋ฃŒ๋˜์–ด์•ผํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์–ด๋–ป๊ฒŒ ๋…ธ์ถœ๋˜์–ด์•ผํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฒŒ์‹œ๋ฌผ์„ ์˜ฌ๋ฆด ๋•Œ Boj์˜ ๋‹ต์žฅ์„ ๋†“์ณ์„œ ๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค.
์žฅ๊ธฐ ์‹คํ–‰ ์š”์ฒญ์€ ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ์œ„ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ 500ms ์ ˆ์ „์€ ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ํŠธ๋ฆฌ๊ฑฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์‹ค ์„ธ๊ณ„์—์„œ ์ด๋Ÿฌํ•œ ๊ฒฝํ•ฉ ์กฐ๊ฑด์€ "์งง์€"์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋„ ๋ฐœ์ƒํ•˜๋ฉฐ, ๊ทธ ๋นˆ๋„๋Š” ์ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋””๋ฒ„๊น…์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ์›์ธ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ถ€ํ•˜๊ฐ€ ๋†’์œผ๋ฉด ์งง์€ ์š”์ฒญ๋„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์—ผ๋‘์— ๋‘์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@cless ์ข‹์€ ํฌ์ธํŠธ.

์ œ์•ˆ ๋œ ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€๊ฒฝ์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

์ž ๊ธˆ ๋งŒ๋ฃŒ๋Š” RediStore์— ๋Œ€ํ•ด ๋น„๊ต์  ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Redis์—๋Š” ํ‚ค์— TTL์„ ์„ค์ •ํ•  ์ˆ˜์žˆ๋Š” EXPIRE ๋ช…๋ น์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์„ธ๋ถ„ํ™” ๋œ ์ž ๊ธˆ์€ ๋งŽ์€ ์œ ํ˜•์˜ ์„ธ์…˜ ์ €์žฅ์†Œ์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ์ƒ๋‹นํžˆ ๋น„ํšจ์œจ์ ์ด์ง€ ์•Š์„๊นŒ์š”? ๊ทธ๋ฆฌ๊ณ  ๋งŒ๋ฃŒ๋„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ์˜ ์ผ๋ถ€๋Š” ์„ธ์…˜์ด ๋” ์˜ค๋ž˜ ์กด์žฌํ•˜๋”๋ผ๋„ ์ €์žฅ์ด ์„ฑ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด๋˜์ง€ ์•Š์„๊นŒ์š”?

@kisielk , ๋น„ํšจ์œจ์  ์ธ ์ƒ์ ์˜ ์˜ˆ๋ฅผ ๋“ค์–ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋Œ€๋ถ€๋ถ„์˜ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ์ž ๊ธˆ์„ ์ƒ์„ฑ ํ•  ์ˆ˜์žˆ๋Š” ์ผ์ข…์˜ ์›์ž ์  ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค. SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ–‰ ๊ธฐ๋ฐ˜ ์ž ๊ธˆ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์—ฌ๊ธฐ์—์„œ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์ต์ˆ™ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค).
redis์™€ ๊ฐ™์€ ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ์˜ ์ž ๊ธˆ ๋ฐฉ๋ฒ•์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์™•๋ณต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
go๋Š” ํŒŒ์ผ ์ž ๊ธˆ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ต์ฐจ ํ”Œ๋žซํผ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ ์‹œ์Šคํ…œ ์ €์žฅ์†Œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. cgo๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ ํ”Œ๋žซํผ์„ ์ง€์›ํ•˜๋Š” ํ”Œ๋žซํผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์•„๋งˆ๋„ ํ”ผํ•  ์†”๋ฃจ์…˜ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ธ์…˜ ๊ณ ์ •์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ์„ธ์…˜์„ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ ์„ธ์…˜์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š๋Š” ํ•œ ์„ธ์…˜์ด ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ ์†”์งํžˆ ์ด๊ฒƒ์€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@boj , ๋ฌธ์ œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ €์žฅ์„ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ์ž ๊ธˆ์ด ์•„์ง ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•  ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž ๊ธˆ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์€ ์–ผ๋งˆ์ž…๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ๋งŽ์ด ์ข‹์•„ํ•˜๋Š”์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์‹œ๊ณ„๊ฐ€ ๊ฐ‘์ž๊ธฐ ์•ž์œผ๋กœ ๋›ฐ์ง€ ์•Š๊ฑฐ๋‚˜ ๋’ค๋กœ ๋ฌผ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ์— ์˜์กดํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์€ ์•ˆ์ „ํ•œ ๊ฐ€์ •์ด ์•„๋‹™๋‹ˆ๋‹ค.

func Lock(expiration time.Duration) time.Time {
    // Block here until the lock becomes your. Set the lock to expire after
    // dur+50ms. This extra 50 ms ensures that you never assume you own an
    // expired lock
    return time.Now().Add(expiration)
}

func main() {
    end := Lock(1000 * time.Millisecond)

    // Do your thing here ...
    // time.Sleep(1100 * time.Millisecond)

    if time.Now().After(end) {
        fmt.Println("Lock expired, throw an error")
    } else {
        fmt.Println("Good to go, save the session")
    }
}

@cless ๊ท€ํ•˜์˜ ์ „์ฒด ๋Œ“๊ธ€์€ @kisielk ์˜ ๊ฑฑ์ •๊ฑฐ๋ฆฌ๋ฅผ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. X๋Š” ์ด๊ฒƒ์„ํ•˜๊ณ , Y๋Š” ๊ทธ๊ฒƒ์„ํ•˜๊ณ , Z๋Š” ์–ด๋–ค ๊ทน๋‹จ์ด ๊ด€๋ จ๋˜์ง€ ์•Š๋Š” ํ•œ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋“œ๋ฌผ๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝํ•ฉ ์กฐ๊ฑด์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์ง€๋งŒ, ์ ์–ด๋„ ํ˜„์žฌ์˜ ๊ณ ๋ฆด๋ผ / ์„ธ์…˜ ๋””์ž์ธ์€ ๋งค์šฐ ๋‹จ์ˆœํ•˜๋ฉฐ ์ตœ์†Œํ•œ์˜ ๋†€๋ผ์šด ์ฒ ํ•™์˜ ์š”์†Œ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

์ œ์•ˆํ•œ๋Œ€๋กœ ๊ณ ๋ฆด๋ผ / ์„ธ์…˜์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋˜‘๊ฐ™์ด ์‰ฝ๊ฒŒ ์ž ๊ธˆ / ํ•ด์ œ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ฐฑ์—”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๊ต์ฒด ํ•  ์ˆ˜์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํšจ์œจ์ ์ธ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋„ˆ๋ฌด ๋งŽ์€ what ifs๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ "ํ•ดํ‚น ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋ฐฑ์—”๋“œ๊ฐ€ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?", "FileSystemStore์—์„œ FooBarStore๋กœ ์Šค์™‘ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค." Lock / Release๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ๋‚ด ํ”„๋กœ๊ทธ๋žจ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "

์—ฌ๊ธฐ์— ์„ธ์…˜ ๋ณ„ ์ž ๊ธˆ์˜ ๋‰˜์•™์Šค์— ๋Œ€ํ•œ ์ข‹์€ ๊ธฐ์‚ฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

http://thwartedefforts.org/2006/11/11/race-conditions-with-ajax-and-php-sessions/

์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ์—ฌ๊ธฐ์—์„œ ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ ๋“ฏ์ด ๋ฌด์–ธ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์„ ๋•Œ ์ž ๊ธˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ฒด๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ฃผ์š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋” ๋งŽ์€ ์ƒ๊ฐ์ด ํ•„์š”ํ•˜๊ณ  ๋งค์šฐ ๋ฐฑ์—”๋“œ ์˜์กด์ ์ž…๋‹ˆ๋‹ค.

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

๋ฌผ๋ก  ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ž ๊ธˆ ๋ฐ ํ•ด์ œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ง€๊ธˆ๊ณผ ๋™์ผํ•œ ๋™์ž‘์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"์ธ ๋ฉ”๋ชจ๋ฆฌ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

์š”์ฒญ์ด๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ๋˜๋Š” ๋‹ค์ค‘ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์„ธ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ์ฝ”๋“œ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋” ์ž์œ ๋กญ๊ฒŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž ๊ธˆ์— ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

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

๋ฉ”๋ชจ๋ฆฌ ์ž ๊ธˆ์€ ์ผ๋ถ€ ์ƒ์ ์—์„œ ์—ฌ์ „ํžˆ ์˜๋ฏธ๊ฐ€ ์žˆ์œผ๋ฉฐ FilesystemStore ์ด ์ข‹์€ ํ›„๋ณด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์‹ค์ ์œผ๋กœ๋Š” ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋œ ์ƒํ™ฉ์—์„œ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ด๋ก ์ ์œผ๋กœ๋Š” ๋„คํŠธ์›Œํฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ๊ฐ€๋Šฅํ•จ). ํŒŒ์ผ ์‹œ์Šคํ…œ ์ž ๊ธˆ์€ ์„ ํ˜ธ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ด๋™ ์ค‘์— ํฌ๋กœ์Šค ํ”Œ๋žซํผ์„ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šฐ๋ฉฐ NFS์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•œ๋‹ค๋Š” ๋ณด์žฅ๋„ ์—†์Šต๋‹ˆ๋‹ค.

@boj : ๋™์˜ํ–ˆ์ง€๋งŒ @cless๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด ๊ท€ํ•˜๊ฐ€ ๋ณด์œ ํ•œ ์ƒ์ ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ

์ €๋Š” @cless์— ์ „์ ์œผ๋กœ ๋™์˜ํ•˜๋ฉฐ ์„ธ์…˜ ์ž ๊ธˆ ๋ฐ ์„ฑ์ˆ™ํ•œ ํ”Œ๋žซํผ (์˜ˆ : PHP)์ด ์„ธ์…˜ ์ €์žฅ์†Œ์—์„œ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์˜ ์ค‘์š”์„ฑ์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์—์„œ๋Š” 'flock'syscall์„ ์‚ฌ์šฉํ•˜๊ณ  memcache์—์„œ๋Š” 'add'์ž‘์—…์˜ ๋ฐ˜ํ™˜ ๊ฐ’๊ณผ '.lock'์ ‘๋ฏธ์‚ฌ ๋ฐ ๋งŒ๋ฃŒ ์ง‘ํ•ฉ์ด์žˆ๋Š” ์ถ”๊ฐ€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๊ธฐ์œ„ํ•œ @kisielk ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค ( 'Lock'๋ฐ 'Release'๊ธฐ๋Šฅ์ด์žˆ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? Go๋Š” ๊ณ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด ๊ฐˆ ์–ธ์–ด ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ถ€ ๊ตฌํ˜„ (FileSystem, Redis ๋ฐ Memcache)์„ ๊ธฐ๊บผ์ด ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ ์˜ต์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • spinLockWait : ์ž ๊ธˆ ํš๋“ ์‹œ๋„ ์‚ฌ์ด์˜ ํœด๋ฉด ์‹œ๊ฐ„ (๋ฐ€๋ฆฌ ์ดˆ) (๊ธฐ๋ณธ๊ฐ’ : 150)
  • lockMaxWait : ์ž ๊ธˆ ๋Œ€๊ธฐ ์‹œ๊ฐ„ (๊ธฐ๋ณธ๊ฐ’ : 30)
  • lockMaxAge : ์ž๋™์œผ๋กœ ํ•ด์ œ๋˜๊ธฐ ์ „์— ์ž ๊ธˆ์ด ์œ ์ง€ ๋  ์ˆ˜์žˆ๋Š” ์ดˆ (๊ธฐ๋ณธ๊ฐ’ : lockMaxWait)

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

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