Skip to content

TCP ์†Œ์ผ“์ด ์—ฐ๊ฒฐ๋œ ์ƒํƒœ๋กœ ๋‚จ์•„์žˆ๋Š” TCP ์ปค๋„ฅ์…˜ ๋ˆ„์ˆ˜ ๋ฌธ์ œ๋ฅผ ๊ฒฝํ—˜ํ•˜๊ณ ๋‚˜์„œ ์ปค๋„ฅ์…˜ ํ’€ ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œํ•œ๋ฒˆ ํ•™์Šตํ•ด๋ณด๊ณ  ์ •๋ฆฌํ•˜๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค.

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

์ž๋ฐ” ์ปค๋„ฅ์…˜ ํ’€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ โ€‹

์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋Œ€๋ถ€๋ถ„ Apache Commons Pool2 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ปค๋„ฅ์…˜ ํ’€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ๋ ˆ๋””์Šค ํด๋ผ์ด์–ธํŠธ๋กœ ๋งŽ์ด ์‚ฌ์šฉ์ค‘์ธ Lettuce์˜ ์ปค๋„ฅ์…˜ ํ’€ ์ง€์›์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Apache Commons DBCP2๋ผ๊ณ  ํ•˜๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๋Œ€ํ‘œ์ ์ธ ์ปค๋„ฅ์…˜ ํ’€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ Commons Pool๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Apache Commons Pool2์—์„œ๋Š” ๊ฐ„๋‹จํ•œ PooledObjectFactory ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ž์„ธํ•œ ์„ค๋ช…์ด ์—†์Šต๋‹ˆ๋‹ค.

์ปค๋„ฅ์…˜ ํ’€ ๊ตฌํ˜„ ์˜ˆ์ œ๋ฅผ ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด ์ƒ๊ฐ๋ณด๋‹ค ๊ด€๋ จ๋œ ๊ธ€์ด ์—†์—ˆ๊ธฐ์— ์ง์ ‘์ ์œผ๋กœ ์ปค๋„ฅ์…˜ ํ’€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ๋งŽ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค. ์ปค๋„ฅ์…˜ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ PooledObjectFactory ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‹ด๋‹นํ•˜๋ฏ€๋กœ ์›ํ•˜๋Š” ์ปค๋„ฅ์…˜ ํ’€ ๋™์ž‘์„ BasePooledObjectFactory๋ฅผ ์ƒ์†ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์ปค๋„ค์…˜ ํ’€ ๊ตฌํ˜„ ์‹œ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์•ผํ•  ๋ถ€๋ถ„์€ BasePooledObjectFactory์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด๋‘์–ด์„œ ๊ตฌํ˜„์„ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜ ์ค‘ ์ปค๋„ฅ์…˜ ํ’€์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๋Œ€์ƒ์ด ๋˜๋Š” ๊ฒฝ์šฐ ํ˜ธ์ถœ๋˜๋Š” destoryObject ํ•จ์ˆ˜ ๋™์ž‘์„ ์ƒ๋žตํ•ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์  ์ž…๋‹ˆ๋‹ค.

CPooledObjectFactory โ€‹

์ปค๋„ฅ์…˜ ํ’€ ๊ธฐ๋Šฅ์„ ์ฒ˜์Œ ๊ตฌํ˜„ํ–ˆ์„ ๋‹น์‹œ์— ๊ณ ๋ คํ•˜์ง€ ๋ชปํ•œ ๋ฏธํกํ•œ ์ ์„ ์ธ์ง€ํ•˜๊ณ  KDB ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ปค๋„ฅ์…˜์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•˜๋Š” CPooledObjectFactory๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

java
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๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

java
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.

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

shell
exec 0 ms (481900 ns)

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

KDB ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ปค๋„ฅ์…˜ ํ’€ ๋™์ž‘์— ๋Œ€ํ•ด์„œ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์˜ ๋งํฌ๋“ค์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Released under the MIT License.