본문 바로가기
개발/NODEJS

노드 웹소켓 통신 속도 관련 [GPT]

by tsuyuoto 2024. 11. 17.
반응형
async function selectQueryData() {
  const start = new Date().toISOString(); // 시작 시각
  console.log(`[${start}] Starting query...`);
  
  // 실제 쿼리 실행
  await new Promise(resolve => setTimeout(resolve, 500)); // 테스트용
  
  const end = new Date().toISOString(); // 종료 시각
  console.log(`[${end}] Query finished.`);
}
selectQueryData();
async function checkConnections() {
  const [before] = await pool.execute('SHOW PROCESSLIST');
  console.log('Before query:', before.length);

  const rows = await executeQuery('SELECT * FROM your_table', []);
  
  const [after] = await pool.execute('SHOW PROCESSLIST');
  console.log('After query:', after.length);
}

 

 

커넥션 반환이 되어있는지 확인 법

async function executeQuery(query, params) {
  const connection = await pool.getConnection(); // 커넥션 가져오기
  console.log('Acquired Connection Thread ID:', connection.threadId); // Thread ID 출력
  try {
    const [rows] = await connection.execute(query, params); // 쿼리 실행
    return rows;
  } finally {
    console.log('Releasing Connection Thread ID:', connection.threadId); // 반환 시 로그
    connection.release(); // 커넥션 반환
  }
}

async function checkConnections() {
  // 쿼리 실행 전 프로세스 리스트 확인
  const [before] = await pool.execute('SHOW PROCESSLIST');
  console.log('Before query:', before.map(proc => proc.Id)); // 활성 Thread ID 출력

  // 쿼리 실행
  const rows = await executeQuery('SELECT * FROM your_table', []);

  // 쿼리 실행 후 프로세스 리스트 확인
  const [after] = await pool.execute('SHOW PROCESSLIST');
  console.log('After query:', after.map(proc => proc.Id)); // 활성 Thread ID 출력

  // Thread ID가 반환되었는지 확인
  const usedThreadId = rows.threadId; // 사용한 Thread ID
  const stillExists = after.some(proc => proc.Id === usedThreadId);
  console.log(
    stillExists
      ? `Thread ID ${usedThreadId} is still active!`
      : `Thread ID ${usedThreadId} has been released!`
  );
}

checkConnections();

 

 

이렇게 했는데 도저히 시간이 안된다 ..이러면 

 

 

 

 

 

외부에서 200개의 데이터를 1초마다 동시에 받아서 이를 저장하고, 최신 200개 데이터를 스프링으로 매번 갱신하여 전달하는 것입니다. 이 경우, 데이터 저장 및 갱신을 빠르고 효율적으로 처리할 방법이 필요합니다.

1. 데이터 수신 및 저장

  • 외부에서 200개의 데이터를 1초마다 받아서 저장하는 것이므로, 메모리 기반 캐시 시스템을 사용하여 데이터를 빠르게 처리하고 최신 200개만 유지하면 됩니다. Redis 같은 시스템을 사용하면 좋습니다.

2. 최신 200개 데이터 관리

  • 최신 200개 데이터를 제한적으로 저장하려면, Redis의 리스트정렬된 셋(sorted set)을 사용하는 것이 매우 유용합니다.
    • Redis는 리스트(List data type)을 사용하여 데이터를 FIFO 방식으로 저장하고, 가장 오래된 데이터를 자동으로 제거할 수 있습니다.
    • 또는, 정렬된 셋(Sorted Set)을 이용하여 데이터를 순위별로 정렬하고 최신 데이터를 추출할 수 있습니다.

3. Redis 활용 예시

  • 200개의 데이터를 **a_latest**와 같은 키로 최신 데이터를 관리하고, 매번 스프링에 전달할 수 있도록 합니다.

Redis 리스트 사용 예시 (최신 200개 데이터 유지)

  • 1초마다 데이터를 받아서 Redis에 저장하고, 최신 200개만 유지하도록 처리합니다.

 

 

const redis = require('redis');
const client = redis.createClient();

// 1초마다 데이터를 받아서 Redis에 최신 200개 데이터 유지
async function handleDataAndUpdateRedis(data) {
  // 데이터를 Redis 리스트에 추가 (최대 200개만 유지)
  await client.lpush('a_latest', JSON.stringify(data)); // 최신 데이터 추가

  // 리스트의 길이가 200개를 넘으면 가장 오래된 데이터 삭제
  await client.ltrim('a_latest', 0, 199); // 앞의 200개만 남기기
}

// 최신 데이터 가져오기 (스프링에 전달)
async function getLatestFromRedis() {
  const latestData = await client.lrange('a_latest', 0, 199); // 최신 200개 데이터 조회
  return latestData.map(item => JSON.parse(item)); // JSON으로 변환
}

 

 

 

4. Redis Sorted Set 사용 예시 (타임스탬프 기반으로 데이터 정렬)

  • Redis의 정렬된 셋을 사용하여 타임스탬프를 기반으로 데이터를 정렬하고, 최신 200개 데이터를 쉽게 관리할 수 있습니다.
// 1초마다 데이터를 받아서 Redis Sorted Set에 최신 200개 데이터 유지
async function handleDataAndUpdateSortedSet(data) {
  const timestamp = Date.now(); // 현재 타임스탬프

  // 데이터를 Sorted Set에 추가 (타임스탬프를 score로 사용)
  await client.zadd('a_latest_sorted', timestamp, JSON.stringify(data));

  // Sorted Set에서 가장 오래된 데이터 삭제 (최대 200개)
  await client.zremrangebyrank('a_latest_sorted', 0, -201); // 가장 오래된 200개 제거
}

// 최신 데이터 가져오기 (스프링에 전달)
async function getLatestFromSortedSet() {
  const latestData = await client.zrevrange('a_latest_sorted', 0, 199); // 최신 200개 데이터 조회
  return latestData.map(item => JSON.parse(item)); // JSON으로 변환
}

5. 데이터 처리 흐름

  1. 1초마다 200개의 데이터를 받기: 외부에서 데이터를 WebSocket이나 HTTP POST 등으로 받습니다.
  2. Redis에 데이터 저장: 받은 데이터를 Redis에 빠르게 저장하고, 최신 200개 데이터만 유지하도록 합니다.
  3. 스프링으로 데이터 전달: 1초마다 Redis에서 최신 200개 데이터를 가져와 스프링 백엔드로 전달합니다.

6. 장점

  • 속도: Redis는 메모리 기반으로 매우 빠른 읽기/쓰기 속도를 제공합니다.
  • 최신 데이터 유지: Redis 리스트나 정렬된 셋을 사용하여 최신 200개 데이터만을 자동으로 관리할 수 있습니다.
  • 스프링과의 연동: Redis에서 최신 데이터를 추출하고 이를 스프링 백엔드로 실시간 전달할 수 있습니다.

결론

  • Redis를 사용하여 최신 200개 데이터를 관리하는 것이 매우 효율적입니다.
  • 리스트 또는 정렬된 셋을 활용하여 최신 데이터를 쉽게 추출하고, 1초마다 스프링정확히 최신 200개 데이터를 전달할 수 있습니다.
  • 배치 방식이나 디스크 기반 DB를 사용하지 않고, 메모리 기반 Redis를 사용하면 실시간 처리 성능을 극대화할 수 있습니다.
반응형