요즘 코인들의 등락폭이 예전보다는 훨씬 덜한 추세이다. 그럼에도 불구하고, 예전에 친구들과 프로젝트 하나를 진행하기로 했기 때문에, 코인관련 정보를 twitter로 받아 telegram으로 푸쉬하는 간단한 서버 어플리케이션을 작성 중 이다. 이것저것 검색해보며 실행 가능한 어플리케이션을 작성하기는 했는데 사용하고 있는 API의 rate limit 때문에 생각보다 작업이 복잡해지고 작업 시간도 많이 들고 있다. 점점 로직이 복잡해지고 있기때문에, 어딘가에 기록을 해놔야 겠다는 생각이 들어 영어공부 하는 겸 steemit에 한글버전, 영어버전을 포스팅 해보고자한다.
전체적인 흐름은,
DB에서 twitter screen_name을 fetch -> screen_name하나 당 한번의 콜로 가장 최신 id와 text를 받아옴 -> telegram으로 푸쉬
인데, 이 과정에서 두 번째, 세 번째 과정에서 각각 twitter API, telegram API를 사용하는 데 둘 다 rate limit이 있다.
위의 과정중 두번째 과정에서 호출되는 twitter API의 경우, user auth 방식에서 app auth로 바꿔 어느정도의 limit을 확보하고 Fetched data의 수와 분당 예상되는 call수를 곱하여 얻어 낸 최종 API 콜 수에 기반해 twitter app을 3개 생성하였다.
다만 이 키를 어떻게 실시간으로 바꾸며 다룰 지가 문제인데, 제일 먼저 떠오른 해결 방법은 manager process를 만들고, 1 app key / 5분(rate limit time = 15분, app amount = 3 ) 간격으로 각각 다른 child process를 실행하는 방법이다.
(아마 작년에 들은 김정국 교수님 OS수업의 영향이 큰 것같다.) 아직 해결은 못한 부분이지만, node js API를 읽어보니 POSIX와 조금 다른 방식으로 fork를 사용할 수 있는 모양이다. 해결하고 난 이후에 따로 포스트를 작성해 기억해둬야겠다.
다음 문제는 telegram API의 rate limit인 데, 초당 30번의 call이 rate limit이라고 알고 있어 1개의 트윗마다 34ms( 34 * 29 = 986, 34 * 30 = 1020)의 timeout을 줬는 데 한 채널에 보낼수 있는 메세지 수에도 limit이 있는지 30 ~ 45개에 항상 too many request error가 뜬다. 하지만, 이 경우에는 테스트( 모든 트윗을 텔레그램에 푸쉬하는 )단계에서만 발생하는 문제라 생각되어 무시하고 넘어가기로 하였다. 다만, 이후에 telegram에서 문제가 발생 시 어떻게 해결해야 할 지 모르겠다.
현재 코딩한 어플리케이션은
bot.on(fetch().then(success callback(twitter success, twitter fail), fail callbak))
꼴인데, manager process가 종료하였을 한 process를 종료하였을 때, 계속 봇 작동 커맨드를 입력해주는 것은 사용 불가능한 형태기때문에, fork를 구현한 이후로는
bot.on(manager procss -> fork 혹은 exec)
꼴이 되야하지 않을까 조심스럽게 생각해본다.
많은 사람들이 나 이전에 많은 정보방 봇들을 만든 것으로 알고 있다. 다른 사람들은 어떻게 이런 문제를 해결한 지 궁금하지만 쉽사리 검색되지 않는 것이 안타깝다. 내가 초보 개발자이기 때문에, 분명히도 쉬운 길을 굳이 어렵게 가고 있다는 생각이 든다.
레퍼런스
-twitter API rate limit
https://developer.twitter.com/en/docs/basics/rate-limits
-telegram API rate limit
https://core.telegram.org/bots/faq
-nodejs.fork() https://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options