<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>emqttx (emqttx)</title>
    <link>https://ruby-china.org/emqttx</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>[杭州/昆明] EMQ 映云科技 Cloud 后端研发工程师</title>
      <description>&lt;h2 id="岗位职责"&gt;岗位职责&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;负责搭建基于 EMQX 的企业级 MQTT 云服务 &lt;/li&gt;
&lt;li&gt;关注云计算发展趋势，并将新功能引入 EMQX Cloud &lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="岗位要求"&gt;岗位要求&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;两年以上相关领域开发经验，掌握 Go/Python/Rust 中至少一种编程语言 &lt;/li&gt;
&lt;li&gt;有 Postgresql,Redis,Elasticsearch 等数据库中间件使用和调优经验 &lt;/li&gt;
&lt;li&gt;有良好的沟通能力和团队合作精神 &lt;/li&gt;
&lt;li&gt;具备优秀的快速学习和自我激励能力 &lt;/li&gt;
&lt;li&gt;加分项： 

&lt;ul&gt;
&lt;li&gt;有 MQTT、Kubernetes、分布式系统开发相关经验 &lt;/li&gt;
&lt;li&gt;为知名开源项目贡献过代码 &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="工作地址"&gt;工作地址&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;杭州 余杭区仓前街道龙园路 88 号 3-A-303&lt;/li&gt;
&lt;li&gt;昆明 五华区学府路海伦堡海伦先生 1 栋 17A 楼 1814 室&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="简历投递"&gt;简历投递&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.lagou.com/wn/jobs/8428445.html" rel="nofollow" target="_blank" title=""&gt;https://www.lagou.com/wn/jobs/8428445.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="公司简介"&gt;公司简介&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.emqx.com/zh" rel="nofollow" target="_blank" title=""&gt;EMQ&lt;/a&gt; - 杭州映云科技 是面向 5G 和物联网市场的消息与流处理开源软件公司，面向全球运营。&lt;/p&gt;

&lt;p&gt;EMQ 总部位于杭州，在北京、上海、硅谷、瑞典设有分支机构，核心产品包括面向云和边缘计算的 IoT 消息中间件以及轻量级流式处理中间件，累计已服务全球 5000+ 企业用户，并与数十家世界 500 强企业达成战略合作，典型用户包括 HPE、VMware、Verifone、Ericsson、华为、中国电信、中国移动、国家电网、上汽大众等。&lt;/p&gt;

&lt;p&gt;EMQ 发起与运营的开源 物联网 MQTT 服务器，Github Star 数量在同类型项目中排名第一，是国内在开源领域具有全球影响力的项目之一。&lt;/p&gt;</description>
      <author>emqttx</author>
      <pubDate>Fri, 13 May 2022 15:59:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/42391</link>
      <guid>https://ruby-china.org/topics/42391</guid>
    </item>
    <item>
      <title>物联网的基石-mqtt 协议初识</title>
      <description>&lt;p&gt;随着 5G 时代的来临，万物互联的伟大构想正在成为现实。联网的 &lt;strong&gt;物联网设备&lt;/strong&gt; 在 2018 年已经达到了 70 亿 [^1]，在未来两年，仅智能水电气表就将超过 10 亿 [^2]。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/000facfe-c60e-4d4a-bb0c-f07859629aa2.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;海量的设备接入和设备管理对网络带宽、通信协议以及平台服务架构都带来了很大挑战。对于 &lt;strong&gt;物联网协议&lt;/strong&gt; 来说，必须针对性地解决物联网设备通信的几个关键问题：其网络环境复杂而不可靠、其内存和闪存容量小、其处理器能力有限。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.emqx.io/cn/mqtt" rel="nofollow" target="_blank" title=""&gt;&lt;strong&gt;MQTT 协议&lt;/strong&gt;&lt;/a&gt; 是基于发布/订阅模式的物联网通信协议，凭借简单易实现、支持 QoS、报文小等特点，占据了物联网协议的半壁江山：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/31ffd5ef-93f0-4f14-b0e7-c8b78182c93c.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="MQTT 协议的诞生"&gt;MQTT 协议的诞生&lt;/h2&gt;
