MQTT Part 2 发布和订阅

本文翻译自http://www.hivemq.com/blog/mqtt-essentials-part2-publish-subscribe

未经允许,不得转载

发布/订阅模式

发布/订阅(pub/sub)模式是传统的客户端-服务器模式的一种替代方案。我们将发送数据的客户端称之为发布者,将接收数据的客户端称为订阅者,发布/订阅模式将这些客户端进行解耦。这意味着发布者和订阅者互相不知道对方的存在,在其之间存在一个第三方组件,我们称之为中间人(broker),发布者和订阅者只与中间人进行通信。中间人可以过滤收到的信息,并对其进行相应的分发。下面让我们对其进行更进一步的了解,这只是发布/订阅模式的基础部分,稍后我们将探讨更多细节。



正如上面提到的,发布/订阅模式可以将发布者和订阅者在多个维度进行解耦:

  • 空间解耦:发布者和订阅者不需要互相知道对方的存在,例如对方的ip地址,端口号等。
  • 时间解耦:发布者和订阅者不需要同时运行。
  • 同步解耦:在发布和订阅消息时,双方的运作无需中断。

总之,发布/订阅模式解耦了发布者和订阅者,通过消息过滤使得某个客户端只接受某个消息得以实现。解耦从三个维度展开:空间上、时间上和同步上。

扩展性

相较于传统的客户端-服务器模式,发布/订阅模式还提供了更好的扩展性。这是因为在broker上的操作可以高度并行处理。消息缓存和智能路由在提高可扩展性上起了决定性作用。但百万级的连接量对发布/订阅模式仍然是个挑战,这可以通过集群式的broker节点来实现,借助负载均衡器可以将单个的服务器的压力进行分摊。(我们会用单独的一章来介绍此内容,其目前超越了我们的讨论范围)

消息过滤

令人感兴趣的是,broker是怎样过滤消息的,如何使订阅者只接受到其感兴趣的消息?

选择1:基于主题过滤

主题是消息体的一部分,接收端通过在broker上订阅其感兴趣的主题,以获取所有关于此主题的全部消息。主题是具有分层结构的普通字符串,其允许过滤器基于有限数量的表达式进行过滤。

选择2:基于内容过滤

正如其名,基于内容过滤即broker基于特定的内容进行过滤。broker通过查询消息来提供给订阅者其感兴趣的消息内容。这种方式的一大弊端就是消息内容必须被预知并且不能被加密,也不能被轻易改动。

选择3:基于类型过滤

当采用面向对象语言时,基于消息或事件的类型(type)或类(class)进行过滤是一种常见方案。在这种情况下,订阅者可以监听所有来自此类或其子类的消息。

当然了,发布/订阅模式也不是万能的,在使用它之前,还要考虑一些事情。解耦发布者和订阅者是发布/订阅模式的关键,这也为其带来一些难点。你必须预知所发布消息的结构。在基于主题过滤的情况下,发布者和订阅者需要知道正确的主题。在分发消息方面,发布者并不知道有谁在接受其所发布的消息,所以可能某些消息永远都不会有订阅者。

MQTT

现在我们学习了发布/订阅模式的基本内容,但MQTT与其有什么关系?MQTT采用的即是发布/订阅模式,实现了我们上文提到的所有方面,就看你怎么使用它了。MQTT也解耦了发布者和订阅者,所以我们只需要知道broker的主机IP地址和端口号,即可实现发布订阅消息。它同样在时间上实现了解耦,但这是种低效运行方案,因为大部分使用场景都需要近乎实时地分发消息。当然,broker也可以在客户端不在线时缓存消息。(这需要满足两个前提条件:客户端曾连接过一次,并且会话是持久的,而且其以高于0的服务质量级别的方式订阅过相应的主题)。MQTT同样可以在同步上进行解耦,大部分客户端库都是异步实现的,采用回调或类似机制。所以其在发布和订阅消息时不会干扰其他任务。但某些情况下采用同步方案效果也不错,所以某些库也支持同步API来等待消息。但是通常情况下,数据流都是异步的。另一个需要提及的重点是MQTT在客户端实现起来非常容易。不同的发布/订阅系统的broker有不同的实现逻辑,但客户端的解决方案都一样,只需要导入客户端的库文件即可实现,这是非常适合小型的资源受限的设备使用的轻量级协议。

MQTT采用基于主题的消息过滤方式,所以每个消息都需要包含一个主题以便于broker识别,进而也决定了订阅者是否能收到这条消息。HiveMQ broker也可以通过自定义插件来实现基于内容的过滤方式。

为了更好的使用发布/订阅模式,MQTT定义了一个服务质量(QoS)级别,借此可以很容易的指定broker和客户端消息收发成功率级别。对于某些主题无人订阅的情况,broker如何处理这种情况可以决定这是否是一个问题。例如HiveMQ broker有一个插件系统,能够识别这种情况并加以处理,或者仅将其写入数据库日志以供历史分析。为了规避主题变动的风险,小心设计主题树,并为以后的扩展留足空间十分重要。如果你采用了这种策略,MQTT将会是完美的产品解决方案。

和消息队列的区别

MQTT存在一些让人容易混淆的地方,例如他的名字以及它是否采用的是消息队列的方式。现在让我们将其解释清楚,上一章节我们提到过MQTT的名字和消息队列(message queue)没有任何关系,但是除却名字不提,MQTT和传统的消息队列模式有什么不一样呢?

消息队列会存储消息直到其被消费
当使用消息队列时,每一个入队消息都会被存储起来,直至其被其他客户端取出(我们常称之为消费)。否则,消息将会被卡在消息队列中一直等待着被消费。消息不能不被任何客户端处理,这有点像在MQTT中无人订阅的一个主题。

一个消息只会被一个客户端消费
另一个较大的不同是传统的消息队列中的一个消息只能被一个客户端消费,所有的客户端以分布式的方式处理同一个消息队列。在MQTT中正好相反,每一个订阅者都可以收到其订阅的主题消息。

队列需要被明确地命名
一个队列比一个主题要固定的多,在使用队列之前,必须使用一个特定的命令来创建队列,只有这样它才能发布和消费消息。而MQTT的主题要灵活的多。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容