Thingsboard를 통해 IoT 디바이스들을 관제 및 모니터링하고 있다. 최근 서버 사양에 비해 단말정보를 한 번에 위젯이나 dashboard에 표시하는데 delay가 발생하고 있다. 특히 지도에 디바이스를 표시하는 맵 위젯을 사용하는 경우에 빈번하게 발생하는 듯하다.
Thingsboard는 다양한 프로토콜을 지원하고 있다. 나는 주로 MQTT REST API Websocket와 관련된 일을 하고 있다.
관제 및 모니터링을 위해 Thingsboard에 접속하면 브라우저상에 보이는 화면은 websocket를 통해 보인다.
현재 사용하고 있는 환경은 AWS t3.xlarge 인스턴스이다. Thingsboard에서 가이드하기로는 m 계열 인스턴스를 사용하라고 권장하고 있다.
Websocket error 1011 문제 발생 현상
Websocket error 1011 : InternalServerError 서버 오류로 인해 서버에서 연결을 닫습니다.
즉 서버 쪽에서 세팅이나 튜닝을 진행해줘야 한단 결론.
주요 Websocket error
Empty | 1005 | 지정된 오류가 없습니다. |
EndpointUnavailable | 1001 | (1001) 엔드포인트를 제거하는 중임을 나타냅니다. 서버 또는 클라이언트를 사용할 수 없게 됩니다. |
InternalServerError | 1011 | (1011) 서버 오류로 인해 서버에서 연결을 닫습니다. |
InvalidMessageType | 1003 | (1003) 클라이언트 또는 서버에서 받은 데이터 형식을 허용할 수 없으므로 연결을 종료합니다. |
InvalidPayloadData | 1007 | (1007) 클라이언트 또는 서버에서 메시지 유형과 일치하지 않는 데이터를 받았으므로 연결을 종료합니다. |
MandatoryExtension | 1010 | (1010) 클라이언트에서 서버가 확장을 협상할 것으로 예상되어 연결을 종료합니다. |
MessageTooBig | 1009 | (1009) 클라이언트 또는 서버에서 너무 커서 처리할 수 없는 메시지를 받았으므로 연결을 종료합니다. |
NormalClosure | 1000 | (1000) 요청이 처리된 후 연결이 닫혔습니다. |
PolicyViolation | 1008 | (1008) 엔드포인트에서 해당 정책을 위반하는 메시지를 수신했으므로 연결을 닫습니다. |
ProtocolError | 1002 | (1002) 프로토콜 오류로 인해 클라이언트 또는 서버에서 연결을 종료합니다. |
Websocket 관련 상세 스펙 https://www.iana.org/assignments/websocket/websocket.xhtml
Thingsboard websocket error 1011 개선 가이드
가이드받은 내용은 Thingsboard 앞단의 Proxy 서버로 사용 중인 haproxy 값을 변경하란 내용이었다.
현재 설정을 30분 정도로 늘리라는 것이다.
이하 설정 파일에서 해당 내용을 수정하였다.
그리고 현재까지는 한 달가량 경과되었으나. 재현되지 않고 있다.
sudo vi /etc/haproxy/haproxy.cfg
defaults
log global
mode http
# WebSocket error 1011 from 50000ms to 1,800,000ms
timeout connect 5000ms
#timeout client 50000ms
timeout client 1800000ms
#timeout server 50000ms
timeout server 1800000ms
Thingsboard의 API & Rate Limits 설정 가이드 문서
https://thingsboard.io/docs/pe/user-guide/api-limits/
API 및 속도 제한
API 및 속도 제한 기능을 사용하면 단일 시간 단위(분, 시간 등) 동안 단일 호스트/장치/테넌트의 요청 수를 제한하여 API 사용을 제어할 수 있습니다.
API 및 속도 제한은 기본적으로 비활성화되어 있습니다. 시스템 관리자는 thingsboard.yml을 사용하여 속도 제한을 구성할 수 있습니다.
REST API 제한
REST API 호출은 모든 종류의 UI 구성 요소와 고객 사용자 또는 테넌트 사용자를 대신하여 실행되는 일부 자동 스크립트에서 사용됩니다. 사용자 지정 위젯 또는 스크립트의 실수로 인한 서버 과부하를 방지하려면 테넌트 또는 고객에 의한 API 호출의 양을 제한하는 것이 중요합니다.
rest.limits.tenant.enabled 매개변수 또는 TB_SERVER_REST_LIMITS_TENANT_ENABLED 환경 속성은 테넌트 수준 제한을 활성화/비활성화합니다.
rest.limits.tenant.configuration 파라미터 또는 TB_SERVER_REST_LIMITS_TENANT_CONFIGURATION 환경 속성 은 최대 REST API 호출량을 구성합니다. 예를 들어 "100:1,2000:60" 값은 초당 100개 이하의 요청, 분당 2,000개 이하의 요청을 의미합니다.
웹 소켓 제한
웹 소켓은 장치에서 대시보드로 새로운 원격 측정값에 대한 실시간 알림을 전달하는 데 사용됩니다.
ws.send_timeout 매개변수 또는 TB_SERVER_WS_SEND_TIMEOUT 환경 속성 은 웹 소켓 메시지가 클라이언트로 성공적으로 전달되는 최대 시간을 제어합니다. 클라이언트가 너무 느리면 세션이 닫힙니다.
ws.limits.max_queue_per_ws_session 파라미터 또는 TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_QUEUE_PER_WS_SESSION 환경 속성은 클라이언트로 전달을 기다리는 최대 메시지를 제어합니다.클라이언트가 너무 느리면 세션이 닫힙니다.
ws.limits.max_sessions_per_ * 매개변수 또는 TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_SESSIONS_PER_* 환경 속성은 테넌트, 고객, 공용 또는 일반 사용자와 같은 특정 엔터티당 활성 연결의 최대 양을 제어합니다. 특정 기준당 세션이 너무 많으면 새 연결이 끊어집니다.
ws.limits.max_subscriptions_per_ * 매개변수 또는 TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_SUBSCRIPTIONS_PER_* 환경 속성은 테넌트, 고객, 공개 또는 일반 사용자와 같은 특정 엔터티당 모든 세션 내 활성 구독의 최대 양을 제어합니다. 특정 기준에 너무 많은 구독이 있는 경우 새 구독이 허용되지 않습니다.
ws.limits.max_updates_per_session 매개변수 또는 TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_UPDATES_PER_SESSION 환경 속성은 각 세션에 대해 서버에서 클라이언트로 보내는 최대 메시지 양을 구성합니다. 예를 들어 "300:1,3000:60" 값은 초당 300개 이하의 업데이트와 분당 3000개 이하의 업데이트를 의미합니다.
아래에서 샘플 구성을 찾을 수 있습니다.
댓글