&lt;p&gt;MQTT was created by &lt;a href="http://en.wikipedia.org/wiki/Andy_Stanford-Clark" rel="nofollow" target="_blank" title=""&gt;Andy Stanford-Clark&lt;/a&gt; of IBM, and Arlen Nipper (then of Arcom Systems, later CTO of Eurotech).&lt;a href="https://github.com/mqtt/mqtt.github.io/wiki/history" rel="nofollow" target="_blank" title=""&gt;^3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;据 Arlen Nipper 在一 &lt;a href="https://www.ibm.com/podcasts/software/websphere/connectivity/piper_diaz_nipper_mq_tt_11182011.pdf" rel="nofollow" target="_blank" title=""&gt;IBM Podcast 上的自述&lt;/a&gt;，MQTT 原名是 &lt;code&gt;MQ TT&lt;/code&gt;，注意 &lt;code&gt;MQ&lt;/code&gt; 与 &lt;code&gt;TT&lt;/code&gt;之间的空格，其全称为：MQ Telemetry Transport，是九十年代早期，他在参与 Conoco Phillips 公司的一个原油管道数据采集监控系统 (pipeline SCADA system) 时，开发的一个实时数据传输协议。它的目的在于让传感器通过带宽有限的 &lt;a href="https://en.wikipedia.org/wiki/Very-small-aperture_terminal" rel="nofollow" target="_blank" title=""&gt;VSAT&lt;/a&gt; ，与 IBM 的 MQ Integrator 通信。由于 Nipper 是遥感和数据采集监控专业出身，所以按业内惯例给了个 &lt;code&gt;MQ TT&lt;/code&gt; 的名字。&lt;/p&gt;
&lt;h2 id="MQTT 协议设计原则"&gt;MQTT 协议设计原则&lt;/h2&gt;
&lt;p&gt;按照 Nipper 的介绍，MQTT 必须简单容易实现，必须支持 QoS(设备网络环境复杂)，必须轻量且省带宽 (因为那时候带宽很贵)，必须数据无关 (不关心 Payload 数据格式)，必须有持续地会话感知能力 (时刻知道设备是否在线)。下面将介绍 MQTT (3.1.1 版本) 的几个核心特色，分别对应了这几个设计原则的实现。&lt;/p&gt;
&lt;h3 id="灵活的发布订阅和主题设计"&gt;灵活的发布订阅和主题设计&lt;/h3&gt;
&lt;p&gt;发布订阅模式是传统 Client/Server 模式的一种解耦方案。发布者通过 Broker 与消费者之间通信，Broker 的作用是将收到的消息通过某种&lt;code&gt;过滤规则&lt;/code&gt;，正确地发送给消费者。发布/订阅模式 相对于 客户端/服务器模式 的好处在于：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;发布者和消费者之间不必预先知道对方的存在，比如不需要预先沟通对方的 IP Address 和 Port&lt;/li&gt;
&lt;li&gt;发布者和消费者之间不必同时运行。因为 Broker 是一直运行的。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在 MQTT 协议里，上面提到的 &lt;code&gt;过滤规则&lt;/code&gt; 是 &lt;code&gt;Topic&lt;/code&gt;。比如：所有发布到 &lt;code&gt;news&lt;/code&gt; 这个 Topic 的消息，都会被 Broker 转发给已经订阅了 &lt;code&gt;news&lt;/code&gt; 的订阅者：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/b702d2d3-dd2c-42d3-88d9-187473d0eb1a.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;上图中订阅者预先订阅了 &lt;code&gt;news&lt;/code&gt;，然后发布者向 Broker 发布了一条消息 "some msg" 并指定发布到 &lt;code&gt;news&lt;/code&gt; 主题，Broker 通过 Topic 匹配，决定将这条消息转发给订阅者。&lt;/p&gt;

&lt;p&gt;MQTT 的 Topic 有层级结构，并且支持通配符 &lt;code&gt;+&lt;/code&gt; 和 &lt;code&gt;#&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;+&lt;/code&gt; 是匹配单层的通配符。比如 &lt;code&gt;news/+&lt;/code&gt; 可以匹配 &lt;code&gt;news/sports&lt;/code&gt;，&lt;code&gt;news/+/basketball&lt;/code&gt; 可匹配到 &lt;code&gt;news/sports/basketball&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#&lt;/code&gt; 是一到多层的通配符。比如 &lt;code&gt;news/#&lt;/code&gt; 可以匹配 &lt;code&gt;news&lt;/code&gt;、 &lt;code&gt;news/sports&lt;/code&gt;、&lt;code&gt;news/sports/basketball&lt;/code&gt; 以及 &lt;code&gt;news/sports/basketball/x&lt;/code&gt; 等等。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MQTT 的主题是不要预先创建的，发布者发送消息到某个主题、或者订阅者订阅某个主题的时候，Broker 就会自动创建这个主题。&lt;/p&gt;
&lt;h3 id="带宽消耗最小化"&gt;带宽消耗最小化&lt;/h3&gt;
&lt;p&gt;MQTT 协议将协议本身占用的额外消耗最小化，消息头部最小只需要占用 2 个字节。&lt;/p&gt;

