190805-190902 월간 회고

이번달은 마침 2주간 회고를 쓰는 주에 파이콘이 있었기 때문에, 파이콘 후기를 쓰면서 주간회고를 건너뛰게 되었다.
그렇게 이번 회고는 월간회고가 되었다.
한달간 정신없이 돌아갔는데 기억나는 것 위주로 정리하자면 이렇다.

  • 파이콘 2019 참가
  • 뱅크샐러드 세미나(콘샐러드) 참석
  • Akka HTTP로 프로덕션에 쓰일 파일관련 서버 만들기(라고 쓰고 삽질기라고 읽는다)
  • Amathon 참가

파이콘 2019 참가

pycon 2019 후기 포스팅을 했으니 월간회고에서는 패스

뱅크샐러드 세미나(콘샐러드) 참석

1:30 부터 6:30까지 진행됐는데, 오랜시간 앉아있어 허리는 아팠지만 내용이 너무 좋았다.
특히 정겨울님이 발표하신 오픈소스 라이브러리 개발기가 인상깊었다.
오픈소스 라이브러리를 개발할때에 어떤것을 명시해야하며, 어떻게 디스크립션을 작성해야 하는지에 대한 내용이 꽉차게 들어있었다.
너굴맨 프로젝트를 개선할 때에 요긴하게 참고할 수 있을 것 같다.
발표자료 : 링크

Akka HTTP로 프로덕션에 쓰일 파일관련 서버 만들기

중요하거나 민감한 정보(aws 키, db 접속정보 등)를 담고 있는 파일을 s3에 저장하고, 회사 아이피에서만 접근할수 있는 서버를 만들어야 했다.
간단하게 말하자면 s3 파일을 서빙해주는 서버이다.
플라스크로 만드는게 가장 빠르고 간단했겠지만, 왠지 모를 자신감으로 스칼라로 만들겠다 했다.
Actor모델을 좀 알고싶어서 일단 패기롭게 Akka HTTP를 골라서 개발하기 시작했다.

akka_description이름에 HTTP가 있어서 웹 프레임워크 같겠지만 웹 프레임워크가 아니다!

Akka 공식문서를 보면서 개발했는데, scala Future를 잘 모르고 개발하다보니 탈탈 털려버렸다.
그래도 어찌어찌 완성했는데, 그렇다고 Akka를 좀 알게 됐다던지.. 그런건 아니고 그냥 이제 막 걸음마를 뗀것 같다(누가 시작이 반이라고 하던데 시작은 그냥 시작일 뿐이다..)

Amathon 2019 참가

웃기게도, 나는 Amathon이 Armature + Hackaton = Amathon 인줄 알았다.
대상도 주니어 or 학생 개발자였기 때문에 난이도가 평이할 줄 알았는데 주제를 보니 아무래도 음.. 몇몇 주제가 주니어 대상인건 아닌것같았다.
그리고 어제 해커톤 결과물 발표를 들으며 깨달았는데 이건 Amazon+Hackaton 이었던 것 이다!.
어쩐지 실력 쟁쟁한 참가자분들이 많더라..그리고 주니어가하기엔 어려운 주제가 많았다 카더라..
이번 해커톤은 신기하게도 기획이(주제가) 정해져 있고, 원하는 주제를 골라 3지망까지 적어서 제출해야했다.
공유가능한 실시간 만다라트 차트 웹이라던지 유투브 댓글추첨 웹 만들기라던지 하는 재밌어보이는 주제가 많았다.
하지만 이번엔 웹 서비스를 만들기보단 백엔드에 집중하는 Pub/Sub Baas 만들기가 재밌을 것 같아서
주제 16번의 WebSocket 기반의 스케일아웃 고려한 Real-time Pub/Sub BaaS 만들기를 선택했다.
우리팀은 3명이었는데, 특이하게 백엔드 3명이었다. 처음엔 조원이 덜 온줄 알았는데 3명이 끝이였다..
Baas를 만들어야 했으므로 프론트에 차트를 그려줄 능력자분이 필요했고 감사하게도 한분이 장고를 이용해서 하겠다 하셨다.
나는 서버API 담당이었고 Real-time이란 조건 때문에 비동기 프레임워크를 사용했다.
이 프로젝트의 핵심은 ZeroMQ와 비동기였다. 난이도가 살벌했다.
나는 이번 해커톤을 하며 ZeroMQ에 대해 처음알게 되었다. 혹시 모르는 분들을 위해 간략하게 설명하자면 다음과 같다.

