Agenda 를 통한 스케줄러 데이터 중복 전달 방지 ..

이전 게시글에서는 Nodejs 와 MongoDB 를 연동하기 위해 Mongoose 를 사용했었습니다.​하지만 Agenda 를 통해 스케줄러 데이터 중복 전달을 방지해야 할 일이 생겨 알아보니 이걸로도 연동이 가능한 것 이었습니다.​그래서 기존에 Mongoose 를 삭제하고 Agenda 로 다시 세팅하였습니다.​Agenda 는 MongoDB 를 지원하니 다른 DB 를 사용중이시라면 아래 링크를 통해 설치하고 진행해주시기 바랍니다. (Mongoose 는 설치 X)https://blog.naver.com/skfkgkdlaos/221814545649

​먼저 Agenda 모듈을 설치해줍니다.

그리고 본인이 사용중인 서버 js 파일에 다음 코드를 추가해줍니다.

윗 부분에 Agenda 를 require 하고 몽고디비 연동​을 합니다. ​Docker 로 관리하시는분은 localhost 부분을 도커전용 로컬 호스트로 명시해주어야 합니다.​5번 라인은 가독성을 위해 한 줄로 작성하지 않았습니다. ( 실제로는 한 줄로… )​이렇게 하고 서버를 실행해보면 try catch 문에 있는 agenda,on 함수를 통해 성공적으로 아젠다에 연결되었다는 로그를 얻게됩니다.​이제 터미널을 열고 데이터가 정말 잘 생성되었는지 확인해보겠습니다.

터미널에서 mongo 를 실행해줍니다.

>

show dbs 를 해주면 현재 몽고디비에 어떤 데이터베이스들이 있는지 보여지는데​두 번째에 보면 agenda 가 잘 생성되었네요. 이제 그 속으로 들어가보겠습니다.

agenda 데이터베이스를 선택해주고 콜렉션에 무엇이 들어있는지 확인합니다.

>

agendaJobs 콜렉션이 새로 생겼습니다. MySQL 로 치면 테이블이라 생각하시면 됩니다.​이제 Document 를 확인해보겠습니다.

뒤에 pretty() 붙여주게 되면 줄 넘김이 자동으로 되어 예쁘게 보여집니다. ( 안넣으면 한줄에 다 담겨나와서 보기 안 좋아요.ㅜ )

>

원래는 위 명령어를 입력하면 아무것도 뜨지 않을건데 그게 정상입니다.​좀 전에 막 DB를 만들었는데 안에 값이 있을리가 없지요. 위 사진은 제가 따로 추가해둔 것 입니다.​여튼 정상적으로 콜렉션까지 생성된 것을 확인했으니 이제 도큐먼트에 스케줄러를 넣도록 하겠습니다.​아까 try catch 문 코드 에서 try 안에 작성했습니다.

agenda.define 함수로 Document 에 처리해야 할 일을 정의해줍니다.​genda.define(‘First’, {lockLifetime: 10000} 에서 ‘First’ 는 도큐먼트 이름이고 뒤에 lockLifetime 은 옵션 값입니다.​이 옵션은 여러 개의 프로세서를 사용해 스케줄러를 처리할 때 프로세서의 갯 수 만큼 스케줄러에 등록한 일이 반복되기 때문에​만약 한 프로세서가 먼저 스케줄러를 수행하고 있다면 다음 프로세서가 접근하지 못하도록 잠금을 걸어두는 옵션입니다.​https://github.com/agenda/agenda#multiple-job-processors

위 Agenda 공식 문서에 가보면 더 자세하게 여러 옵션들과 같이 설명되어있으니 참고바랍니다.

위 async 에 있는 agneda.start() 는 위에서 정의한 데이터를 DB에 입력시켜주는 것 이고,​agenda.every() 는 cron 을 사용할 때 처럼 * 을 이용해 스케줄러를 등록할 수 있습니다. 뒤에 ‘First’ 는 같은 이름의 Document 를 반복해줍니다.​여기까지 끝냈다면 서버를 실행한 뒤,​다시 터미널에서 db.agendaJobs.find().pretty() 를 입력했을 때 값이 나오는 것을 확인할 수 있습니다.​또한 PM2 를 이용해 cluster 모드로 프로세서를 늘려 테스트를 해봤을 때​등록한 스케줄대로 Document 에서 정의한 일들을 수행할 때 잠금을 걸어놔서 두 개의 프로세서가 중복 작업을 하지 못하게 됩니다.