체인의정석

큰 규모의 서비스에서의 백엔드 최적화 방안들 본문

블록체인/Ethers & web3

큰 규모의 서비스에서의 백엔드 최적화 방안들

체인의정석 2023. 3. 16. 18:07
728x90
반응형

1.  부하 발생시 node.js의 insperctor 사용해서 체크하기

node.js의 inspector를 다음과 같이 사용하고 접속할 시 inspector가 뜨게 되는데 여기서 메모리 누수 등을 체크할 수 있다.

node inspect node bin/www

//127.0.0.1:9229 접속

 

https://nodejs.org/ko/docs/guides/debugging-getting-started/

 

디버깅 - 시작하기 | Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

2. sequilze, sequilze 쿼리 등은 사용 최소화 하기

sequilze를 사용하게 되면 db connection을 자동으로 관리하게 되는데 mutex등을 사용해서 각 프로세스에 분리를 하게 될 시 connection이 잘 끊기지 않는 에러가 발생한다. 따라서 connection을 직접 끄는 구조로 가는 것이 더 유리히다.

sequilze 쿼리를 사용하게 될 경우 리소스를 적게 차지하게 만들기 어렵다. 그냥 sql을 날리는 것이 더 좋다.

3. Join 등을 사용하는 대신 테이블을 여러개 생성하기

만약 여러개의 테이블이 있는 경우라면 이를 JOIN 쿼리로 묶어오게 될 경우 부하가 더 많이 들게 된다. 이에 따라서 테이블을 새로 만들어서 쿼리를 한번에 불러오는 것이 속도가 훨씬 빠르다. 복잡한 쿼리의 경우 테이블 자체를 쿼리에 맞게 하나 더 만드는 것이 속도나 리소스 면에서 더 좋다.

4. view 테이블

view 테이블의 경우 결국 원본 테이블에서 계속해서 쿼리를 해오는 구조이다. 따라서 보안성을 위해서 쓰는 경우가 아니라면 raw query로 다루는 것이 더 효율적이다.

5. 백엔드에서의 조회와 섞어서 효율적으로 구현

백엔드에서 컨트렉트 주소들이나 기본 설정 값을 메모리에 올려두고 특정 변수들을 불러올 수 있는 구조가 있다면 이를 이용해서 쿼리문 자체를 바꾸는 형식으로도 사용할 수 있다.

        let Query = 
        `SELECT (
            (
                sum(
                    CAST(json_extract(json_data,'$.') AS FLOAT) *
                    CAST(json_extract(json_data,'$.') AS FLOAT)  *
					CAST(row1 AS FLOAT) /
                    CASE 
                        WHEN (A IN (${array.map(d=>'"'+d+'"')}))
                        THEN CAST(POW(10,6) AS FLOAT)
                        ELSE CAST(POW(10,18) AS FLOAT)
                    END
                ) /
                sum(
                    CAST(value AS FLOAT) *
                    CAST(POW(10,18) AS FLOAT)
				)
            )
            ) * 100
        AS ExampleQuery
        FROM Database.Table;
        `

 이런식으로 특정 배열을 넣어서 필터링을 하거나

아니면 쿼리 자체를 만들어 두고 concat을 통해 상황에 맞는 쿼리가 자동으로 생성되게 할 수 있다.

서브 쿼리를 상황에 맞게 만들어 두고 나중에 합치는 방법이다.

 

728x90
반응형
Comments