&lt;p&gt;MQTT 的消息格式分三部分：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;固定长度头部，2 个字节，所有消息类型里都有 &lt;/li&gt;
&lt;li&gt;可变长度头部，只有某些消息类型里有&lt;/li&gt;
&lt;li&gt;Payload，只有某些消息类型里有&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MQTT 的主要消息类型有：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CONNECT / CONNACK&lt;/li&gt;
&lt;li&gt;PUBLISH / PUBACK&lt;/li&gt;
&lt;li&gt;SUBSCRIBE / SUBACK&lt;/li&gt;
&lt;li&gt;UNSUBSCRIBE / UNSUBACK&lt;/li&gt;
&lt;li&gt;PINGREQ / PINGRESP&lt;/li&gt;
&lt;li&gt;DISCONNECT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;其中 PINGREQ / PINGRESP 和 DISCONNECT 报文是不需要可变头部的，也没有 Payload，也就是说它们的报文大小仅仅消耗 2 个字节。&lt;/p&gt;

&lt;p&gt;在 CONNECT 报文的可变长度头部里，有个 Protocol Version 的字段。为了节省空间，只有一个字节。所以版本号不是按照字符串 "3.1.1" 存放的，而是使用数字 4 来表示 3.1.1 版本。&lt;/p&gt;
&lt;h3 id="三个可选的 QoS 等级"&gt;三个可选的 QoS 等级&lt;/h3&gt;
&lt;p&gt;为适应设备不同的网络环境，MQTT 设计了 3 个 QoS 等级，0, 1, 2:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;At most once&lt;/em&gt; (0)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;At least once&lt;/em&gt; (1)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Exactly once&lt;/em&gt; (2)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;QoS 0 是一种 "fire and forget" 的消息发送模式：Sender (可能是 Publisher 或者 Broker) 发送一条消息之后，就不再关心它有没有发送到对方，也不设置任何重发机制。&lt;/p&gt;

&lt;p&gt;QoS 1 包含了简单的重发机制，Sender 发送消息之后等待接收者的 ACK，如果没收到 ACK 则重新发送消息。这种模式能保证消息至少能到达一次，但无法保证消息重复。&lt;/p&gt;

&lt;p&gt;QoS 2 设计了&lt;a href="https://docs.emqx.io/broker/v3/en/protocol.html#qos2-message-publish-and-subscribe" rel="nofollow" target="_blank" title=""&gt;略微复杂&lt;/a&gt;的重发和重复消息发现机制，保证消息到达对方并且严格值到达一次。&lt;/p&gt;
&lt;h3 id="会话保持"&gt;会话保持&lt;/h3&gt;
&lt;p&gt;MQTT 没有假设设备或 Broker 使用了 TCP 的保活机制&lt;a href="https://www.cnblogs.com/softidea/p/5764051.html" rel="nofollow" target="_blank" title=""&gt;^4&lt;/a&gt;，而是设计了协议层的保活机制：在 CONNECT 报文里可设置 Keepalive 字段，来设置保活心跳包 PINGREQ/PINGRESP 的发送时间间隔。当长时间无法收到设备的 PINGREQ 的时候，Broker 就会认为设备已经下线。&lt;/p&gt;

&lt;p&gt;总的来说，Keepalive 有两个作用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;发现对端死亡或者网络中断&lt;/li&gt;
&lt;li&gt;在长时间无消息交互的情况下，保持连接不被网络设备断开&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;对于那些想要在重新上线后，重新收到离线期间错过的消息的设备，MQTT 设计了持久化连接：在 CONNECT 报文里可设置 CleanSession 字段为 False，则 Broker 会为终端存储：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;设备所有的订阅&lt;/li&gt;
&lt;li&gt;还未被设备确认的 QoS1 和 QoS 消息&lt;/li&gt;
&lt;li&gt;设备离线时错过的消息&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="在线状态感知"&gt;在线状态感知&lt;/h3&gt;
&lt;p&gt;MQTT 设计了遗愿 (Last Will) 消息，让 Broker 在发现设备异常下线的情况下，帮助设备发布一条遗愿消息到指定的主题。&lt;/p&gt;

