๋ด ์ง๋ฌธ์ https://github.com/golang/groupcache/issues/3 ๋ฌธ์ ์ ์ฝ๊ฐ ์ ์ฌํฉ๋๋ค
ํ์ฌ ๋จ์ผ ์ธ์คํด์ค์ go ์ ํ๋ฆฌ์ผ์ด์ RAM์์ ๊ด๋ฆฌ๋๋ ๋งต์ด ์์ต๋๋ค. ํ์ฅ์ ์ํด ์ฌ๋ฌ ์ธ์คํด์ค ๊ฐ์ ์ด ๋งต์ ๊ณต์ ํ๊ณ ์ถ์ต๋๋ค. ์ ๋ ์ด๋ฏธ ํผ์ด ์ธ์คํด์ค ๊ฒ์์ ์ํด ์์ฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ํ์ฌ redis๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ง๋ง ๊ฐ ์์คํ ์ RAM์ ํ์ฉํ์ง ์๋๋ค๋ ์ฌ์ค์ ๋ง์กฑํ์ง ์์ต๋๋ค. ์๋์ฒ). ์ด๊ฒ์ด ๋ด๊ฐ groupcache๋ฅผ ์ข์ํ๋ ํ ๊ฐ์ง ์ด์ ์ ๋๋ค.
ํ์ง๋ง ์ ์ฝ์ด ์์ต๋๋ค. ๋ด ์ง๋๋ ํญ์ ๋ณ๊ฒฝ๋ฉ๋๋ค(http๋ฅผ ํตํด ์ง๋๋ฅผ ์ ๋ฐ์ดํธํ๋ผ๋ ์์ฒญ์ ๋ฐ๊ณ ์์ต๋๋ค). ๋ฐ๋ผ์ ๋งต์ ์๋ ํค K1์ ๊ฒฝ์ฐ m[K1]์ด ๋งค์ฐ ์์ฃผ(1์ด ๋๋ ๊ทธ ์ดํ๋ก) ์ ๋ฐ์ดํธ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
๊ทธ๋์ ๋ด ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ์ฌ ํด์!
์๋ ํ์ธ์ @orcaman์ ๋๋ค. ์ ๋ ๋ ๋ค๋ฅธ Groupcache ์ฌ์ฉ์์ง๋ง ๊ทํ์ ์ง๋ฌธ์ ๋ต๋ณํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ฐ์ , ๊ธฐ์ตํด์ผ ํ ๊ฐ์ฅ ์ค์ํ ๋ ๊ฐ์ง ์ฌํญ์ Groupcache๊ฐ ์ฝ๊ธฐ ์ ์ฉ ์บ์๋ผ๋ ์ ์ ๋๋ค. ์ฆ, ๊ทธ ์์ ์๋ ํค๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ๋์งธ, ํด๋น ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ๊ณ ๋ง๋ฃ๋์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ์ฐ LRU์ ๋๋ค. ๋ฐ๋ผ์ ํค๋ฅผ ์์ฃผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒฝ์ฐ GC๋ ์ข์ ์ต์ ์ด ์๋๋๋ค.
๊ทธ๋ฌ๋ ํค ์กฐ์์ผ๋ก ๊ธฐ์กด ๋ฐ์ดํฐ์ ๋ง๋ฃ ๋๋ ๋ณ๊ฒฝ์ ์๋ฎฌ๋ ์ดํธํ ์ ์์ต๋๋ค.
์ ๊ฒฝ์ฐ์๋ ํค์ ๋ํด ์ฝ 1์๊ฐ์ ๋ง๋ฃ๊ฐ ํ์ํ์ต๋๋ค. ๋ด๊ฐ ํ ๊ฒ์ ๋ด๊ฐ ์ป์ผ๋ ค๋ ๋ชจ๋ ํค์ ๋ค์ ๋ผ์ด๋ ์๊ฐ์ ํ์ ์คํฌํ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ํ ์๊ฐ์ด ์ง๋๋ฉด ๋ด ์ฑ์์ ํค์ ์ด ๋ถ๋ถ์ด ๋ณ๊ฒฝ์ ์์ฒญํ๊ณ Groupcache์ ๊ด์ ์์ ์ ํค๋ฅผ ์์ฒญํ๋ ๊ฒ์ ๋๋ค. ์ด์ ๊ฒ์ ๋ ์ด์ ์๋ฌด๋ ๊ฑด๋๋ฆฌ์ง ์๊ธฐ ๋๋ฌธ์ LRU ๋ฉ์ปค๋์ฆ์ ํตํด ์ ๊ฑฐ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ง์์ ์ผ๋ก ํค๋ฅผ ์์ฑํด์ผ ํ๊ณ ๋ ๋ฒ์งธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ๋ง๋ฃ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ redis ๋๋ memcache๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์ ์ ์์ต๋๋ค. ๋ ๋ง์ ์๋ฒ๋ก ํ์ฅํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ Memcache๋ฅผ ์ ํํ๊ฒ ์ต๋๋ค.
@dvirsky ๊ฐ์ฌ
๋๋ ๊ทธ๋ฆผ์ ์ป๋๋ค๊ณ ์๊ฐํ๋ค.
๋ฌธ์ ๋ ์์ง๋ง ์ด์ค๋ผ์ ํ์ฅ์์ Groupcache๋ฅผ ๋ ๋ง์ด ์ฑํํ๊ธฐ๋ฅผ ๋ฐ๋์ต๋๋ค. ๋ค๋ฅธ ํ์ฌ์์ ์ฌ์ฉํ๋ ๊ฒ์ ์๊ณ ์์ต๋๊น? :)
์ฌ๋ฐ๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉด์ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. :-)
๋๋ ์ด์ค๋ผ์ ํ์ฅ์์ ๋ง์ ๊ณ ํผ๋ฅผ ์์ง ๋ชปํ๋ฏ๋ก Groupcache ์ฌ์ฉ์์ ๋ํด ์์ง ๋ชปํ ๊ฒ์
๋๋ค. ๋ค๊ฐ์ค๋ go ๋ชจ์์์ ์ฌ๋ฌ๋ถ์ ๋ง๋๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค.
๋ฉ์๋. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋๊ฐ๋ HTTP ์บ์๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค(์ฆ, ์ฐ๋ฆฌ๊ฐ ์ 3์์๊ฒ ๋ง๋๋ ์บ์ ์์ฒญ). ์ฐ๋ฆฌ๋ ์ธ์ ๊ฐ ์ด ๊ตฌํ์ ์ด ์ ์์ต๋๋ค.
Go ๋ชจ์์ ๋ํด ํ์ ์ด ์์ง ์์ต๋๋ค. ์ฑ๊ณตํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@dvirsky ๋ฐ @bradfitz - ์ ์ฌ์ฉ ์ฌ๋ก์์๋ TTL[ํ์ฌ ์๊ฐ ํ์์คํฌํ๋ฅผ ํค์ ์ถ๊ฐํ ๊ณํ]์ ์ฒ๋ฆฌํ๊ณ ์ถ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ง๋ฌธ์ด ์์ต๋๋ค.
1. LRU ๋ฉ์ปค๋์ฆ์ ์ด๋ป๊ฒ ํค๋ฅผ ์ ๊ฑฐํฉ๋๊น? ํค๊ฐ [๋ง๋ฃ๋ ๊ฒ์ผ๋ก ํ์ํ๊ธฐ ์ํด] ์ฌ์ฉ๋์ง ์๋ ์ต์ ๊ธฐ๊ฐ์ ์ค์ ํ ์ ์์ต๋๊น?
2. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์บ์์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ํ ๋น๋ ๋ฐ์ดํฐ๋ฅผ ์ด๊ณผํ๋ฉด ๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๊ฐ ์ ๊ฑฐ๋ฉ๋๊น? ์ด ๊ฒฝ์ฐ ํ์ฌ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ์ง ์๋๋ก ๋ฉ๋ชจ๋ฆฌ ๊ท ํ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๊น?
์ด์ ๋ํด ๋ช ๊ฐ์ง ์ ์์ ํด์ฃผ์๊ฒ ์ต๋๊น?
@dvirsky ์ข์ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ํญ๋ชฉ์ด ๋์์ "์ ๊ฑฐ"๋ ๋ ๋งค์๊ฐ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฝ๊ฐ ์คํ์ดํฌํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๊น?
@qbig ๋ง๋ฃ๋ฅผ ๊ตฌํํ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋ด๊ฐ ํ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// turn a ttl into an expiration timestamp, using discrete time windows.
// i.e. ask for an hour and get the nearest hour end as the expiration point.
//
// We pad these discrete boundaries pseudo random margin (based on hashing the key)
// to avoid hitting the cache too hard if all requests expire at once
//
// This can be seconds from now even if you cache for days :)
func calcExpiration(ttl int64, key string, now int64) int64 {
//we calculate the non discrete expiration, relative to current time
expires := now
var padding int64 = 0
if ttl > 0 {
// now we want to pad it so we'll no expire all reqeusts for a given time window at once
// to be consistent, the seed of the padding is a hash on the url
h := fnv.New32a()
h.Write([]byte(key))
padding = int64(h.Sum32()) % ttl
// not sure this is correct - I wrote it long ago :)
expires += (ttl - (expires % ttl)) - padding
if expires < now {
expires += ttl
}
}
return expires
}
@orcaman ์ https://tarantool.org/๋ฅผ ์ดํด๋ณด์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ํ์ธ์ @orcaman์ ๋๋ค. ์ ๋ ๋ ๋ค๋ฅธ Groupcache ์ฌ์ฉ์์ง๋ง ๊ทํ์ ์ง๋ฌธ์ ๋ต๋ณํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ฐ์ , ๊ธฐ์ตํด์ผ ํ ๊ฐ์ฅ ์ค์ํ ๋ ๊ฐ์ง ์ฌํญ์ Groupcache๊ฐ ์ฝ๊ธฐ ์ ์ฉ ์บ์๋ผ๋ ์ ์ ๋๋ค. ์ฆ, ๊ทธ ์์ ์๋ ํค๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ๋์งธ, ํด๋น ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ๊ณ ๋ง๋ฃ๋์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ์ฐ LRU์ ๋๋ค. ๋ฐ๋ผ์ ํค๋ฅผ ์์ฃผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒฝ์ฐ GC๋ ์ข์ ์ต์ ์ด ์๋๋๋ค.
๊ทธ๋ฌ๋ ํค ์กฐ์์ผ๋ก ๊ธฐ์กด ๋ฐ์ดํฐ์ ๋ง๋ฃ ๋๋ ๋ณ๊ฒฝ์ ์๋ฎฌ๋ ์ดํธํ ์ ์์ต๋๋ค.
์ ๊ฒฝ์ฐ์๋ ํค์ ๋ํด ์ฝ 1์๊ฐ์ ๋ง๋ฃ๊ฐ ํ์ํ์ต๋๋ค. ๋ด๊ฐ ํ ๊ฒ์ ๋ด๊ฐ ์ป์ผ๋ ค๋ ๋ชจ๋ ํค์ ๋ค์ ๋ผ์ด๋ ์๊ฐ์ ํ์ ์คํฌํ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ํ ์๊ฐ์ด ์ง๋๋ฉด ๋ด ์ฑ์์ ํค์ ์ด ๋ถ๋ถ์ด ๋ณ๊ฒฝ์ ์์ฒญํ๊ณ Groupcache์ ๊ด์ ์์ ์ ํค๋ฅผ ์์ฒญํ๋ ๊ฒ์ ๋๋ค. ์ด์ ๊ฒ์ ๋ ์ด์ ์๋ฌด๋ ๊ฑด๋๋ฆฌ์ง ์๊ธฐ ๋๋ฌธ์ LRU ๋ฉ์ปค๋์ฆ์ ํตํด ์ ๊ฑฐ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ง์์ ์ผ๋ก ํค๋ฅผ ์์ฑํด์ผ ํ๊ณ ๋ ๋ฒ์งธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ๋ง๋ฃ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ redis ๋๋ memcache๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์ ์ ์์ต๋๋ค. ๋ ๋ง์ ์๋ฒ๋ก ํ์ฅํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ Memcache๋ฅผ ์ ํํ๊ฒ ์ต๋๋ค.