[{"data":1,"prerenderedAt":276},["ShallowReactive",2],{"blog-post-zh-nanomq-newsletter-202201":3},{"post":4,"translationPath":275},{"id":5,"title":6,"author":7,"body":8,"cover":259,"coverHeight":260,"coverWidth":261,"date":262,"description":263,"draft":264,"extension":265,"meta":266,"navigation":267,"path":268,"pinned":264,"seo":269,"sitemap":270,"stem":271,"tags":272,"__hash__":274},"blog_zh\u002Fzh\u002Fblog\u002Fnanomq-newsletter-202201.md","NanoMQ Newsletter 2022-01｜增加命令行工具与容器配置方法、新功能意见征集",null,{"type":9,"value":10,"toc":247},"minimark",[11,28,33,42,47,51,62,66,72,87,91,94,100,103,109,118,130,133,136,145,148,154,157,163,171,175,182,185,191,195,198,220,224,239],[12,13,14,15,22,23,27],"p",{},"本月，NanoMQ 发布了 0.5.9 版本，除了例行的 Bug 修复外，我们基于上月的 ",[16,17,21],"a",{"href":18,"rel":19},"https:\u002F\u002Fwww.emqx.com\u002Fzh\u002Fblog\u002Fthe-easiest-guide-to-getting-started-with-mqtt",[20],"nofollow","MQTT"," 桥接功能和兼容原生 NNG 功能，为大家带来了高效易用的 ",[16,24,21],{"href":25,"rel":26},"https:\u002F\u002Fwww.emqx.com\u002Fzh\u002Fmqtt-guide",[20]," 命令行工具包。同时我们也持续修复发现的 Bug 和用户反馈的 Issue，并积极维护 NanoMQ 的姊妹项目 NanoSDK。",[29,30,32],"h2",{"id":31},"mqtt-命令行工具","MQTT 命令行工具",[12,34,35,36,41],{},"无论日常 MQTT 开发和测试还是对 Broker 进行性能评估，一个简单易用且高性能的 MQTT 命令行工具(Command Line Toolkit)都是必不可少的。我们基于之前发布的 NanoSDK 为广大 MQTT 使用者开发了一套完整的 ",[16,37,40],{"href":38,"rel":39},"https:\u002F\u002Fwww.emqx.com\u002Fzh\u002Fblog\u002Fmqtt-client-tools",[20],"MQTT 客户端","工具，其内部包含 MQTT 消息发布、订阅和连接功能。",[43,44,46],"h3",{"id":45},"mqtt-消息发布","MQTT 消息发布",[48,49,50],"h4",{"id":50},"使用方法",[52,53,58],"pre",{"className":54,"code":56,"language":57},[55],"language-text","Usage: nanomq pub { start | stop } \u003Caddr> [\u003Ctopic>...] [\u003Copts>...] [\u003Csrc>]\n\n\u003Caddr> must be one or more of:\n  --url \u003Curl>                      The url for mqtt broker ('mqtt-tcp:\u002F\u002Fhost:port' or 'tls+mqtt-tcp:\u002F\u002Fhost:port')\n                                   [default: mqtt-tcp:\u002F\u002F127.0.0.1:1883]\n\n\u003Ctopic> must be set:\n  -t, --topic \u003Ctopic>              Topic for publish or subscribe\n\n\u003Copts> may be any of:\n  -V, --version \u003Cversion: 3|4|5>   The MQTT version used by the client [default: 4]\n  -n, --parallel                 The number of parallel for client [default: 1]\n  -v, --verbose                  Enable verbose mode\n  -u, --user \u003Cuser>                The username for authentication\n  -p, --password \u003Cpassword>        The password for authentication\n  -k, --keepalive \u003Ckeepalive>      A keep alive of the client (in seconds) [default: 60]\n  -m, --msg \u003Cmessage>              The message to publish\n  -C, --count \u003Cnum>                Max count of publishing message [default: 1]\n  -i, --interval \u003Cms>              Interval of publishing message (ms) [default: 0]\n  -I, --identifier \u003Cidentifier>    The client identifier UTF-8 String (default randomly generated string)\n  -q, --qos \u003Cqos>                  Quality of service for the corresponding topic [default: 0]\n  -r, --retain                     The message will be retained [default: false]\n  -c, --clean_session \u003Ctrue|false> Define a clean start for the connection [default: true]\n  --will-qos \u003Cqos>                 Quality of service level for the will message [default: 0]\n  --will-msg \u003Cmessage>             The payload of the will message\n  --will-topic \u003Ctopic>             The topic of the will message\n  --will-retain                    Will message as retained message [default: false]\n  -s, --secure                     Enable TLS\u002FSSL mode\n      --cacert \u003Cfile>              CA certificates file path\n      -E, --cert \u003Cfile>            Certificate file path\n      --key \u003Cfile>                 Private key file path\n      --keypass \u003Ckey password>     Private key password\n\n\u003Csrc> may be one of:\n  -m, --msg  \u003Cdata>\n  -f, --file \u003Cfile>\n","text",[59,60,56],"code",{"__ignoreMap":61},"",[48,63,65],{"id":64},"example","Example",[52,67,70],{"className":68,"code":69,"language":57},[55],"nanomq pub start --url \"mqtt-tcp:\u002F\u002Fbroker.emqx.io:1883\" -t msg -m hello -i 10 -c 10000\n",[59,71,69],{"__ignoreMap":61},[12,73,74,75,80,81,86],{},"使用 NanoMQ Pub 工具向 ",[16,76,79],{"href":77,"rel":78},"https:\u002F\u002Fwww.emqx.com\u002Fzh",[20],"EMQ"," 提供的",[16,82,85],{"href":83,"rel":84},"https:\u002F\u002Fwww.emqx.com\u002Fzh\u002Fmqtt\u002Fpublic-mqtt5-broker",[20],"公共 MQTT 服务器"," 的 msg 主题每 10ms 发送一条 Payload 为 hello 的消息，当发送到 10000 条时停止。而且 NanoMQ Toolkit 还能够从文件中读取数据进行发送，方便用户进行定制自己的 Payload 来模拟业务测试。",[43,88,90],{"id":89},"mqtt-消息订阅","MQTT 消息订阅",[48,92,50],{"id":93},"使用方法-1",[52,95,98],{"className":96,"code":97,"language":57},[55],"Usage: nanomq sub { start | stop } \u003Caddr> [\u003Ctopic>...] [\u003Copts>...]\n\n注：参数可选项和pub功能一致\n",[59,99,97],{"__ignoreMap":61},[48,101,65],{"id":102},"example-1",[52,104,107],{"className":105,"code":106,"language":57},[55],"nanomq sub start --url \"mqtt-tcp:\u002F\u002Fbroker.emqx.io:1883\" -t msg\n",[59,108,106],{"__ignoreMap":61},[12,110,111,112,117],{},"使用 NanoMQ Sub 命令连接并订阅 EMQ 提供的公共 ",[16,113,116],{"href":114,"rel":115},"https:\u002F\u002Fwww.emqx.com\u002Fzh\u002Fblog\u002Fthe-ultimate-guide-to-mqtt-broker-comparison",[20],"MQTT Broker"," 的主题msg。",[12,119,120,121,124,125,129],{},"命令行工具都继承了 NanoSDK-NNG 的高性能特点，可以通过配置 ",[59,122,123],{},"PARALLEL"," 选项增加单个客户端的消息生产和消费性能，详情请参阅",[16,126,128],{"href":127},"\u002Fzh\u002Fblog\u002Fnanomq-newsletter-202111"," NanoMQ Newsletter 2021-11","。同时考虑到大部分用户之前已经习惯了Mosquitto cli 的使用方式，所以我们保持了这一风格以尽量避免增加用户上手使用的困难。",[12,131,132],{},"虽然结合计时工具，NanoMQ Command Line Toolkit 能够完成部分的性能测试工作，但是 Pub\u002FSub 命令都只能基于一个 MQTT 客户端工作，难以满足完整的性能测试需求。我们已经计划在下个版本推出类似 Emqtt-bench 的性能测试工具，可以方便地对 MQTT 消息服务器进行压力测试。同时，为了照顾原先的 nanomsg 使用者，我们也会在 NanoMQ 中增加 NNG 的命令行工具。",[29,134,135],{"id":135},"修改配置方式",[12,137,138,139,144],{},"针对原先配置文件文档说明不够清晰的问题，新版本我们更新了许多原有 NanoMQ 的配置选项参数，并增补了文档说明。详情请参阅项目 ",[16,140,143],{"href":141,"rel":142},"https:\u002F\u002Fgithub.com\u002Fnanomq\u002Fnanomq#configuration",[20],"README 文件","。",[12,146,147],{},"另外我们也一直很重视和积极解决用户和社区的各方反馈，其中有一个多次收到的问题是：当以 Docker 方式使用 NanoMQ 时，不方便在容器外对 NanoMQ 的配置文件进行修改和设置。之前只能通过启动 Docker 时增加命令行参数或直接进入容器内部修改配置文件的方式对 NanoMQ 进行配置：",[52,149,152],{"className":150,"code":151,"language":57},[55],"docker run -d -p 1883:1883 --name nanomq nanomq\u002Fnanomq:0.5.9 --conf \"\u002Fetc\u002Fnanomq.conf\" --url \"broker+tcp:\u002F\u002F0.0.0.0:1883\"\n",[59,153,151],{"__ignoreMap":61},[12,155,156],{},"本次版本我们也增加了通过 Docker 环境变量配置选项的方式，用户可以在容器外部对 NanoMQ 实例进行重新配置。",[52,158,161],{"className":159,"code":160,"language":57},[55],"docker run -d -p 1883:1883 --name nanomq nanomq\u002Fnanomq:0.5.9 -e NANOMQ_CONF_PATH=\"\u002Fusr\u002Flocal\u002Fetc\u002Fnanomq.conf\"\n",[59,162,160],{"__ignoreMap":61},[12,164,165,166,170],{},"例如，以上就通过注册宿主机环境变量到容器内部来指定配置文件位置和 URL。具体支持的环境变量请参见：",[16,167,168],{"href":168,"rel":169},"https:\u002F\u002Fgithub.com\u002Fnanomq\u002Fnanomq#nanomq-environment-variables",[20]," 。",[29,172,174],{"id":173},"nanosdk","NanoSDK",[12,176,177,178,144],{},"NanoSDK 上个月增加了 TLS 支持，SSL\u002FTLS 是对链接加密，是建立安全的 MQTT 链接必不可少特性。和NNG一样，NanoSDK依赖 wolfssl 而不是 openssl。其使用方法和 Demo 请参照 ",[16,179,180],{"href":180,"rel":181},"https:\u002F\u002Fgithub.com\u002Fnanomq\u002Fnng\u002Ftree\u002Fjaylin\u002Fnng-mqtt-pr\u002Fdemo\u002Fmqtt_async",[20],[12,183,184],{},"另外，许多用户喜欢在上线和下线的回调中进行一些业务操作，因此我们修改了连接和断开连接的回调方式，以支持用户在回调中进行阻塞等待形式的操作而不会影响 MQTT 连接本身，从而提高 NanoSDK 的使用灵活性。",[186,187,188],"blockquote",{},[12,189,190],{},"*但需要注意的是，这会消耗NanoSDK内部的线程数量，如果taskq线程耗尽还是会影响整个SDK的运行，请酌情使用。",[29,192,194],{"id":193},"bug-修复","Bug 修复",[12,196,197],{},"本月 NanoMQ 修复了以下 Bug,请各位用户根据各个 Bug 的情况和触发场景进行升级。",[199,200,201,205,208,211,214,217],"ol",{},[202,203,204],"li",{},"当进行超长文本发送时，会由于网卡分片导致无法在单个异步 I\u002FO 中完成一个完整 MQTT 数据包的读写，从而造成下一个包的协议解析错误导致客户端断开。",[202,206,207],{},"当有大量客户端同时断线时，发布离线消息到系统事件主题会因为资源竞争而导致 NanoMQ 错误退出。",[202,209,210],{},"使用会话保持功能时，当客户端重连进行缓存消息再次发布时的一个空地址访问问题。",[202,212,213],{},"nanolib 模块的一个 makefile 拼写错误。",[202,215,216],{},"修复了一个 NanoMQ 中强制退出会导致死锁的问题。之前当客户端使用 nng_close() 强制下线时可能造成死锁问题。",[202,218,219],{},"重新整理了nanolib和 NNG 模块之间的依赖关系，使其各自可以独立编译和测试。",[29,221,223],{"id":222},"社区互动关于-nanomsg-客户端与-nanomq-桥接模式的意见征集","社区互动：关于 nanomsg 客户端与 NanoMQ 桥接模式的意见征集",[12,225,226,227,232,233,238],{},"NanoMQ 从 NNG 中诞生并成长，致力于在边缘端为开源社区提供更灵活完整的消息总线工具。我们一直重视倾听社区的问题和呼声，虽然 MQTT 一直是最广泛使用的",[16,228,231],{"href":229,"rel":230},"https:\u002F\u002Fwww.emqx.com\u002Fzh\u002Fblog\u002Fiot-protocols-mqtt-coap-lwm2m",[20],"物联网协议","，但其只支持 Pub\u002FSub（",[16,234,237],{"href":235,"rel":236},"https:\u002F\u002Fwww.emqx.com\u002Fzh\u002Fblog\u002Fintroduction-to-mqtt-5",[20],"MQTT 5.0"," 支持 req\u002Frep）模式使其不适合某些边缘场景内部点对点消息（brokerless）通信和 RPC 工作，而 nanomsg\u002Fnng 具有多种消息模式，在brokerless领域一直是广受用户喜爱的高性能库。",[12,240,241,242,246],{},"结合 nanomsg\u002Fnng 带来的多种消息模式，以及 RPC 功能能够拓宽 NanoMQ 的使用场景并方便用户构建更灵活的边缘网络拓扑这一优势，我们计划在 NanoMQ 中支持nanomsg客户端与 NanoMQ 的桥接。关于如何定义桥接模式、协议转换规约和配置方式，我们在此诚挚地向各位征求意见。欢迎大家在 GitHub 项目的 Discussion 页面（",[16,243,244],{"href":244,"rel":245},"https:\u002F\u002Fgithub.com\u002Fnanomq\u002Fnanomq\u002Fdiscussions\u002F298",[20]," ）给我们留言，期待您的宝贵意见和建议。",{"title":61,"searchDepth":248,"depth":248,"links":249},2,[250,255,256,257,258],{"id":31,"depth":248,"text":32,"children":251},[252,254],{"id":45,"depth":253,"text":46},3,{"id":89,"depth":253,"text":90},{"id":135,"depth":248,"text":135},{"id":173,"depth":248,"text":174},{"id":193,"depth":248,"text":194},{"id":222,"depth":248,"text":223},"\u002Fimages\u002Fblog\u002Fzh\u002Fnanomq-newsletter-202201\u002Fcover.webp",684,1520,"2022-01-27","本月 NanoMQ 发布了 0.5.9 版本，除了例行的 Bug 修复外，我们基于上月的 MQTT 桥接功能和兼容原生 NNG 功能，为大家带来了高效易用的 MQTT 命令行工具包。",false,"md",{},true,"\u002Fzh\u002Fblog\u002Fnanomq-newsletter-202201",{"title":6,"description":263},{"loc":268,"lastmod":262},"zh\u002Fblog\u002Fnanomq-newsletter-202201",[273],"NanoMQ Newsletter","T5O0nUw8D4_cfaaJNPFUuV6UyDGg0mWjn8lE7L4xRk0","\u002Fblog\u002Fnanomq-newsletter-202201",1794542897601]