티스토리 뷰

기존 동작 방식은 주기적으로 쿼리를 수행하고 steampipe DB(PostreSQL)에 캐시된 데이터를 가져오는 방식이었다.

하지만 이렇게 하다보니, 만약 쿼리가 딱 날라가기 전에 사용자가 요청해버리면 주기적인 쿼리가 의미가 없어지는 현상이 있었다.

이를 해결하기 위해 먼저 아래와 같이 compliance model을 만들었다.

import mongoose from 'mongoose';

const complianceSchema = new mongoose.Schema({
  title: {
    type: String,
    required: true,
    unique: true,
    minlength: 5,
    maxlength: 30,
  },
  results: [{ type: Map }],
  createdAt: { type: Date, required: true },
});

const Compliance = mongoose.model('Compliance', complianceSchema);
export default Compliance;

이후 쿼리 방식을 아래와 같이 변경하였다.

static async querySteampipe(title, query) {
    try {
      const results = (await pg.query(query)).rows;

      (await Compliance.findOneAndUpdate(
        { title },
        { results, createdAt: Date.now() }
      )) ??
        (await Compliance.create({
          title,
          results,
          createdAt: Date.now(),
        }));
    } catch (err) {
      console.error(err);
    } finally {
      setTimeout(Batch.querySteampipe, DEFAULT_TTL, title, query);
    }
  }

물론 기본 쿼리 주기가 5분인만큼 5분 이내로 (수정)들어올 수가 없다. 왜냐면 백단에서 그냥 스케쥴 방식으로 돌아가기 때문이다. 어제 피곤해서 이상하게 작성했다.. ㅠ(수정) 사요자의 요청이 들어오면 비교해서 추가쿼리를 하지 않도록 변경도 가능하지만, 일단은 사용자가 백단에서 쿼리가 수행되느라 웹이 느려지는 현상은 막을 수 있는것으로 만족하기로 하자.

사실 지금 더 큰 문제는 DATE 문제다 ㅠ.. 도커 이미지를 쓰다보니 계속 UTC 기준으로 뿌려주는데 이걸 사용자가 선택가능하도록은 나중에 하고 일단 JS 단에서 수정해서 DB에 밀어넣는 작업을 해야될 것 같다. 힘내자..

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함