-
시계열 데이터를 전송하는 방법프로그래밍 2024. 10. 25. 15:31
지난 시간에 멀티 스레드에서 다중 전송할 경우 큐를 이용해서 전송하는 방법을 알아보았다.
시계열 데이터를 처리할 때 필자는 클라이언트에서 큐를 이용하여 처리해야 하는 것으로 생각하였으나 이러한 부분을 전혀 고려하지 않아 발생하는 문제를 해결하는 과정에서의 결론을 적어본다.
상황은 이렇다.
N개의 센서를 모바일을 이용하여 BLE 데이터를 수신, 이후 해당 데이터를 서버에 전송하는 형식이다.
서버에서는 각각의 센서 데이터를 수신받아 공유자에게 전송하고 동시에 Kafka를 이용하여 데이터를 적재하고 있다.
먼저 클라이언트에서 BLE데이터를 발송할 때 위와 같은 케이스라면 코루틴에서 동작하게 된다. 코루틴은 이벤트가 언제 발생할지 알 수 없으므로 코루틴에서 데이터를 직접적으로 발신하는 경우 발신 데이터가 전송 속도가 이벤트 속도보다 느리다면 발신하는 HttpRequest또는 WebSocket은 요청된 순서를 무시하여 발신하게 된다.
따라서, 해당 데이터가 시계열 데이터일 경우 Sqlite 또는 Inmemory상에 Queue로 처리해야만 순서를 보장할 수 있다.
시계열 데이터는 시간 기준 데이터이므로 순서가 보장되지 않을 경우 별도의 후처가 되어야 하고, 만약 nosql을 이용한다면 정렬에 따른 부하가 매번 발생하게 된다.
또한 전송하는 방식이 Http라면 socket 고갈로 이어질 수 있으므로 오류가 발생할 수 있다.
위에서 이야기하는 것을 그림으로 표현하면 아래와 같다.
만약 Event에서 직접 전송을 할 경우 조건이 필요한데 Request에 대한 요청 및 회신이 이벤트 시간 내에 끝난다는 전제가 필요하다. 또한 동시적으로 request가 발생하는 경우라면 어떤 데이터가 전송되었는지 알 수 없을 뿐더러 전송 데이터에 누락이 발생한다.
따라서, 이러한 행위를 할 때는 큐에 담아서 처리하는 것을 최우선 적으로 고려해야 한다.
큐는 그 자체로 순서를 보장하기 때문이다.
만약, 해당 큐를 서버에서 구현한다면 서버 큐를 해야하지 말아야 하는 이유는 아래와 같다.
1. 서버 다운시 큐의 데이터는 모두 사라진다.
2. 서버 메모리는 무한대가 아니다.
3. 서버 큐는 순서를 보장하는 큐가 아니다.
일반적으로 실시간으로 처리되는 모든 데이터는 시계열 데이터이다.
따라서, 서버측에서 순서를 알 수 없으므로 당연히 클라이언트에서 처리해야만 한다.
만약, 브라우저 및 모바일 앱은 모두 background tasks를 구현하고 있다.
따라서 시계열 데이터, 즉, 순서가 보장되어야 하는 데이터라면 반드시 큐를 이용하고 또는 storage를 큐로 이용해서 작업해야 한다.
도움이 되길 바라며...
'프로그래밍' 카테고리의 다른 글
c# 에서 mongodb를 다루는 방법 (0) 2024.11.19 Kafka Consumer를 조금 더 효율적으로 처리하는 방법 (0) 2024.11.13 사용자 Session을 처리하는 방법 (1) 2024.10.24 GUID대신 ULID를 사용해 보자. (2) 2024.10.23 AntdUI 소개 (1) 2024.10.22