본문 바로가기

개발 일지21

서비스 중심 kafka와 redis pub/sub redis pub/sub?*레디스 펍섭은 다수의 퍼블리셔가 하나의 채널에 데이터를 전송하고 다수의 섭스크라이브에게 전파되는 기능*메세지 발행시 채널에 섭스크라이브가 없어도 발행되며 즉시 사라짐*퍼블리셔는 섭스크라이브가 메시지를 수신 했는지 모름*섭스크라이브는 메세지를 가져가는 방식이 아니라 채널로 부터 수신 받는방식*휘발성데이터다 채팅서비스에서 사용하였는데 실시간으로 채팅과 관련된 이벤트를 전파하기 위해 사용하였음1. 여러개의 퍼블리시가 채팅관련 이벤트 상수를 포함한 특정 패턴의 데이터를 채널에 pub2. 다수의 subscribe에 전파하는 방식 kafka?kafka란 redis pubsub과 다르게 여러 프로듀서가 각기 다른 이벤트를 토픽에 저장하고 컨슈머가 각 하나씩 가져가 처리함 대용량 데이터 처리.. 2024. 8. 26.
전 서비스 TypeOrm 버전 업 작업 배경API 서비스마다 어떤 서비스는 TypeOrm 버전이 0.2.x대를 사용중이였고 어떤 서비스는 0.3.x 대를 사용중이였다. 이를 같은 0.3.x버전대로 맞추는 작업을 진행하였다. TypeOrm 0.3 주요 변경 사항export const dataSource = new DataSource({ type: "mysql", host: "localhost", port: 3306, username: "test", password: "test", database: "test", })export const dataSource1 = new DataSource({ /*...*/ })export const dataSource2 = new DataSource({ /*...*/ })exp.. 2024. 8. 16.
온체인마켓 LOG 적재 Apm+Kibana 1.  작업 배경NFT 거래시 API 로그를 남겨 유저가 어떤 행위를 한지 가늠하게 되며 차후 CS가 들어와도 처리하기 쉽고자 키바나에 로그가 적재 되도록 한다. 2.  작업 방향nestJs로 개발된 NFT 마켓플레이스 백엔드 API 서비스에서 각 모듈 별 컨트롤러마다 인터셉터를 달게 된다. http요청 완료 되면 apmService를 통해 요청과 관련된 자세한 정보나 서버에서 발생한 에러를 기록하게 된다. 우선 apm 서비스가 필요했다. @Injectable()export class ApmService { private readonly apm: APM.Agent; constructor() { this.apm = apm; } // http 요청과 관련된 자세한 정보를 custom하여 저장 .. 2024. 8. 16.
실시간 유저 재화를 위한 kafka 도입 1.  작업 배경앱 내에 기존에 유저 테이블에서 유저들의 보유한 재화를 포함한 정보들을 저장하고 있었다. 실시간으로 update 될 만한 기능이 존재하지 않아서 API 요청에 따른 RDB데이터를 업데이트하곤 했었는데 이번 신규 기능 업데이트로 인해 유저가 보유한 재화를 실시간으로 지급, 소모시켜야하는 경우가 생겼다. 현재 구조로는 실시간으로 update를 할 시, DB 부하가 심할 것으로 예상되어 다른 구조로 개선 작업이 필요 했다. 2.  작업 방향유저가 보유한 재화를 redis에 저장하고 비동기로 메세지 큐(MQ)를 사용하여 RDB에 최종적으로 히스토리를 저장하는 형태로 구조를 변경하기로 했다. 빠르게 데이터를 저장하고 삭제, 수정할 수 있는 한 휘발성 데이터이기에 재화에 관련된 데이터가 날아간다면 .. 2024. 8. 16.
젠킨스로 CI/CD 자동화 구성 1. 구성 배경팀 내 서비스들이 젠킨스를 통해 배포하도록 구성이 되어있었다. 입사하고 나서 개발 작업을 완료하여 gitlab에 push하고 나서 develop 브랜치에 merge 한 뒤 젠킨스 웹에서 해당 서비스를 develop 브랜치로 배포하여 개발서버에 적용하곤 했었는데, 이러한 젠킨스 배포 라인을 어떻게 구축했는지 궁금했고 하나의 mock 서비스를 직접 구성해보기로 했다. 2. 구성하기 위한 관찰ssh로 접근가능한 개발 원격서버에 컨테이너가 띄워져 있고 컨테이너에서 각기 다른 서비스들의 이미지가 올라가있었다. 알고 있는 도커 상식으론 Dockerfile로 프로젝트 서비스 이미지를 만든 뒤 컨테이너 이미지를 만들고 이미지 레포지토리에 push -> 배포 하는 것을 자동화해야한다고 생각했다. 환경변수 .. 2024. 8. 16.
내 프라이빗 블록체인에서 입출금 트랜잭션 데몬구현 우선 이전에 작성한 글에선 docker에 컨테이너를 만들때 생성단계에서 포트를 부여하지 않았다. 그래서 기존 2개의 노드를 연결해주는 방식으로 노드를 운영했더니 서버단에서 블록체인 네트워크에 접속 할 때 localhost:8545로 접속하면 아래와 같이 오류가 나왔다. 내가 만든 프라이빗 블록체인 네트워크에 접근할 수 없는 것이다. 그리하여 이미 생성된 컨테이너에 직접포트를 부여하기엔 어렵다고 생각해 기존컨테이너를 이미지화하고 그 이미지로 새로운 컨테이너를 생성하며 포트를 부여하는 방법을 사용하였다. 1. 포트를 연 새 컨테이너를 만들자 생성한 con_ubuntu를 이미지로 먼저 만들어보자. sudo docker ps 해당 명령어로 con_ubuntu 컨테이너가 작동중인지 확인하자. sudo docker.. 2022. 2. 19.