[{"data":1,"prerenderedAt":234},["ShallowReactive",2],{"blog-post-zh-nanomq-newsletter-202112":3},{"post":4,"translationPath":-1},{"id":5,"title":6,"author":7,"body":8,"cover":215,"coverHeight":216,"coverWidth":217,"date":218,"description":219,"draft":220,"extension":221,"meta":222,"navigation":223,"path":224,"pinned":220,"seo":225,"sitemap":226,"stem":230,"tags":231,"__hash__":233},"blog_zh\u002Fzh\u002Fblog\u002Fnanomq-newsletter-202112.md","NanoMQ Newsletter 2021-12：新增 MQTT 桥接功能、解决与 NNG 兼容问题",null,{"type":9,"value":10,"toc":210},"minimark",[11,33,41,46,55,64,75,78,81,87,90,96,105,111,114,120,123,129,132,138,141,147,150,156,165,171,174,180,183,189,192,195,203],[12,13,14,15,20,21,27,28,32],"p",{},"上个月，",[16,17,19],"a",{"href":18},"\u002Fzh\u002Fblog\u002Fnanomq-newsletter-202111","NanoMQ 团队为 NNG 项目增加了 MQTT 协议支持","。本月这一新生高效的 ",[16,22,26],{"href":23,"rel":24},"https:\u002F\u002Fwww.emqx.com\u002Fzh\u002Fblog\u002Fthe-easiest-guide-to-getting-started-with-mqtt",[25],"nofollow","MQTT"," SDK（NanoSDK）正式合并入了 ",[16,29,30],{"href":30,"rel":31},"https:\u002F\u002Fgithub.com\u002Fnanomq\u002Fnanomq",[25]," 的主分支，在此基础上，我们还开发了 NanoMQ 的一项重要功能：MQTT 桥接。",[12,34,35,36,40],{},"为了优先完成 ",[16,37,39],{"href":38},"\u002Fzh","NanoMQ"," 的 Broker 功能，我们在之前已深度修改了 NNG 底层代码，这导致 NanoMQ 无法与 NNG 原有功能和 SP 协议兼容。因此在这次合并中我们一并解决了 NanoMQ 与 NNG 的兼容问题。通过增加了若干独立的 NNG API，使得 Broker 和 SDK 能够共存。用户能够在使用 NanoMQ 的同时，不影响其中自带的 NNG 原有功能，同时可以更好地利用 NanoSDK 客户端来开发便捷的客户端功能。",[42,43,45],"h2",{"id":44},"mqtt-桥接介绍","MQTT 桥接介绍",[12,47,48,49,54],{},"桥接是一种连接多个 ",[16,50,53],{"href":51,"rel":52},"https:\u002F\u002Fwww.emqx.com\u002Fzh\u002Fproducts\u002Femqx",[25],"EMQX"," 或者其他 MQTT 消息中间件的方式。不同于集群，工作在桥接模式下的节点之间不会复制主题树和路由表。多数用于将重要主题和设备的数据在复数 Broker 间打通，此特性在云边协同和多活架构场景里都有广泛使用。",[12,56,57],{},[58,59],"img",{"alt":60,"src":61,"width":62,"height":63},"MQTT 桥接","\u002Fimages\u002Fblog\u002Fzh\u002Fnanomq-newsletter-202112\u002F01.webp",1262,474,[65,66,71],"pre",{"className":67,"code":69,"language":70},[68],"language-text","              ---------                     ---------                     ---------\nPublisher --> | NanoMQ | --Bridge Forward--> | EMQX | --Bridge Forward--> | Cloud | --> Subscriber\n              ---------                     ---------                     ---------\n","text",[72,73,69],"code",{"__ignoreMap":74},"",[12,76,77],{},"NanoMQ 在 0.5.5 版本中正式支持了这一功能。使用方法如下：",[12,79,80],{},"用户可以通过修改新增的 \u002Fetc\u002Fnanomq_bridge.conf 配置文件来启用和自定义 MQTT 桥接功能。",[65,82,85],{"className":83,"code":84,"language":70},[68],"## Bridge address: host:port .#### Value: String##\nExample: mqtt-tcp:\u002F\u002F127.0.0.1:1883\nbridge.mqtt.address=mqtt-tcp:\u002F\u002Fbroker.emqx.io:1883\n",[72,86,84],{"__ignoreMap":74},[12,88,89],{},"远端桥接地址，即要桥接的 Broker 的 IP 和端口。",[65,91,94],{"className":92,"code":93,"language":70},[68],"## Protocol version of the bridge.##\nbridge.mqtt.proto_ver=4\n",[72,95,93],{"__ignoreMap":74},[12,97,98,99,104],{},"桥接的 ",[16,100,103],{"href":101,"rel":102},"https:\u002F\u002Fwww.emqx.com\u002Fzh\u002Fmqtt-guide",[25],"MQTT 协议","版本，目前只支持 MQTT 3.1.1 与 MQTT 4",[65,106,109],{"className":107,"code":108,"language":70},[68],"## The ClientId of a remote bridge.\n## Placeholders:\n##  ${node}: Node name\n## Value: String\nbridge.mqtt.clientid=bridge_client\n",[72,110,108],{"__ignoreMap":74},[12,112,113],{},"桥接所使用的 MQTT 连接的客户端的 ClientID",[65,115,118],{"className":116,"code":117,"language":70},[68],"## Ping interval of a down bridge.\n## Value: Duration\n## Default: 10 seconds\nbridge.mqtt.keepalive=60\n",[72,119,117],{"__ignoreMap":74},[12,121,122],{},"桥接所使用的 MQTT 连接的心跳间隔。",[65,124,127],{"className":125,"code":126,"language":70},[68],"## The Clean start flag of a remote bridge.\n#### Value: boolean\n## Default: true\nbridge.mqtt.clean_start=true\n",[72,128,126],{"__ignoreMap":74},[12,130,131],{},"桥接所使用的 MQTT 连接的会话保持状态。",[65,133,136],{"className":134,"code":135,"language":70},[68],"## The username for a remote bridge.\n## Value: String\nbridge.mqtt.username=username\n## The password for a remote bridge.\n## Value: String\nbridge.mqtt.password=passwd\n",[72,137,135],{"__ignoreMap":74},[12,139,140],{},"桥接所使用的 MQTT 连接的用户名和密码。",[65,142,145],{"className":143,"code":144,"language":70},[68],"## Topics that need to be forward to IoTHUB\n## Value: String\nbridge.mqtt.forwards=topic1\u002F#,topic2\u002F#\n",[72,146,144],{"__ignoreMap":74},[12,148,149],{},"所想要和对端 Broker 桥接的主题，可使用通配符。即所有发给 NanoMQ 的满足 topic1\u002F# 和 topic2\u002F# 主题（通配符）标准的消息，在桥接的远端 Broker 相同的主题都也能收到。",[65,151,154],{"className":152,"code":153,"language":70},[68],"## Need to subscribe to remote broker topics\n## Value: String\nbridge.mqtt.subscription.1.topic=cmd\u002Ftopic1\n",[72,155,153],{"__ignoreMap":74},[12,157,158,159,164],{},"桥接的远端 ",[16,160,163],{"href":161,"rel":162},"https:\u002F\u002Fwww.emqx.com\u002Fzh\u002Fblog\u002Fthe-ultimate-guide-to-mqtt-broker-comparison",[25],"MQTT Broker"," 的主题。即 NanoMQ 会订阅目标 Broker 的 cmd\u002Ftopic1 主题。所桥接的 Broker 的 cmd\u002Ftopic1 主题收到的所有消息，在 NanoMQ 本地的 cmd\u002Ftopic1 都能同样受到。可按照编号增加主体数量。",[65,166,169],{"className":167,"code":168,"language":70},[68],"## Need to subscribe to remote topics QoS.\n## Value: Number\nbridge.mqtt.subscription.1.qos=1\n",[72,170,168],{"__ignoreMap":74},[12,172,173],{},"桥接的远端 MQTT Broker 的主题时所使用的的订阅 QoS 等级，按照序号与上一个配置对应。因为消息下行桥接其实就是本地 Broker 去订阅远端 Broker 的主题，所以也有订阅的 QoS 等级。",[65,175,178],{"className":176,"code":177,"language":70},[68],"## parallel\n#### Value: 1-CPU Cores\nbridge.mqtt.parallel=2\n",[72,179,177],{"__ignoreMap":74},[12,181,182],{},"桥接使用的 Context 数量，建议与运行平台 CPU 核数相同。此选项影响启动内存和桥接连接的吞吐量。",[42,184,186],{"id":185},"实现方式",[187,188,185],"strong",{},[12,190,191],{},"我们通过在 NanoMQ 的应用层添加了一个专门用途的特殊 Context 来完成桥接工作，并为 Broker 的每个 Context 增加了转为桥接使用的 AIO，通过这个 AIO 完成内部的消息在 Broker 和桥接客户端之间的共享。如此做虽然增加了少许启动内存，但既不影响 NanoMQ 原来的高并发低延时吞吐能力，又能够保证桥接客户端和连接能够和普通 MQTT 消息一样共享 CPU 资源调度。",[12,193,194],{},"我们推荐在边缘端使用 NanoMQ 作为边缘 MQTT Broker 负责消息汇聚后桥接至云端的 EMQX。",[12,196,197],{},[58,198],{"alt":199,"src":200,"width":201,"height":202},"NanoMQ.png","\u002Fimages\u002Fblog\u002Fzh\u002Fnanomq-newsletter-202112\u002F02.webp",1402,362,[12,204,205,206],{},"NanoMQ 桥接至 EMQX 的配置如上一章节所述。EMQX 桥接至 NanoMQ 的配置可参考 ",[16,207,208],{"href":208,"rel":209},"https:\u002F\u002Fdocs.emqx.com\u002Fen\u002Femqx\u002Fv4.3\u002Fbridge\u002Fbridge-mqtt.html",[25],{"title":74,"searchDepth":211,"depth":211,"links":212},2,[213,214],{"id":44,"depth":211,"text":45},{"id":185,"depth":211,"text":185},"\u002Fimages\u002Fblog\u002Fzh\u002Fnanomq-newsletter-202112\u002Fcover.webp",684,1520,"2021-12-30","本月 MQTT SDK（NanoSDK）正式合并入了 nanomq\u002Fnanomq 的主分支，在此基础上，我们还开发了 NanoMQ 的一项重要功能：MQTT 桥接。",false,"md",{},true,"\u002Fzh\u002Fblog\u002Fnanomq-newsletter-202112",{"title":6,"description":219},{"loc":224,"images":227,"lastmod":218},[228,229],{"loc":61},{"loc":200},"zh\u002Fblog\u002Fnanomq-newsletter-202112",[232],"NanoMQ Newsletter","1hwsJ6hu9iqPQ05hIdstI-GfjBfj5St84apCuOFqTdM",1794542897743]