# 常见概念问题解答

## EMQX 与物联网应用的关系是什么？

典型的物联网应用包括设备硬件、数据采集、数据存储、分析、Web / 移动应用等。EMQX 位于数据采集这一层，分别与硬件和数据存储、分析进行交互，是物联网应用的核心：前端的硬件通过 MQTT 协议与位于数据采集层的 EMQX 交互，通过 EMQX 将数据采集后，通过 EMQX 提供的数据接口，将数据保存到后台的持久化平台中（各种关系型数据库和 NoSQL 数据库），或者流式数据处理框架等，上层应用通过这些数据分析后得到的结果呈现给最终用户。

## EMQX 有哪些产品？

EMQX 产品系列目前主要包含以下[两款主要产品](https://www.emqx.com/zh/products/emqx)，主要体现在支持的连接数量、产品功能和商业服务等方面的区别：

- **EMQX 企业版**：EMQX Enterprise 是一款商业版的自托管 MQTT 消息平台。它支持数据持久化（支持 Redis、MySQL、MongoDB 或 PostgreSQL）、与 Kafka 的数据集成、LoRaWAN 支持、EMQX 监控、Kubernetes 部署等功能；并可支持百万级并发 MQTT 连接。

- **EMQX Cloud**：[EMQX Cloud](https://www.emqx.com/zh/cloud) 是我们提供的全托管 MQTT 云服务，由 EMQ 全面负责基础设施的部署、维护、扩展和升级。作为全球首个全托管的 MQTT 5.0 公有云服务，EMQX Cloud 提供了一站式运维代管、独有隔离环境的 MQTT 消息服务。在万物互联的时代，EMQX Cloud 可以帮助您快速构建面向物联网领域的行业应用，轻松实现物联网数据的采集、传输、计算和持久化。

## EMQX 与 NB-IoT、LoRaWAN 的关系是什么？

EMQX 是一个开源的 MQTT 消息服务器，并且 MQTT 是一个 TCP 协议栈上位于应用层的协议；而 NB-IoT 和 LoRaWAN 在 TCP 协议层处于物理层，负责物理信号的传输。因此两者在 TCP 协议栈的不同层次上，实现不同的功能。

## MQTT 协议与 HTTP 协议相比，有哪些优势?

HTTP 协议是一个无状态的协议，每个 HTTP 请求为 TCP 短连接，每次请求都需要重新创建一个 TCP 连接（可以通过 keep-alive 属性来优化 TCP 连接的使用，多个 HTTP 请求可以共享该 TCP 连接）；而 MQTT 协议为长连接协议，每个客户端都会保持一个长连接。与 HTTP 协议相比优势在于：

- MQTT 的长连接可以用于实现从设备端到服务器端的消息传送之外，还可以实现从服务器端到设备端的实时控制消息发送，而 HTTP 协议要实现此功能只能通过轮询的方式，效率相对来说比较低；

- MQTT 协议在维护连接的时候会发送心跳包，因此协议以最小代价内置支持设备 “探活” 的功能，而 HTTP 协议要实现此功能的话需要单独发出 HTTP 请求，实现的代价会更高；

- 低带宽、低功耗。MQTT 在传输报文的大小上与 HTTP 相比有巨大的优势，因为 MQTT 协议在连接建立之后，由于避免了建立连接所需要的额外的资源消耗，发送实际数据的时候报文传输所需带宽与 HTTP 相比有很大的优势，参考网上[第三方评测](https://medium.com/@flespi/http-vs-mqtt-performance-tests-f9adde693b5f)，发送一样大小的数据，MQTT 比 HTTP 少近 50 倍的网络传输数据，而且速度快了将近 20 倍。另一个 [第三方评测](http://stephendnicholas.com/posts/power-profiling-mqtt-vs-https) 显示，在接收消息时，MQTT 协议的耗电量为 HTTP 协议的百分之一，而在发送数据时， MQTT 协议的耗电量为 HTTP 协议的十分之一；

- MQTT 提供消息质量控制（QoS），消息质量等级越高，消息交付的质量就越有保障，在物联网的应用场景下，用户可以根据不同的使用场景来设定不同的消息质量等级。

## 什么是 WebSocket？什么情况下需要通过 WebSocket 去连接 EMQX 服务器？

WebSocket 是一种基于 TCP 协议实现的，用于实现 Web 应用与 Web 服务端之间双向实时通信的协议。EMQX 支持 MQTT over WebSocket 连接，用户可以将 Web 浏览器、微信/抖音小程序接入 EMQX，实现主题订阅、消息发布等操作。

有关 MQTT over WebSocket 的工作原理及其配置方法的更多详细信息，请参阅 [MQTT over WebSocket](../connect-emqx/mqtt-over-websocket.md)。

## EMQX 是如何实现支持大规模并发和高可用的？

高并发和高可用是 EMQX 的设计目标，为了实现这些目标 EMQX 中应用了多种技术，比如：

- 利用 Erlang/OTP 平台的软实时、高并发和容错；
- 全异步架构；
- 连接、会话、路由、集群的分层设计；
- 消息平面和控制平面的分离等。

在精心设计和实现之后，单个 EMQX 节点就可以处理五百万连接。

EMQX 支持多节点集群，集群下整个系统的性能会成倍高于单节点，并能在单节点故障时保证系统服务不中断。

## EMQX 的主题数量有限制吗？

主题使用没有数量限制，主题数量增长对性能影响不大，可以放心使用。

## EMQX 向订阅者转发消息时能否保证原始顺序？

EMQX 会保证来自同一客户端的相同主题的消息按照到达顺序被转发，这与消息的 QoS 等级无关，QoS 等级不会影响转发顺序。不管消息丢失还是重复，也都不会导致消息失序。这也是 MQTT 协议所要求的。

但对于不同主题的消息，EMQX 不会提供转发顺序保证，我们可以将他们视为进入了不同的通道，比如主题 A 的消息先于主题 B 的消息到达 EMQX，但最终可能主题 B 的消息会更早被转发。
