목록전체 글 (34)
DevYGwan

저희는 실시간 공장 기기들의 데이터를 취급하고 있습니다. 데이터는 1초, 10초 등 특정 주기로 한번씩 올라옵니다. 기기 한개를 기준으로 1초에 한번씩 데이터들이 올라온다고 가정하면, 하루동안 24시간 × 60분 × 60초 = 86,400 개의 데이터가 올라옵니다. 물론 사용자는 기기 한개가 아니라 기기 여러개를 관리하고 있을 것이고, 1초, 5초, 10초 등등 특정 주기로 올라오는 데이터가 많아지면 이 데이터는 기하급수적으로 늘어날 것입니다. 저희는 이러한 대용량 데이터를 관리하고 있는데, 이번에 구현해야 할 기능은 특정 범위에 해당하는 데이터를 추출하는 기능입니다. 추출은 csv로 추출합니다. 원래는 csv을 추출할 때, csv을 생성하는 라이브러리(OpenCSV 등)을 써서 단순히 데이터를 조회하고..

저희는 공장의 여러 기기에서 실시간으로 사용자 데이터를 가져와 관리하는 B2B 서비스를 개발하고 있습니다. 그래서 특별히 장애가 발생하지 않는 한 특정 사용자(공장)의 기기 데이터가 한번에 다 올라오지 않는 경우는 거의 없습니다. 물론, 그 공장이 전체 소등을 한다던가 하지 않는 이상은 말이죠... 그러다보니 특별한 일 없이, 특정 공장의 모든 기기에서 데이터가 만약 올라오지 않는다면 이는 큰 장애로 이어졌을 가능성이 높아 빠르게 처리해야되죠. (일단, 고객보다 먼저 알아서 빠르게 처리할 수 있어야 합니다.) 이를 처리하기 위해 저희는 15분 주기마다 사용자의 기기 데이터들을 조회해서 올라온 데이터가 하나도 없는지 조회하여 없다면 알림을 보내는 로직을 구현해 사용하고 있습니다. 이를 구현하기 위해서 Sp..

저희는 Sentry을 통해 알림 시스템을 연동해서 사용하고 있습니다. 서버에서 로직 상 문제가 발생하거나 에러를 발생하면, Slack과 연동된 Sentry 알림을 통해 바로 알림을 확인할 수 있습니다. 때는, 퇴근하려던 무렵... 갑자기 Sentry에 아래와 같은 알람이 떴습니다. OutOfMemory Error... 갑작스럽게 OOM 에러가 발생해, 전체 서비스가 중단된 문제였습니다. 언제봐도 OOM은 무섭네요... OOM 에러가 발생해 서버를 확인해보니, 서버가 죽어서 아무런 요청 처리도 할 수 없는 상태가 되어 있었습니다. 다행히 저희는 공장 데이터를 관리하고 있는데, 공장의 실시간 데이터는 이러한 서버 장애를 대비하기 위해 서버와 상관 없이 계속 DB에 수집되고 있기 때문에 데이터 유실 문제는..

저희는 현재 프론트엔드 2개 & 서버 한개로 이루어 진 서비스를 운영 중입니다. 일반 로그인과 소셜 로그인을 둘 다 사용하고 있고 이를 효율적으로 사용하기 위해 Firebase Authenticaion Server을 사용하고 있습니다. 저희가 원래 Firebase을 사용한 이유는Google에서 제공하는 Firebase을 기반으로 한 인증 서버기 때문에 안전하다.여러 소셜 로그인을 쉽게 제공할 수 있다.별도의 서버를 구축할 필요 없이 Google이 관리하는 인프라를 활용 할 수 있어 편하다.등의 장점이 있습니다. 저희는 현재 이 인증 서버에서 전반적인 사용자 인증(아이디, 패스워드), 토큰 발급 & 검증 등의 작업을 위임하고 있습니다. 자체적인 UI 제공 및 프론트 & 백엔드와의 연동 라이브러리가 잘 구축..

저희는 기본적으로 IoT 데이터의 경우 대용량 데이터이기 때문에 NoSQL 기반의 데이터베이스 인 ScyllaDB을 사용하여 데이터를 관리했습니다. 그러다보니 기본적인 데이터 (유저 데이터, 장비 Meta 데이터 등)도 ScyllaDB을 사용해서 개발을 진행했습니다. 하지만 NoSQL이다보니, 정형화 된 데이터와 트랜잭션 처리가 RDB보다 효율적이지 못해 이번에 추가적인 "승인" 도메인을 개발하면서 RDB을 반영하기로 결정했습니다. RDB을 반영하면서 고민한 사항은 크게 3가지 입니다.어떤 RDB을 사용할까?DB 서버가 다른데, 다른 서버 간의 트랜잭션을 관리 할 일이 있을까?백엔드 서버는 어떻게 처리할까? 하나로 가져갈까 DB 별로 분리해서 가져갈까? 이렇게 3가지를 고민했습니다. 고민하고 내린 결과는..

기본적으로 서버에서 IoT 기기들과 통신할 때, MQTT 프로토콜을 사용해서 통신합니다. 이 때 서버와 IoT 기기들끼리 1 : 1 통신을 하는 것이 아닌 중간 중개자인 MQTT Broker에 PUB / SUB 방식으로 통신을 진행합니다. 예를 들어, 서버가 특정 IoT 기기에게 메세지(신호)를 보내고 싶다면, IoT 기기가 구독하고 있는 토픽에 보낼 메세지를 추가하여 MQTT Broker에 Publish 합니다. 그러면, 해당 토픽을 구독하고 있는 IoT 기기가 해당 토픽을 Subscribe 한 후 메세지를 받습니다. 기본적으로 이러한 형식으로 서로 통신합니다. 결국, MQTT Pub-Sub 기반 IoT 제어 및 응답 흐름은,서버는 IoT 기기가 구독하는 특정 토픽에 요청 메시지를 담아 MQTT Bro..

저희 회사는 IoT 디바이스 간의 통신을 MQTT 프로토콜을 사용해서 처리하고 있습니다. 이 때 사용하는 MQTT Broker는 AWS IoT을 사용하고 있습니다. 이번에 처리할 내용이, 저희가 개발하고 있는 Backend 서버에 이 AWS IoT와의 연동을 처리해야 합니다. 그래서 연동을 처리하는 과정에서 생긴 문제와, AWS IoT Core가 어떤건지, 왜 사용했는지 정리하려고 합니다. MQTT BrokerMQTT Broker는 MQTT 프로토콜을 기반으로 하는 메시지 브로커로, 클라이언트 간의 메시지를 중계하는 서버 역할을 합니다. MQTT Broker에는 여러 종류가 있습니다. 크게 클라우드 기반과 오픈소스 기반의 MQTT Broker를 기준으로 정리하자면,클라우드 기반 MQTT BrokerAWS..