ZeroMQ(ZMQ)
ZeroMQ는 분산/동시성 애플리케이션에 사용하도록 개발된 아주 가벼운 고성능 비동기 메세징 라이브러리입니다.
RabbitMQ와 달리 다양한 프레임워크를 결합해 직접 구현해야한다는 단점이 있습니다.
또한 다음과 같은 특징이 있습니다.

  • 동시성 프레임 워크 역할을하는 소켓 라이브러리
  • 클러스터 제품 및 슈퍼 컴퓨팅을 위해 TCP보다 빠름
  • inproc, IPC, TCP 및 멀티 캐스트를 통한 메시지 전달(유니캐스트도 가능)
  • 팬 아웃, pubsub, 파이프 라인, 요청-응답을 통해 N-to-N 연결
  • 확장 가능한 멀티 코어 메시지 전달 앱을위한 비동기 I / O

MQ로는 이렇게 ZeroMQ를 사용했으며 서버는 파이썬의 비동기 프레임워크인 Sanic을 사용했다.
DB는 memcached와 redis 사이에서 고민하다 redis를 선택했다. 이번 서비스를 만듦에 있어 성능차이가 없고 redis가 익숙하고 복구도 용이해서..
라이브러리도 asyncio 관련 라이브러리를 사용해야한다 따라서 asyncio-redis를 사용했다.
aioredis도 있는데 문서가 불친절하다. 그냥 사용하기엔 asyncio-redis 예제가 잘 되어있어 사용하기가 좋다.
websocket 기반의 realtime pub/sub은 만들어 본 적이 있기도 했고 기획이 정해져 있어서 개발을 빨리 시작할 수 있었다.
심지어 새벽에 쇼파에서 잠도 잘 수 있었다.
ZeroMQ를 쓰려고 보니 라이브러리 형태가 아니었다. 그래서 지인은 ZMQ PubSub 라이브러리를 만들었다ㅋㅋ
마감까지 2~3시간 남았을때에 지인이 빈스톡에 배포를 했는데 계속 500 에러가 났다.
redis connection 문제였던 것 같다(보안그룹에 분명히 허용을 해뒀는데 이상한 일이다)

  • 여담으로
    레디스 커넥션 문제라면 웹서버는 떠야하는데 왜 안뜨나 싶겠지만 이 서버는 시작시 레디스 커넥션을 하기 때문에 실패하면 띄워지지않는다.
    1
    2
    3
    4
    5
    @app.listener('before_server_start')
    async def setup(app, loop):
    app.conn = await redis_set_get.create_connection_pool()
    app.pub_server = await PubSubServer.create(os.environ['REDIS_URI'])
    loop.create_task(app.pub_server.run_forever())

우선 모든 아이피에 대해 허용하니 잘 돌아갔다. 어차피 도커에 레디스 띄운거라 그렇게 해도 괜찮긴 했다.
배포 문제를 해결하고 나니 시간이 20분가량 남아서..
아쉽게도 부하 테스트는 하지 못하고 그대로 ws client와 postman을 써서 시연을 하며 발표를 했다. 아쉬웠다.. 꼭 부하테스트를 해보고싶었다.
발표자료는 레포에 같이 올려두었다: 링크
이번 해커톤에서 다른 백엔드분들이 만든 서비스를 보며 백엔드가 이정돈 해야되는구나 라는걸 많이 느꼈고
난 아직 멀었다는 생각을 많이 했던 것 같다.

다음주 목표

  • 알고리즘 문제풀이
  • Akka서버 개발 계속
  • Scala 공부 및 번역 계속

총평

이번달엔 ‘이세상에서 내가 제일못해 병’에 걸려서 우울했다.
이 시기가 되면 내가 그동안 뭘 했나, 뭘 배웠나, 성장한게 있긴 한가 싶어서 굉장히 우울해진다. 그렇다고 개발이 재미없어지는건 또 아니다.
사실 이 월/주간 회고도 이럴때를 대비해(?) 작성해왔던 것이다.
꾸준히 공부해오고 있긴 하지만 부족한게 너무 많아서 슬프다.
지금 이걸 공부하는게 맞는지, 이것에 집중하는게 맞는지 다른사람들은 어떻게 성장했는지 궁금하다.
과거 취준생이던 시절엔 개발자로 취직하면 누군가 이끌어주거나 뭔가를 알려줄 거라 생각했었다. 하지만 그건 크나큰 오산이었다.
취직 전이나 취직후나 혼자 알아내고 혼자 학습해야하는건 매한가지다.
과거나 지금이나 내가 할수 있는건 그냥 공부하고 코딩하는게 전부라서 그냥 계속 징징대면서 해야겠다.