&lt;p&gt;实际上在某些 MQTT 服务器的实现里 (比如 EMQ X)，设备上线或下线的时候 Broker 会通过某些系统主题发布设备状态更新，更符合实际应用场景。&lt;/p&gt;
&lt;h2 id="开源 MQTT 服务器如何选择"&gt;开源 MQTT 服务器如何选择&lt;/h2&gt;
&lt;p&gt;到目前为止，比较流行的开源 MQTT 服务器有几个：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/eclipse/mosquitto" rel="nofollow" target="_blank" title=""&gt;Eclipse Mosquitto&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;使用 C 语言实现的 MQTT 服务器。Eclipse 组织还还包含了大量的 MQTT 客户端项目：&lt;a href="https://www.eclipse.org/paho/#" rel="nofollow" target="_blank"&gt;https://www.eclipse.org/paho/#&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/emqx/emqx" rel="nofollow" target="_blank" title=""&gt;EMQ X&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;使用 Erlang 语言开发的 MQTT 服务器，内置强大的规则引擎，支持许多其他 IoT 协议比如 MQTT-SN、CoAP、LwM2M 等。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/mcollina/mosca" rel="nofollow" target="_blank" title=""&gt;Mosca&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;使用 Node.JS 开发的 MQTT 服务器，简单易用。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/vernemq/vernemq" rel="nofollow" target="_blank" title=""&gt;VerneMQ&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;同样使用 Erlang 开发的 MQTT 服务器。&lt;/p&gt;

&lt;p&gt;从支持 MQTT 5.0、稳定性、扩展性、集群能力等方面考虑，EMQ X 的表现应该是最好的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;使用 Erlang OTP 开发，容错能力好 (电信领域久经考验的语言，曾经做出过 99.9999999% 可用性的交换机设备&lt;a href="https://pragprog.com/articles/erlang" rel="nofollow" target="_blank" title=""&gt;^5&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;官方有大量的扩展插件可供扩展。有很多认证插件，数据存储 (backend) 插件可供选择。可支持各种关系型数据库，NoSQL 数据库，以及常见消息队列如 Kafka，RabbitMQ，Pulsar 等&lt;/li&gt;
&lt;li&gt;支持集群，支持节点水平扩展&lt;/li&gt;
&lt;li&gt;单节点支持 2000K 并发连接&lt;/li&gt;
&lt;li&gt;支持规则引擎和编解码&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="MQTT 协议快速体验"&gt;MQTT 协议快速体验&lt;/h2&gt;&lt;h3 id="MQTT 在线服务器"&gt;MQTT 在线服务器&lt;/h3&gt;
&lt;p&gt;EMQ X &lt;a href="https://cloud.emqx.io/cn/" rel="nofollow" target="_blank" title=""&gt;MQTT 物联网云服务&lt;/a&gt; 提供了一个在线的公共 MQTT 5.0 服务器，不需要任何安装您就可以快速开始 MQTT 协议的学习、测试或原型制作。&lt;/p&gt;

&lt;p&gt;该 MQTT 服务器的详细接入信息请见 EMQ 官网页面：&lt;a href="https://www.emqx.io/cn/mqtt/public-mqtt5-broker" rel="nofollow" target="_blank" title=""&gt;免费的在线 MQTT 服务器&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id="MQTT 在线客户端"&gt;MQTT 在线客户端&lt;/h3&gt;
&lt;p&gt;EMQ 也提供了支持浏览器访问的 &lt;a href="https://www.emqx.io/cn/mqtt/mqtt-websocket-toolkit" rel="nofollow" target="_blank" title=""&gt;MQTT 在线客户端工具&lt;/a&gt;，该工具支持通过普通或者加密的 WebSocket 端口连接至 MQTT 服务器，同时也支持缓存连接方便下次访问使用。&lt;/p&gt;

&lt;p&gt;[^1]: The number of connected devices that are in use worldwide now exceeds 17 billion, with the number of IoT devices at 7 billion... &lt;a href="https://iot-analytics.com/state-of-the-iot-update-q1-q2-2018-number-of-iot-devices-now-7b/" rel="nofollow" target="_blank"&gt;https://iot-analytics.com/state-of-the-iot-update-q1-q2-2018-number-of-iot-devices-now-7b/&lt;/a&gt;
[^2]: The estimated installed base of smart meters (electricity, gas and water) is expected to surpass the 1 billion mark within the next 2 years. &lt;a href="https://iot-analytics.com/smart-meter-market-2019-global-penetration-reached-14-percent/" rel="nofollow" target="_blank"&gt;https://iot-analytics.com/smart-meter-market-2019-global-penetration-reached-14-percent/&lt;/a&gt;&lt;/p&gt;</description>
      <author>emqttx</author>
      <pubDate>Wed, 08 Jul 2020 14:18:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/40128</link>
      <guid>https://ruby-china.org/topics/40128</guid>
    </item>
  </channel>
</rss>
