TCP ์์ผ์ด ์ฐ๊ฒฐ๋ ์ํ๋ก ๋จ์์๋ TCP ์ปค๋ฅ์ ๋์ ๋ฌธ์ ๋ฅผ ๊ฒฝํํ๊ณ ๋์ ์ปค๋ฅ์ ํ ๊ธฐ๋ฅ ๊ตฌํ์ ๋ํด์ ๋ค์ํ๋ฒ ํ์ตํด๋ณด๊ณ ์ ๋ฆฌํ๋ ๊ธ์ ๋๋ค.
์๋ง๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ฃผ ์ฌ์ฉ๋๋ ์ผ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ค์ ๋ํ ์ปค๋ฅ์ ํ ๊ธฐ๋ฅ์ ์ง์ ๊ตฌํํ์ง ์์๋ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์์คํ ์์ ์ฌ์ฉ์ค์ธ ์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์๋ฐ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๊ณ ์์ง๋ง ์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋จ์ผ ์์ฒญ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ์ฑ๊ธ ์ค๋ ๋ ๋ฐฉ์์์ ๋ฐ๋ผ์ ์ปค๋ฅ์ ํ ๊ธฐ๋ฅ์ ์์ฒด์ ์ผ๋ก ๋ด์ฅํ๊ณ ์์ง ์์ต๋๋ค. ์ปค๋ฅ์ ํ ๊ธฐ๋ฅ์ด ๋ฐ๋์ ํ์ํ ๊ฒ์ ์๋์ง๋ง TCP ์ฐ๊ฒฐ์ ๋ํ ๋ถํ๋ฅผ ์๊ฐํ๋ค๋ฉด ์์ฃผ TCP ์์ผ์ ์ฐ๊ฒฐํ๋ฏ๋ก ๋ฐ์ํ ์ ์๋ ๋ ์ดํด์๋ฅผ ๋ฐ ์์ ๋ญ๋น๋ฅผ ๋ฌด์ํ ์ ์์ต๋๋ค.
์๋ฐ ์ปค๋ฅ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ โ
์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ถ๋ถ Apache Commons Pool2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด์ ์ปค๋ฅ์ ํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋ํ์ ์ผ๋ก ๋ ๋์ค ํด๋ผ์ด์ธํธ๋ก ๋ง์ด ์ฌ์ฉ์ค์ธ Lettuce์ ์ปค๋ฅ์ ํ ์ง์์ ํ์ธํ ์ ์์ผ๋ฉฐ Apache Commons DBCP2๋ผ๊ณ ํ๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๋ํ์ ์ธ ์ปค๋ฅ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Commons Pool๋ก ๊ตฌํ๋์ด์์์ ํ์ธํ ์ ์์ต๋๋ค.
Apache Commons Pool2์์๋ ๊ฐ๋จํ PooledObjectFactory ์์ ๋ฅผ ์ ๊ณตํ๊ณ ์์ง๋ง ์์ธํ ์ค๋ช ์ด ์์ต๋๋ค.
์ปค๋ฅ์ ํ ๊ตฌํ ์์ ๋ฅผ ๊ฒ์ํด๋ณด๋ฉด ์๊ฐ๋ณด๋ค ๊ด๋ จ๋ ๊ธ์ด ์์๊ธฐ์ ์ง์ ์ ์ผ๋ก ์ปค๋ฅ์ ํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฐ๋ฐ์๋ ๋ง์ง ์์ ๊ฒ์ด๋ผ ์๊ฐ๋ฉ๋๋ค. ์ปค๋ฅ์ ์ค๋ธ์ ํธ์ ๋ํ ๋ผ์ดํ ์ฌ์ดํด์ ๊ด๋ฆฌํ๋ ๊ฒ์ PooledObjectFactory ์ธํฐํ์ด์ค๊ฐ ๋ด๋นํ๋ฏ๋ก ์ํ๋ ์ปค๋ฅ์ ํ ๋์์ BasePooledObjectFactory๋ฅผ ์์ํ์ฌ ๊ตฌํํ๋ฉด ๋ฉ๋๋ค. ๋ค๋ง, ์ปค๋ค์ ํ ๊ตฌํ ์ ์ค์ํ๊ฒ ์๊ฐํด์ผํ ๋ถ๋ถ์ BasePooledObjectFactory์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌํํด๋์ด์ ๊ตฌํ์ ๊ฐ์ ํ์ง ์๋ ํจ์ ์ค ์ปค๋ฅ์ ํ์์ ๊ด๋ฆฌํ๋ ์ค๋ธ์ ํธ๊ฐ ์ญ์ ๋๋ ๋์์ด ๋๋ ๊ฒฝ์ฐ ํธ์ถ๋๋ destoryObject ํจ์ ๋์์ ์๋ตํด๋ฒ๋ฆด ์ ์๋ค๋ ์ ์ ๋๋ค.
CPooledObjectFactory โ
์ปค๋ฅ์ ํ ๊ธฐ๋ฅ์ ์ฒ์ ๊ตฌํํ์ ๋น์์ ๊ณ ๋ คํ์ง ๋ชปํ ๋ฏธํกํ ์ ์ ์ธ์งํ๊ณ KDB ํ๋ก์ธ์ค์ ๋ํ ์ปค๋ฅ์ ์ ๋ผ์ดํ ์ฌ์ดํด์ ๊ด๋ฆฌํ๋ CPooledObjectFactory๋ฅผ ๋ค์ ์์ฑํด๋ณด์์ต๋๋ค.
public class CPooledObjectFactory extends BasePooledObjectFactory<c> {
private final String host;
private final int port;
public CPooledObjectFactory(String host, int port) {
this.host = host;
this.port = port;
}
@Override
public c create() throws Exception {
return new c(host, port);
}
@Override
public PooledObject<c> wrap(c c) {
return new DefaultPooledObject<>(c);
}
@Override
public boolean validateObject(PooledObject<c> p) {
try {
c c = p.getObject();
if(c.s == null || !c.s.isConnected()) {
return false;
}
c.k("1");
} catch (c.KException | IOException e) {
return false;
}
return true;
}
@Override
public void destroyObject(PooledObject<c> p) throws Exception {
close(p.getObject());
}
private void close(c c) {
if (c != null) {
try {
c.close();
} catch (IOException e) {
// ignored
}
}
}
}
๋ ์์ธํ๊ฒ PooledObjectFactory ๊ตฌํ์ ๋ํด์ ๊ณ ๋ฏผํ๊ณ ์ถ์ ๋ถ๋ค์ด๋ผ๋ฉด ์๋์ ์คํ์์ค๋ค์ ์ฐธ๊ณ ํด๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
CObjectPool โ
์ด์ ๋ ์ปค๋ฅ์ ์ค๋ธ์ ํธ๋ฅผ ๊ด๋ฆฌํ ๋ฐฉ์์ ๋ํด์ ์ค์ ํ๋ ๊ฒ์ ๊ณ ๋ฏผํด๋ณด์์ผ ํฉ๋๋ค. Apache Commons Pool์์ ์ปค๋ฅ์ ์ค๋ธ์ ํธ ๋ผ์ดํ์ฌ์ดํด์ ๋ฐ๋ผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ์ง ๊ฒฐ์ ํ๊ธฐ ์ํด์๋ GenericObjectPoolConfig๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
public class CObjectPoolConfig extends GenericObjectPoolConfig<c> {
public CObjectPoolConfig() {
this.setMaxTotal(8);
this.setMaxIdle(5);
this.setMinIdle(1);
this.setMaxWait(Duration.ofMinutes(3));
this.setTimeBetweenEvictionRuns(Duration.ofMinutes(5));
this.setTestWhileIdle(true);
this.setJmxEnabled(false);
}
}
์ปค๋ฅ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ๊ฐ ์ค์์ JMX ๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ๋นํ์ฑํ ํด๋์์ผ๋ฉฐ ์ ํด ์ํ๋ก ๊ด๋ฆฌ์ค์ธ ์ปค๋ฅ์ ์ ๋ํด์๋ ๋ฏธ๋ฆฌ ์ปค๋ฅ์ ์ํ๋ฅผ ํ์ธํ ์ ์๋๋ก TestWhileIdle ์ต์ ์ ํ์ฑํํ์์ต๋๋ค. MaxWait์ ๊ฒฝ์ฐ ์ฌ์ฉ์ค์ธ ๊ฐ ์ปค๋ฅ์ ์ด ์ต๋๋ก ์์ํ ์ ์๋ ์๊ณ์น์ ๋ฐ๋ผ 3๋ถ ๊น์ง ๊ธฐ๋ค๋ฆด ์ ์๋๋ก ํด๋์์ต๋๋ค.
By default, kdb+ is single-threaded, and processes incoming queries sequentially.
์ปค๋ฅ์ ๋ผ์ดํ ์ฌ์ดํด์ ๋ฐ๋ผ์ ์ปค๋ฅ์ ํ์์ ์ปค๋ฅ์ ์ค๋ธ์ ํธ๊ฐ ์ญ์ ๋๋ ์ฌ์ ์๋ ๋ํ์ ์ผ๋ก ๋๊ฐ์ง๊ฐ ์๋๋ฐ์. ํ๋๋ ์ ํด ์ํ์ ์๋ ์ปค๋ฅ์ ์ด ๋ฒจ๋ฆฌ๋ฐ์ด์ ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ ๊ณผ์ ์์ ์์ผ ํต์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋๋ฌด ์ค๋ฌ๋์ ์ปค๋ฅ์ ์ด ์ฌ์ฉ๋์ง ์์์ ๋ฒ๋ ค์ง๊ณ ์๋ก์ด ์ปค๋ฅ์ ์ ๋ง๋ค์ด์ ํ์ ์ ์งํ๋ ์ํฉ์ ๋๋ค. ์ ๋ฌธ๊ตฌ ๋ด์ฉ์ฒ๋ผ ์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋น ๋ฅด๊ฒ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ์ฑ๊ธ ์ค๋ ๋ ๋ฐฉ์์ ํตํด์ ๋จ์ผ ์์ฒญ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๊ฒ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ์ ๊ด์ ์ ๋๋ค. ์ด๋ ๋ ๋์ค์์ ๋์์ฑ์ ๊ตฌํํ๊ธฐ ์ํด์ ์ฑํํ ๋ฐฉ๋ฒ์ด๊ธฐ๋ ํ๋ฏ๋ก ๋จ์ํ ์ฑ๊ธ ์ค๋ ๋์ฌ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ๋ฐ๋ผ๋ณด๋ฉด ์๋ฉ๋๋ค.
exec 0 ms (481900 ns)
์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋ฌด๋ฆฌ ๋น ๋ฅด๋ค๊ณ ํด๋ ๊ธด ๋ฒ์์ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ์ฐ์ฐ์ ํ๋ค๊ฑฐ๋ TCP ์์ผ์ ํตํด ์ ๋ฌํด์ผํ ๋ฐ์ดํฐ๊ฐ ์๋นํ ๋ง์ ๊ฒฝ์ฐ๋ผ๋ฉด ์ฑ๊ธ ์ค๋ ๋์ ๋จ์ ์ผ๋ก ์ธํ์ฌ ์ ํ ์์ฒญ์ ์ํด ํํ ์์ฒญ์ด ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ผ๋ก ์ธํด ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ ์ ์๋ค๋ ์ ์ ๊ณ ๋ คํด์ผํฉ๋๋ค. ๋ง์ฝ, ๊ทธ๋ฌํ ์ํฉ์ด ์์ฃผ ๋ฐ์ํ๋ค๋ฉด ๋น ๋ฅธ ์ฑ๋ฅ์ ์ํด ์ฑ๊ธ ์ค๋ ๋๋ฅผ ์ฑํํ ์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ชป๋ ๊ฒ์ผ ์ ์์ต๋๋ค.
KDB ์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปค๋ฅ์ ํ ๋์์ ๋ํด์ ํ์ธํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๋งํฌ๋ค์ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.