MQTT 프로토콜 – Facebook 메신저를 IoT 장치에 전원을 공급합니다
요약:
인스턴트 메시징 또는 실시간 커뮤니케이션 : 현장 뒤
많은 사람들, 특히 노드로 일하는 사람들에게.JS, 실시간 커뮤니케이션 (RTC)이 친숙해 보일 수 있습니다. 노드를 사용하여 구축 된 채팅 응용 프로그램.JS는 개발자에게 일반적인 출발점이되었습니다. 그러나 진정한 실시간 커뮤니케이션을 달성하는 것은 쉽지 않습니다. 이 기사에서는 RTC를 다룰 때 Facebook, Slack, Discord 및 Telegram과 같은 주요 회사가 직면 한 실제 문제에 대한 개요를 제공 할 것입니다.
이 기사는 RTC에만 초점을 맞추고 데이터베이스 시스템 설계 또는 코딩과 같은 주제를 다루지 않습니다.
키 포인트:
1. 불안정한 네트워크 연결 및 기타 문제로 인해 실시간 커뮤니케이션은 여전히 어려운 주제입니다.
2. RTC에는 양방향 통신, WebSocket, Server Sent Events, Short/Long Polling 및 MQTT와 같은 기본 개념 이해.
삼. 주요 채팅 응용 프로그램의 브라우저와 서버간에 교환 된 데이터 분석은 귀중한 통찰력을 제공 할 수 있습니다.
4. Facebook Messenger는 메시지, 입력 및 기타 기능을 보내거나받는 데 Websocket을 통해 MQTT를 사용합니다.
5. Instagram은 또한 WebSocket을 통해 MQTT를 사용하지만 메시지보기 및 사용자 목록과 같은 기능에 대한 추가 API 호출을 사용합니다.
6. Telegram은 모든 기능에 대해서만 WebSocket에만 의존합니다.
7. Slack and Discord는 WebSocket을 결합하고 API는 다른 기능을 요구합니다.
8. Zalo는 메시지 및 기타 기능을 수신하기 위해 API 및 HTTP 긴 폴링을 사용합니다.
9. 대기업은 실시간 커뮤니케이션을 위해 WebSocket/TCP에 크게 의존합니다.
10. WebSocket을 API 통화와 결합하면 시스템을보다 쉽게 확장하고 관리 할 수 있습니다.
질문:
1. 실시간 커뮤니케이션을 위해 Facebook 메신저 및 Instagram 사용 기술?
Facebook Messenger와 Instagram은 모두 실시간 커뮤니케이션을 위해 WebSocket을 통해 MQTT를 사용합니다.
2. Facebook Messenger의 실시간 커뮤니케이션 시스템에서 지원하는 일부 기능은 무엇입니까??
Facebook Messenger의 실시간 커뮤니케이션 시스템은 메시지 보내기/수신, 입력 및 요청과 같은 기능을 지원합니다.
삼. Instagram의 실시간 커뮤니케이션 시스템은 Facebook 메신저의 것과 어떻게 다른가??
Instagram은 실시간 커뮤니케이션을 위해 WebSocket을 통해 MQTT를 사용하지만 메시지보기 및 사용자 목록과 같은 기능에 대한 API 호출에 추가로 의존합니다.
4. 실시간 커뮤니케이션을 위해 전보 사용되는 기술?
Telegram은 모든 실시간 커뮤니케이션 기능에 대해 WebSocket에만 의존합니다.
5. 슬랙의 실시간 통신 시스템은 어떻게 작동합니까??
Slack은 WebSocket과 API 호출을 결합하여 항목 목록 및 메시지 보내기와 같은 기능과 함께 실시간 메시지 수신 및 타이핑을 활성화합니다.
6. Discord의 실시간 커뮤니케이션 시스템의 기술은 무엇입니까??
Discord의 실시간 통신 시스템은 WebSocket과 API를 사용하여 메시지 수신, 항목 목록, 메시지 보내기, 입력 및 기능보기를 요구합니다.
7. Zalo는 실시간 커뮤니케이션을 어떻게 처리합니까??
Zalo는 실시간 커뮤니케이션을 위해 API와 HTTP Long Polling의 조합을 사용합니다. 메시지 수신, 항목 목록, 메시지 보내기, 타이핑 및 보이는 기능과 같은 기능을 지원합니다.
8. 대기업은 실시간 커뮤니케이션에 의존하는 것은 무엇입니까??
대기업은 실시간 커뮤니케이션을 위해 WebSocket/TCP에 크게 의존합니다.
9. WebSocket과 API 통화 제안을 결합한 장점은 무엇입니까??
WebSocket을 API 통화와 결합하면 실시간 통신 시스템을보다 쉽게 확장하고 관리 할 수 있습니다. API 전화는 클라이언트로부터 메시지를 보내는 데 사용될 수 있으며 인증, 승인 및 요금 제한을 위해 기존 미들웨어 계층을 활용할 수 있습니다.
10. 일부 회사는 WebSocket과 API 통화의 조합을 사용하는 이유?
WebSocket 및 API Call을 모두 사용하면 회사는 특정 기능에 대한 HTTP API의 확장 성을 활용할 수 있으며 실시간 메시지 전송을위한 WebSocket의 이점을 누리십시오. 또한 기존 미들웨어 계층을 재사용하고 스케일링 프로세스를 단순화 할 수 있습니다.
11. Instagram의 실시간 커뮤니케이션 시스템이 Facebook 메신저의 것과 다른 이유?
Instagram은 처음에 Facebook과 별도로 개발되었으며 나중에 인수되었습니다. 따라서 Facebook (WebSocket 기반)에서 사용하는 동기화 시스템과 Instagram의 기존 시스템에 차이가있을 수 있습니다.
12. 실시간 커뮤니케이션을위한 WebSocket 및 MQTT와 같은 기본 개념을 이해하는 것이 무엇입니까??
WebSocket 및 MQTT와 같은 기본 개념은 실시간 커뮤니케이션을 이해하는 데 필수적이며 개발자가보다 효율적이고 신뢰할 수있는 시스템을 구축 할 수 있습니다.
13. 노드를 사용하여 채팅 애플리케이션을 구축하기위한 튜토리얼은 어떻게합니까?.JS는 개발자를 돕습니다?
노드를 사용하여 채팅 애플리케이션 구축에 대한 튜토리얼.JS는 개발자에게 실시간 커뮤니케이션 여정을 시작하는 데 필요한 자신감을 제공합니다. 그러나 진정으로 실시간 커뮤니케이션 시스템을 구축하는 것은 다양한 과제를 극복하는 데 도움이된다는 것을 알고 있어야합니다.
14. WebSocket 서버를 사소한 작업으로 스케일링하는 이유는 무엇입니까??
WebSocket은 웹 소싱 서버를 스케일링하는 것이 사소한 작업입니다. WebSocket은 단일 지속적인 연결을 열어야하는 상태의 통신 프로토콜이기 때문입니다. WebSocket은 서버에서 클라이언트로 메시지를 보내는 데 효율적이지만 클라이언트의 메시지 녹화와 같은 다른 논리 작업에 사용하는 데 사용하는 것은 어려울 수 있습니다.
15. 주요 채팅 애플리케이션의 브라우저와 서버간에 교환 된 데이터를 검사하는 목적은 무엇입니까??
주요 채팅 응용 프로그램의 브라우저와 서버간에 교환 된 데이터를 검사하면 개발자는 실시간 통신의 실제 구현에 대한 통찰력을 얻고 기존 시스템에서 학습 할 수 있습니다.
MQTT 프로토콜 – Facebook 메신저를 IoT 장치에 전원을 공급합니다
메시지 페이로드는 이진으로 인코딩됩니다. 수신자가 다른 제조업체의 오픈 네트워크에서 메시지 페이로드가 인코딩되는 방법에 대한 정보가 없으므로 해독하는 문제에 직면하게됩니다.
인스턴트 메시징 또는 실시간 커뮤니케이션 : 현장 뒤
많은 사람들, 특히 노드로 일하는 사람들에게.JS,이 주제는 새로운 것이 아닙니다. 같은 튜토리얼이 많이 있습니다 “노드를 사용하여 간단한 채팅 앱을 만듭니다.JS”, “노드를 사용한 실시간 채팅 앱.JS Express 및 소켓.io”, 등. 그들은 어떻게 든 채팅 애플리케이션이 a가됩니다 “안녕하세요 세계” 노드로 여행을 시작하려는 우리 중 누구나.JS. 그들의 존재에 대한 좋은 점은 당신에게 자신감을주는 것입니다. 어느 정도까지, 짧은 시간 내에 Facebook 메신저와 같은 것을 만들 수 있는지 어떻게 확신하지 못하는가 (1h 어쩌면?))? 나쁜 점은 그 것입니다 그렇게 쉽지 않습니다.
사실, 얼마나 많은 노력이 제안되었는지에 관계없이 실시간 커뮤니케이션 (RTC)은 여전히 업계와 학술 커뮤니티 모두에서 인기있는 주제입니다. 불안정한 네트워크 연결, 중복/충돌 연결, 중복 메시지 등의 많은 통제 불능 영향으로 인해., 실시간 실시간 경험을 얻는 것은 어려운 일입니다 (아니요, Hello-World 튜토리얼을 마치는 것으로 느끼는 것은 아닙니다. 이 게시물에서는 Facebook, Slack, Discord, Telegram 등과 같은 Big Guys가 고려한 실제 문제에 대한 개요를 제공합니다.
실시간 커뮤니케이션에 관한 것이므로 2 방향 통신, WebSocket, Server Sent Events, Short/Long Polling, MQTT와 같은 기본 개념을 둘러 보는 것이 좋습니다. 또한 DB 시스템 설계 또는 선택 또는 코딩에 관한 것이 아니라 RTC 만.
큰 사람들로부터
상사가 Facebook Messenger 또는 WhatsApp과 같은 채팅 시스템을 구축하도록 요청하면 어떻게 하시겠습니까?? 다음은 사용할 수있는 목록입니다
- 튜토리얼을 찾으십시오?
- 시스템 설계 전자 책
- 교육을받은 수백만 명의 사용자를위한 채팅 앱 디자인.io
- Facebook 엔지니어링 블로그가 자신의 작업에 대해 유출되기를 바랍니다
- Google “채팅 앱을 만드는 방법” 30 억 개 이상의 결과가 있습니다.
그러나 처음부터 또는 모든 단계에서해야 할 필수 단계가 있습니다. 웹 응용 프로그램을 열고 브라우저와 서버간에 교환 된 데이터를 검사하십시오. 저것’채팅 백엔드의 주요 기능을 기반으로 다음 섹션에서 보여 드리겠습니다
- 나열을 나열하고 메시지를 나열합니다
- 문자 보내
- 메시지를받습니다
- 타자
- 본다
페이스 북 메신저
기술: WebSocket의 MQTT
특징: 메시지 보내기/받기, 입력, 요청 등. WebSocket 전체에
WebSocket 요청에 대한 응답 데이터를보십시오 가장자리 chat.전령.com. 데이터로드, 항목 목록, 메시지 보내기/수신, 입력에 대한 모든 요청은 메시지 게시 및 API가 아닌 WebSocket에 가입하여 수행됩니다.
인스 타 그램
동일한 회사, 따라서 같은 기술. 그러나 같은 기원은 아니므로 약간의 차이가 있습니다.
기술: WebSocket + API를 통해 MQTT
특징: 메시지 보내기/수신 및 웹 소켓을 통해 타이핑, 항목 목록, 표시, 사용자 온라인 목록 등. API 이상.
전보
기술: WebSocket
특징: WebSocket 전체에
느슨하게
기술: WebSocket + API
특징: 메시지 수신 및 웹 소켓을 통해 타이핑, 항목 목록, API를 통해 메시지 보내기.
불화
기술: WebSocket + API
특징: WebSocket, 항목 목록, 메시지 보내기, 입력, API를 통해 표시되는 메시지 수신.
졸로
기술: API 및 HTTP 긴 폴링
특징: HTTP 긴 폴링, 항목 나열, 메시지 보내기, 입력, API를 통해 보이는 메시지 수신.
우리 차례
그래서 우리는 몇 가지 관찰을 생각해냅니다
- 큰 사람들은 WebSocket/TCP에 완전히 의존합니다
- 크게 큰 사람은 WebSocket을 결합하여 서버와 API로부터 메시지를 수신하여 서버로 메시지를 보냅니다.
- Zalo Case – 전혀 모른다
내 생각 중 일부는 다음과 같습니다
- WebSocket을 사용하는 성능은 HTTP 요청을 호출하는 것보다 훨씬 낫지 만 WebSocket 서버 스케일링은 단일의 지속적인 연결을 열어두기 때문에 상태가 완성 된 통신 프로토콜이기 때문에 사소한 작업입니다. 따라서 서버는 클라이언트에 메시지를 보내는 데만 사용됩니다. 클라이언트로부터 메시지 녹화와 같은 다른 논리 작업에 사용하는 경우,하지 말아야 할 일을하도록 요청하는 것입니다.
- HTTP API는 스테일리스 API를 스케일링하는 것보다 훨씬 쉽게 webSocket을 확장하기 때문에 클라이언트의 메시지를 보내는 데 유용합니다. 또한 인증, 인증, 요금 제한 등을 위해 기존 미들웨어 계층을 재사용 할 수 있습니다.
- 확장 가능한 WebSocket 시스템을 구축 할 수있는 사람들의 경우 메시지 전송을 최적화하기 위해 WebSocket을 사용하도록 HTTP 요청을 완전히 이동하는 것이 좋습니다. 비실한 작업에 대해서도 데이터 요청의 전체 메커니즘을 동기화해야합니다.
- Instagram은 원래 개발되지 않고 원래 개발 된 것이 아니라 Facebook 사이에 간격이 있어야한다는 것을 이해할 수 있습니다’S 동기화 시스템 (WebSocket 기반) 및 기존 Instagram One.
- Slack, Discord와 같은 앱의 경우 HTTP API의 확장 성을 활용하고 WebSocket을 사용하여 서버에서 메시지를 보내거나 타이핑과 같은 고위급 요청에 대해서만.
- Zalo가 따르는 접근 방식은 3 가지 장점으로 설명 할 수 있습니다. i) WebSocket이 아닌 HTTP 긴 폴링 호환성을 갖춘 매우 오래된 브라우저를 지원합니다. ii) Web Zalo는 Mobile Zalo에 대한 추가 버전이 될 수 있습니다.
다음에, 메시지를 보내거나받는 데 WebSocket을 완전히 사용하도록 제안하는 사람이라면, 그 사람은 다음과 같아야합니다
- 실시간 요구 사항을 처음 접하고 실제 경험이 부족하고 하루가 끝나면 트래픽 수요가 증가함에 따라 시스템을 확장하기가 어렵고 처리 할 수 없습니다.
- 또는 Facebook 또는 Telegram과 같은 대규모 시스템에 대한 매우 경험.
현장 뒤에서
이 마지막 섹션에서 Let’S (이론적으로) Hello-World 교사들이 당신에게 말할 기회가 없었던 것들 (A **의 고통)을 경험합니다.
소켓.io?
이 도서관은 서버, Ping/Pong, Keep Alive, Store Session, Blah Blah 등 지루한 작업을 도와주는 마법의 만병 통치약 인 것 같습니다. 실시간 노드로 작업하면 여러분 모두가 시작할 수 있습니다.JS. 운이 좋지 않아, 당신이 그것에 깊이 관여하는 것처럼 당신이 직면하게 될 것들이 있습니다.
- QOS 메커니즘이 없습니다. 곧 클라이언트 측의 네트워크가 예상대로 안정적이지 않을 때 불편 함을 경험하게됩니다. 연결이 계속 위아래로 이동하면 메시지가 손실됩니다 소켓.io – QoS를 보장하지 않고 캔’신뢰할 수 없습니다.
- 스케일링? WebSocket 노드가 오버로드되면 확장하거나 확장합니다. 저것’당신이 평소에하는 일, 맞습니다? 이 순간, Redis 어댑터는 Redis Pubsub를 통해 노드들 사이의 다리로 그림으로 올 것입니다. 문제는 물리적 노드의 수에 따른 Pubsub의 콜백 메커니즘 계산으로 메시지를 방출하는 다른 프로세스에 첨부 할 때 몇 가지 문제가 발생했습니다. 또한 Redis Pubsub는 데이터베이스 번호가 아닌 전체 Redis 서버에서 사용되기 때문에 다른 환경의 메시지가 쉽게 엉망이됩니다.
- 버전 브레이크. 지금까지 소켓.IO는 여전히 개발 중이며 일부 기능은 최신 버전에서만 사용할 수 있습니다. 현재 우리가 그것을 채택했을 때, 타입 스크립트 및 어댑터 부품이 완료되지 않았으며 개발 단계에서 많은 오류가있었습니다.
- 콜백에 의한 ACK. 나는 돈을하지 않는다’콜백처럼’앉다. 나는 만 사용한다 불 그리고 잊다 내가하지 않기 때문에 더 이상 이벤트’콜백을 과도하게 사용한 결과를 완전히 처리 할 수 있다고 생각합니다.
- 불안정한 탁구 /판: 좋은 연결성이 있어도, 소켓.io Ping/Pong 기본 시간 초과 변경에 관계없이 클라이언트는 여전히 일정 시간이 지나도 자주 분리되거나로드 밸런서의 시간 초과 증가. 이 모든 문제가 열려 있었고 당신이 그것을 가지고 있다면, 그것은 단순히 당신이 운이 좋지 않다는 것입니다.
일반적으로, 소켓.io 기본 수준에서 일합니다. 안정성 요구 사항이있는 실제 프로젝트를 위해 채택하려면 여전히해야 할 일이 여전히 많습니다.이자형. QOS 보증, 스케일링,이 추적 추적을 추적합니다. 가장 어려운 부분은 단절이 발생할 때 클라이언트와 서버의 상태를 동기화하는 것입니다.
MQTT
MQTT는 소규모 전송 데이터로 인해 IoT 애플리케이션에서 인기가 있으므로 신뢰할 수없는 스마트 장치 네트워크에 적합합니다. 펍/하위 메커니즘으로 설계되었으며 QoS, Persistent Session, Last Will 메시지와 같은 좋은 내장 기능이 있습니다. 이것은 위에서 언급 한대로 실시간 앱에 Facebook에서 사용하는 프로토콜입니다.
우리는 앱이 세상의 정상에 도달하기를 원하기 때문에 노력했습니다. 그러나 다시는 쉽지 않습니다.
- 우리의 사고 방식을 바꾸십시오. MQTT에는 객실이나 라우팅 백엔드와 같은 개념이 없습니다. 방은 백엔드에서 관리하는 것입니다 소켓.io 채팅방 생성, 신규 사용자 삽입 및 채팅방에 메시지를 자동으로 배출 할 수 있습니다. MQTT를 사용하면 주제를 듣는 방식이 클라이언트에 따라 다르기 때문에 각 주제에 혼자서 방을 관리해야합니다. 특정 주제에 대한 구독은 클라이언트가 새로운 주제를 구독하거나 구독하도록 강요하는 동안 연결이 설정된 후에 만 발생합니다.
- 스케일링? 아니요, 그것은 단지 마케팅 또는 광고, 당신이 부르는 모든 것, Mosquitto, Vernemq 또는 Emq X와 같은 사람들이 매우 잘 확장 할 수 있다고 말할 때 단지 마케팅 또는 광고입니다. 트래픽 수요가 높은 클러스터에 대한 여러 메시지 중개인을 시도했을 때 많은 문제가 발생하여 하나씩 고통 스럽습니다. 씨’est la vie, 당신은 그들의 제품을 사용하고, 당신은 그들에게 의존하고, 그들이’T 문제를 해결하십시오. 우리는 무엇을 말할 수 있는지?
- 충돌 연결. 이것은 클라이언트 측에서 매우 까다 롭습니다. 영구 세션 기능을 활용하려면 클라이언트 ID를 변경하지 않아야합니다. 이는 앱이 잘 코딩되지 않으면 어려운 작업입니다. 여러 번 MQTT 연결 인스턴스가 1 개만 정의되었지만 동일한 ID를 가진 여러 인스턴스가 어떻게 존재할 수 있는지 전혀 몰랐습니다. 결과적으로 고객은 서로를 쫓아 내고 아무도 연결할 수 없습니다. 이 경우 프론트 엔드 녀석 외에는 문제를 해결할 수 없습니다.
- 보안. MQTT 시스템과 소켓.io 하나, 주로 주제의 구성과 구독 패턴 때문에.
알면 MQTT가 API 접근 방식보다 더 취약하다는 것을 알 수 있습니다. 보안 문제는 구현뿐만 아니라 제 3 자 메시지 중개인에서도 비롯됩니다. EMQ X의 보안 문제는 다른 고객에게 가짜 데이터를 보낼 수 있도록 인증을 우회 할 수있는 보안 문제가 우리 팀에서 수정되었으며 여전히 공개 문제입니다. 적어도 MQTT 구현은 채팅 시스템의 신뢰성을 향상시키고 이전과 같이 누락 된 메시지를 피하십시오.
결론
실시간 커뮤니케이션은 어려운 문제이며 많은 지식과 경험이 필요합니다. 같은 요구 사항, i.이자형. “페이스 북과 같은 메신저” 상황에 따라 1 시간, 3 시간, 그리고 2 년 동안 수행 할 수 있습니다.
인정하다
Quang Minh에게 큰 감사를 표합니다 (A.케이.Minh Monmen) 그의 원래 게시물을 번역 할 수있는 권한.
MQTT 프로토콜 – Facebook 메신저를 IoT 장치에 전원을 공급합니다
공유하다
- 트위터
- Facebook Instagram-> Google+ GooglePlus-> copy->
2011 년 Lucy Zhang, Ben Davenport 및 Jon Perlow는 Facebook에 가입하여 Facebook 메신저 구축을 시작했습니다. 그들의 노력에 큰 장애물은 메시지를 보낼 때 긴 대기 시간이었습니다. 메시지를 보내기 위해 사용했던 방법은 신뢰할 수 있지만 느 렸습니다. 그들은 또한 어느 정도 그것을 최적화 할 수있었습니다. 출시 몇 주 전에 그들은 메시징 대기열 원격 측정 교통 (MQTT) 프로토콜을 탐색했습니다. MQTT의 도움으로 Lucy Zhang과 Team은 배터리 수명을 줄이지 않고 Facebook 서버와 지속적으로 연결을 유지할 수있었습니다.
따라서 MQTT 프로토콜이란 무엇입니까??
1999 년 Dr. IBM의 Andy Stanford-Clark 및 Arcom의 Arlen Nipper, MQTT는 TCP/IP 프로토콜 위에 가벼운 메시징 프로토콜입니다. MQTT.
MQTT 프로토콜은 클라이언트 서버, 게시자/가입자, 오픈 및 가벼운 메시징 전송 프로토콜입니다. MQTT의 중심에는 MQTT 브로커로 알려진 중심 커뮤니케이션 지점이 있습니다. 메시지를 정당한 클라이언트에게 분산시킬 책임이 있습니다.
MQTT 브로커에 메시지를 게시하는 각 클라이언트에는 주제로 알려진 라우팅 정보가 포함됩니다. 클라이언트는 여러 주제를 구독하고 주제와 일치하는 모든 메시지가 게시 될 수 있습니다. 고객은 돈을받습니다’정보를 받으려면 서로를 알아야합니다. 관련 주제를 구독하면됩니다.
예를 들어, 세 명의 클라이언트의 간단한 네트워크를 상상해보십시오.E A, B 및 C, 여기서 각각 TCP 연결을 통해 브로커에 연결되어 있습니다. Client-B 및 Client-C는 주제를 구독합니다 : 온도.
Client-A는 34를 게시합니다.주제 온도의 경우 5. 브로커는이를 식별 하고이 메시지를 모든 가입자에게 전달합니다.이 경우 Client-B 및 Client-C입니다.
MQTT의 게시자 수용자 아키텍처는 데이터 제작자와 소비자 간의 종속성을 만들지 않고 매우 확장 가능한 솔루션으로 만듭니다.
MQTT 프로토콜의 메시지 형식
MQTT의 모든 메시지에는 작은 코드 풋 프린트가 있으므로 가벼운 메시징 프로토콜로 인기가 있습니다. 각 MQTT 메시지는 다음으로 구성됩니다
- 고정 헤더 (2 바이트)
- 선택적 변수 헤더
- 메시지 페이로드 (
- 서비스 품질 (QOS) 수준
MQTT는 일대일, 일대일 및 다수의 커뮤니케이션을 지원합니다.
전송 된 데이터 양을 낮추면 MQTT는 제한된 IoT 장치를위한 완벽한 프로토콜을 만듭니다.
메시지 페이로드는 이진으로 인코딩됩니다. 수신자가 다른 제조업체의 오픈 네트워크에서 메시지 페이로드가 인코딩되는 방법에 대한 정보가 없으므로 해독하는 문제에 직면하게됩니다.
MQTT 프로토콜의 서비스 품질 (QOS) 레벨
서비스 품질 수준은 콘텐츠 관리 방법을 결정합니다. MQTT는 세 가지 다른 QOS 수준을 사용합니다. 클라이언트와 서버가 메시지를 전달하기 위해 통신하는 방법을 결정하기 때문에 모든 메시지에 적합한 QOS 레벨을 선택하는 것이 중요합니다. MQTT의 QOS 수준은 다음과 같습니다
- QOS 0 : 운영 환경의 최선의 노력에 따라 전달되는 메시지이지만 메시지 손실이 발생할 수 있습니다
- QOS 1 : 메시지 전달이 보장되지만 복제를 생성 할 수 있습니다
- QOS 2 : 정확히 한 번 전달하는 메시지
MQTT는 적절한 QOS 레벨을 설정할 수있는 옵션을 제공하지만 기억하십시오, QOS가 높아지면 성능이 낮아집니다 .
MQTT 프로토콜의 보안
MQTT는 사용자 이름과 비밀번호를 MQTT 패킷으로 전달할 수 있습니다. 네트워크 전체의 메시지 암호화는 SSL (Secure Sockets Layer)을 사용하여 MQTT와 독립적으로 처리 할 수 있습니다. 최소 인증 기능이 내장되어 있습니다. 사용자 이름과 비밀번호는 명확한 텍스트로 전송됩니다. 보안을 유지하려면 SSL (Secure Sockets Layer)/ TLS (Transport Layer Security)를 사용해야하지만 SSL/ TLS는 가벼운 프로토콜이 아닙니다.
많은 업계 전문가들은 MQTT가 인벤토리 추적 및 의료 IoT와 같은 분야에 기여함으로써 IoT에서 중요한 역할을 할 것이라고 생각합니다..
메신저가 mqtt를 사용합니까?
화요일에 우리는 사람들이 일대일 1 또는 친구 그룹에게 메시지를 보낼 수있는 새로운 독립형 메시징 앱인 Facebook Messenger를 소개했습니다. 5 개월 전 다른 두 공동 창립자 인 Ben Davenport와 Jon Perlow와 함께 Facebook에 합류했습니다. 우리의 새로운 앱인 Facebook Messenger는 두 세계의 최고를 대표합니다. Beluga의 편의성과 단순성을 Facebook 메시지의 규모 및 통합과 결합합니다.
나는 벨루가를 만들게 된 몇 가지 인생 경험을 가졌습니다. 예를 들어, 우리 그룹이 뉴욕시의 Tribeca Film Festival에서 영화를 만나고 있었지만 영화를 이끄는 시간은 총 커뮤니케이션 실패였습니다. 다른 친구가 늦게 달리고 있다고 말할 친구 문자가 있었다. 우리는 다른 친구를위한 티켓을 저축하고 있었지만 그는 오지 않기로 결정했고 아무도 알지 못했습니다. 그것은 아니었다’t 몇 시간 후에 내가 집으로 돌아 왔을 때까지 나는 늦은 친구로부터 IM을 보았고 벨트를 쓴 친구의 이메일을 보았습니다. 우리는 Facebook Messenger를 생각합니다’채팅, 문자 메시지 및 이메일을 통합하는 능력은이 정확한 문제를 해결하는 데 도움이됩니다.
우리는 그룹 조정을위한 도구로 Beluga를 구축하기 시작했지만 가볍고 개인적으로 즉시 의사 소통을 가능하게하면 사람들이 서로 더 크게 연결되는 방식이 바뀔 수 있음을 발견했습니다. 여행 후 몇 주 후에 휴가 사진을 이메일로 보내는 대신 사람들은 순간에 더 많은 공유를 시작합니다. 메시지의 즉각적인 특성으로 인해 그룹 대화는 자발적으로 시작하고 컴퓨터에서 연결하는 사람들과 모바일 장치에있는 사람들 간의 격차를 해소 할 수 있습니다. 전령’Facebook 채팅과의 통합 이제 해당 시나리오가 현실이됩니다.
새로운 바닷물로 다이빙
우리가 Facebook에 가입하여 메신저를 구축하기 시작했을 때, 첫 번째 기술적 과제는 Facebook 메시지를위한 전체 인프라 스택을 배우는 것이 었습니다. 이미 수억 명의 사용자에게 이미 출시 된 확장 가능한 플랫폼을 구축하는 것이 좋았지 만 시스템에는 특정 가정과 설계 결정이 포함되어 있습니다’t 항상 우리가 구축하고 싶었던 제품과 상당히 메쉬. 운 좋게도, 새로운 동료들은 또한 메신저에 대한 비전에 대해 흥분했고 시스템이 필요한 일을 할 수 있도록 노력했습니다.
우리가 경험 한 문제 중 하나는 메시지를 보낼 때 긴 대기 시간이었습니다. 우리가 보내기 위해 사용했던 방법은 신뢰할 수 있지만 느 렸으며, 우리가 그것을 얼마나 개선 할 수 있는지에 대한 제한이있었습니다. 출시까지 몇 주 만에 우리는 서버와 지속적으로 연결을 유지하는 새로운 메커니즘을 구축하게되었습니다. 배터리 수명을 죽이지 않고이 작업을 수행하기 위해, 우리는 Beluga에서 실험 한 MQTT라는 프로토콜을 사용했습니다. MQTT. 채팅 파이프 라인을 통해 MQTT 연결 및 라우팅 메시지를 유지함으로써, 우리는 종종 몇 초가 아닌 수백 밀리 초에서 전화 간 전달을 달성 할 수있었습니다.
성능 및 시스템 통합 문제 외에 가장 큰 과제는 다른 커뮤니케이션 채널을 다양한 사용자 기대와 완벽하게 통합하는 방법에 대한 제품 결정이었습니다. 사람들은 전화로 채팅과 다르게 의사 소통합니다. 예를 들어, 채팅 대화를 시작할 수 있습니다 “이봐 요, 거기?” 그러나 당신은 아마도 아마도 그렇습니다’물론 그 사람 때문에 텍스트로 보내십시오’거기! 시스템을 똑똑하게 만들고 “오른쪽” 많은 다른 경우에는 규칙을 너무 복잡하게 만들면 느낄 수 있습니다 “마법 같은” 신뢰할 수있는 커뮤니케이션 채널과는 다릅니다.
메신저가 올바르게 느끼도록하기 위해 동료들과 다른 디자인을 끊임없이 테스트했습니다. Facebook 내에서 점점 더 많은 사람들에게 빌드를 출시하면서 더 많은 피드백을 얻었고 우리의 가정이 현실과 다른 곳을 배웠습니다. 우리’마침내 Facebook Messenger를 대중에게 시작하게되어 매우 기쁩니다. 그리고 우리는 수백만 명이 더 많은 사람들로부터 피드백을 받기를 기대합니다.
우리는 당신이 그것을 만들었던만큼 Facebook 메신저를 사용하는 것을 즐기시기 바랍니다!
소프트웨어 엔지니어 인 Lucy Zhang은 영화의 밤을 다시 조정하는 데 어려움을 겪지 않기를 기대합니다.
약한 인터넷으로 빠르게 작동하는 멋진 메신저를 만드는 방법
mqtt와 노드를 사용해야하는 이유.실시간 메시지를위한 JS
9 분 읽기
2017 년 5 월 23 일
현재 SPRO에서 개발하는 점점 더 많은 응용 프로그램에는 실시간 메시징 및 데이터 전송이 필요합니다. 대부분의 경우 소켓을 사용합니다.노드를위한 IO 라이브러리.JS. 그러나 장점이있는 대안이 있습니다. MQTT (메시지 대기열 원격 측정 전송) 중 하나입니다. 그리고 그’우리가 무엇을’여기에 대해 이야기합니다!
mqtt는 무엇입니까?
“제한된 장치 및 저 대역폭, 고도, 신뢰할 수없는 네트워크 용으로 설계된 게시/구독, 매우 간단하고 가벼운 메시징 프로토콜입니다. 설계 원칙은 네트워크 대역폭 및 장치 리소스 요구 사항을 최소화하는 동시에 신뢰성과 어느 정도의 배송 보증을 보장하는 것입니다. 이러한 원칙들은 또한 프로토콜을 신흥의 이상으로 만들었습니다 “기계 대 기신” (M2M) 또는 “사물의 인터넷” 연결된 장치의 세계 및 대역폭 및 배터리 전원이 프리미엄 인 모바일 애플리케이션.” – http : // mqtt.org/faq
따라서 MQTT는 TCP/IP를 통해 실행되는 단순화 된 네트워크 프로토콜입니다. Publish-Subscribe 패턴을 통해 장치 간 메시지를 교환하는 데 도움이됩니다. 프로토콜의 첫 번째 버전은 DR에 의해 개발되었습니다. 1999 년 Andy Stanford-Clark (IBM) 및 ARLEN NIPPER (ARCOM), 로열티 프리 라이센스에 따라 게시 됨. MQTT 3.1.1 사양은 2014 년 오아시스 컨소시엄에 의해 표준화되었습니다.
왜 당신은 그것을 좋아할 것입니까??
- 사용하기 쉬운. 이 프로토콜은 추가 기능이없는 프로그램 단위로, 복잡한 시스템에 쉽게 통합 될 수 있습니다.
- Publish-Sudscribe 패턴은 대부분의 솔루션에 편리합니다. 장치가 이전에 알려 지거나 사전 정의되지 않은 메시지를 통신하고 게시/받을 수 있습니다.
- 관리하기 쉽습니다.
- 통신 채널의 부하가 줄어 듭니다.
- 느리거나 불안정한 연결로 작동합니다.
- 전송 된 컨텐츠의 형식에 대한 제한이 없습니다.
혜택은 어떻습니까?
- 이진
- 낮은 오버 헤드 (2+ 바이트)
- 다중 QOS 레벨
- 오프라인 메시징
- 주제 와일드 카드 +, #
- 보유 된 메시지, 마지막 의지와 유언, 심장 박동 및 기타 것들…
허락하다’s 봐!
이진 및 낮은 오버 헤드
전송 된 이진 데이터의 구조에는 오버 헤드가 매우 낮습니다. 이는 다른 많은 프로토콜 (예 : HTTP의 경우)과 비교하여 정보 전송으로 네트워크를로드하지 않으며, 이는 프로토콜의 기능에만 필요합니다. 3G 네트워크에서 이루어진 측정에 따르면 MQTT’S 용량은 나머지 (표현 상태 전송) 프로토콜보다 93 배 높음 HTTP를 통해 실행됩니다.
다중 QOS 레벨
MQTT는 서비스 품질 (QOS) 레벨을 지정할 수 있습니다. 일반적으로 세 가지 수준이 있습니다
- QOS 0. 수신자는 메시지 수신을 확인하지 않습니다. 따라서 발신자는 메시지를 한 번만 전송합니다. 이것이 “보내고 잊어 버리십시오” 방법.
- QOS 1. 수신자가 적어도 한 번은 메시지를 받게됩니다. 이 경우 가입자는 동일한 메시지를 여러 번받을 수 있습니다. 그리고 발신자는 메시지의 성공적인 전달을 확인할 때까지 반복적으로 보내는 시도를 할 것입니다.
- QOS 2. 가장 느린 메시지 전달 절차는이 수준의 서비스 품질에 해당하지만 가장 신뢰할 수있는 것입니다. 주요 기능은의 구현입니다 “일회성 메시지 전달” 전략. 4 단계 메시지 전달 확인 절차를 제공합니다.
다음을 기반으로 특정 수준의 서비스 품질을 선택합니다
- 전송 된 데이터의 특성
- 전달되는 것의 중요성.
오프라인 메시징/영구 세션
이 옵션은 활성화되거나 비활성화 될 수 있습니다. 언제 “0” 설정되어 브로커가 세션과 모든 클라이언트를 저장합니다’s 구독. 다음에 연결이 설정되면 단절 중에 브로커가 수신 한 QoS1 및 QOS2의 모든 메시지가 표시됩니다. 따라서 언제 “1” 설정이 설정되고 연결이 갱신되고 클라이언트는 주제를 다시 구독해야합니다.
주제 와일드 카드
주제는 UTF-8 문자열이며 브로커가 연결하는 각 연결 클라이언트의 메시지를 필터링하는 데 사용합니다. 주제는 하나 이상의 주제 수준으로 구성됩니다. 각 주제 레벨은 전방 슬래시 (주제 레벨 분리기)로 구분됩니다.
클라이언트가 주제를 구독하면 메시지가 게시 된 정확한 주제를 사용할 수 있거나 와일드 카드를 사용하여 한 번에 더 많은 주제를 구독 할 수 있습니다.
단일 레벨 와일드 카드는 하나의 주제 수준을 대체합니다. 플러스 기호는 주제에서 단일 레벨 와일드 카드를 나타냅니다.
단일 레벨 와일드 카드는 하나의 주제 수준 만 포함되지만 멀티 레벨 와일드 카드는 임의의 주제 수준을 다룹니다. 일치하는 주제를 결정하기 위해서는 멀티 레벨 와일드 카드가 항상 주제의 마지막 문자이며 앞으로의 슬래시가 선행됩니다.
다른 기능들
또한 MQTT에는 유지 메시지, 마지막 의지 및 유언 및 심장 박동과 같은 다른 멋진 기능이 있습니다. 우리는 이겼다’이 기사에서 다루지 만 정보는 인터넷에서 널리 사용할 수 있습니다. 따라서 관심이 있으시면 계속하십시오.
노드에 대한 브로커 및 클라이언트.JS
허락하다’s 몇 가지 코드를 수행합니다! 이 섹션에서는 우리가’ll 노드로 작업 솔루션을 쉽게 얻을 수있는 방법을 보여줍니다.JS. 또한, 당신’일부 모듈을 알게됩니다. 허락하다’실제로 그러한 체계를 구현하려고 노력합니다.
MQTT에는 게시/구독 프로토콜의 핵심 인 중개인이 필요합니다. 브로커는 주로 모든 메시지를 수신하고, 필터링하고, 관심있는 사람을 결정한 다음 구독 된 모든 고객에게 메시지를 보내는 책임이 있습니다.
중개인으로서 우리는 Mosca를 사용할 것입니다.
모스카 NPM 모듈로서 MQTT 브로커입니다. 명령 줄과 NPM 모듈에서 사용할 수 있습니다. 이 경우 모듈로 사용합니다.
오프라인 메시지를 지원하기 위해 사용할 것입니다 Ascoltatori ~와 함께 Mongodb. 일반적으로 Ascoltatori는 다음 중개인/프로토콜을 지원하는 간단한 게시/구독 라이브러리입니다
- 레 디스, 제작 된 키/가치 저장소 @Antirez.
- Mongodb, 확장 가능하고 고성능 문서 지향 데이터베이스.
- 모기 그리고 모든 구현 MQTT 규약.
- RabbitMq 그리고 모든 구현 AMQP 규약.
- Zeromq P2P 방식으로 Ascoltatori를 사용합니다.
- Qlobberfsq, 공유 파일 시스템 큐.
- 아파치 카프카, 처리량이 많은 분산 메시징 시스템.
- 메모리 전용 라우팅, 사용 Qlobber.
아래의 백엔드 코드를 볼 수 있습니다. 이것은 MongoDB 데이터베이스에 메시지를 저장하기 위해 Websockets를 통해 MQTT 패킷 수신을 지원하는 HTTPS 서버 인 MQTT 브로커, HTTPS 서버를 포함하는 실제 작업 서버의 코드입니다.
// MQTT 브로커가 필요합니다var mosca = 요구 ( 'mosca');// MongoDB에 대한 연결을 정의합니다var mongo_con = 'mongodb : // localhost : 27017/mqtt';// 영구 세션 기능을 활성화하려면이 설정이 필요합니다.// 모든 메시지는 MongoDB에 저장됩니다var ascoltatore = 유형 : '몽고',URL : mongo_con,Pubsubcollection : 'Ascoltatori',몽고 : <>>;// MSCA MQTT 브로커의 최종 설정var 설정 = 항구 : 1883,백엔드 : Ascoltatore,고집: 공장 : Mosca.고집.몽고,URL : mongo_con>>;// HTTP 및 MQTT 서버를 정의합니다var http = require ( 'http'),httpserv = http.CreateServer (),mqttserv = 새로운 Mosca.서버 (설정);// HTTP를 MQTT 서버에 첨부합니다mqttserv.attachhttpserver (httpserv);httpserv.듣기 (3000);// MQTT 서버가 요청을받을 준비가되었을 때 트리거mqttserv.on ( '준비', 준비);// 새 메시지가 게시되면 트리거됩니다mqttserv.on ( '게시 된', 기능 (패킷, 클라이언트) 콘솔.로그 (패킷.주제 + ':' + 패킷.유효 탑재량);>);기능 ready () 콘솔.log ( 'Mosca Server가 가동 중입니다');>
MQTT 클라이언트를 구현하려면 NPM MQTT를 사용합니다.JS 모듈.
// MQTT 라이브러리가 필요합니다var mqtt = require ( 'mqtt');// MQTT 서버에 연결하는 클라이언트를 정의합니다// clean : 거짓 수단은 다시 연결에서 새 세션을 시작하지 않습니다//이를 통해 MQTT 프로토콜의 영구 세션 기능을 사용할 수 있습니다// 또한 clientId는 각 클라이언트 문자열마다 고유해야합니다var 클라이언트 = mqtt.연결 ( 'mqtt : // localhost', 청소 : 거짓,ClientId : 'console_client'>);// Connect에서 트리거됩니다// QOS와의 주제에 대한 Cleant 가입 : 1 QOS 레벨을 의미합니다. 클라이언트는 Reconnect에서 모든 메시지를받습니다.// 그런 다음 주제에 새 메시지를 게시합니다. 이 메시지는 DB에 저장되어 가입자에게 전송됩니다. QoS 1을 가진 오프라인 가입자는 다시 연결됩니다.//고객.on ( 'connect', function () 고객.구독 ( '/hello/s-pro',);고객.게시 ( '/hello/s-pro', 'hello, s-pro!',);>);// 새 메시지가 도착하면 무언가를합니다.고객.on ( 'message', function (주제, 메시지) 콘솔.log (topic + ':' + 메시지.toString ());>);
허락하다’클라이언트의 예 중 하나를 고려하십시오’S 구현. 이 경우 WebSockets 위의 MQTT가됩니다. 이 예는 브라우저 또는 하이브리드 모바일 애플리케이션과 함께 일하는 고객에게 특히 유용합니다.
모든 코드는 이전 코드와 유사합니다. 유일한 차이점은 클라이언트입니다’S 정의.
클라이언트 = mqtt.연결 ( 'ws : // mqtt.TK : 3000/mqtt ', 청소 : 거짓,ClientId : 사용자 이름>);
보시다시피, 여기서 우리는 소켓을 통해 서버에 연결합니다. 당신은 우리의 작업 코드를 찾을 수 있습니다 github. 코드의 모든 예는 완벽하게 작동하며 프레젠테이션 중에 저자가 살아있는 예로 사용했습니다.
확장 성
이 섹션은 광대 함 때문에이 기사의 범위를 벗어납니다. 그러나 그것은’이 솔루션이 확장 가능한 정도를 언급하는 것이 중요합니다. 노드를 사용하여 확장 가능한 MQTT 인프라를 만들 수 있습니다.JS, Redis, Haproxy는 아주 쉽게. 또 다른 옵션은 Apache Kafka를 사용하는 것입니다. 기사의 끝에서, 당신은 당신입니다’이 분야의 흥미로운 솔루션에 대한 몇 가지 참조를 참조하십시오.
결론
따라서이 기사에서는 JavaScript 및 Node를 사용하여 메시징에 MQTT 프로토콜을 사용하는 것이 얼마나 쉬운 지 실제로 검토하고 테스트했습니다.JS. MOSCA 브로커는 서버 측에서 사용할 수 있습니다. 또한 WebSockets를 지원합니다. 즉, 필요한 경우 IoT 장치로부터 메시지를 수신하여 Websockets를 통해 TCP를 통해 모바일 또는 데스크탑 응용 프로그램으로 전송할 수 있습니다. 또한 MQTT는 매우 확장 가능합니다. 그러나 그 없이도 매우 빠르며 10K+ 동시 연결에서 초당 10K+ 메시지를 처리 할 수 있습니다.
당신이 이것을 좋아한다면, 매체의 다른 사람들과 나누도록 우리를 박수 됨으로써 당신의 지원을 보여줍니다.