作者 | 葛贤亮,单位:中国移动智慧家庭运营中心
网站建设哪家好,找成都创新互联!专注于网页设计、网站建设、微信开发、微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了梓潼免费建站欢迎大家使用!
近年来,互联网技术发展迅猛,各行各业的信息量急剧膨胀。随着云计算和算力网络时代的到来,消息中间件在国内许多行业的关键应用中越来越受到重视。在高并发分布式场景下,合理地利用消息中间件往往能起到突破性能瓶颈与化繁为简的效果。
前期从“作用”与“协议”出发,使读者对消息中间件技术有了初步认识。本期由“传输模式”与“消费模式”切入,期望能以点见面使读者对消息中间件有更深入的了解。
从传输视角看,MQ的消息模式可分为“点对点”和“发布/订阅”两种模式。
顾名思义,PTP模型用于消息生产者和消息消费者之间点对点的通信。消息生产者基于某种规则将消息发送到特定的消费者,通常是某个固定的消息队列(Queue),在消息传递给消费者之前它被存储在这个队列中。队列消息可以放在内存中也可以持久化,以保证在消息服务出现故障时仍然能够传递消息。
PTP模型中,一个队列可以有多个生产者和多个消费者。消息服务器按照收到消息的先后顺序,将消息放到队列中。队列中的每一条消息,只能由一个消费者进行消费,消费之后就会从队列中移除。
图1.1 点对点模型
需要注意的是,尽管使用Queue的概念,但并代表先进入队列的消息,一定会被先消费。为了提升系统并发性,很多MQ实现方案中引入了“消费者组”的概念,队列中的消息会被分发到不同的消费者进行并行处理。这意味着消息在发送的时候是有序的,但是在消费的时候就变成无序了。一些MQ提供了“专有消费者”或者“排他消费者”的概念,在这种情况下,队列中的消息仅允许一个消费者进行消费。但是,这也牺牲了消息的并发消费能力,消息量很大的情况下,将会产生严重的消息积压。为了解决这一问题,一些MQ方案(如 Kafka、RocketMQ)又引入了分区的概念,相同主题的消息使用不同分区进行隔离,同一分区内的消息可以有序消费,不同分区内的消息可以并行消费。
Pub/Sub模式类似广播消息,生产者将消息发布到一个主题(Topic)中,订阅了该Topic的所有下游消费者,都可以接收到这条消息。
在这种模型下,发布者和订阅者彼此无感知。相较于PTP模型中一个消息只能被一个消费者消费,Pub/Sub模型中一个消息会被发送至所有订阅了该Topic的消费者进行消费。
图1.2 发布/订阅模型
Queue与Topic区别:
从消费视角看,MQ的消费模式可分为“Push”和“Pull”两种模式。
消息生产者将消息发送给消息服务器后,消息服务器主动地将消息“推送”给消费者。
Push模型最大的好处就是实时性。因为服务端可以做到只要有消息就立即推送,所以消息的消费没有“额外”的延迟。
Push模型看上去很美好,但在实际使用中却存在很多硬伤,以至于有些MQ的Push模型底层也是依托Pull方式实现的。
Push模型存在以下问题:
消息生产者将消息发送给消息服务器后,由消息消费者主动从消息服务器中拉取该消息。
相较于Push模型,Pull模型存在以下优势:
优势的反面即时劣势,Pull模型存在以下缺点:
在实际应用场景中:
如上所述,虽然很多消息中间件都支持Push模式,但是在实现时其实也是采用pull方式实现的push语义。
比较成熟的做法是采用Long-Polling的方式,基于Push/Pull方案的优缺点,在性能与时效性之间寻找到一个平衡点。
Long-Polling是Pull模式的变种。Pull模型中不管服务端数据有无更新,客户端每隔定长时间拉取一次数据,可能有更新数据返回,也可能什么都没有。Long Polling是指客户端发起Long Polling,此时如果服务端没有消息,会hold住请求,直到服务端有可消费的消息,或者到达超时时间才会返回请求。返回后,客户端又会立即再次发起下一次Long Polling。这种方式解决了Pull模式数据通知不及时的问题,且减少了大量的无效轮询次数。
hold住请求指的服务端暂时不回复结果,保持住相关请求,不关闭请求连接,等相关数据准备好,再写回客户端。
由此可见,Long-Polling模式下:
虽然Push模式在语义上更符合事件驱动架构风格,但在当前互联网大数据量高并发的背景下,Pull模式(含Long-Polling)逐步成为主流实现方案。对于使用方来说,综合考虑两者的差异与特性,才能做好技术选型与分析决策。
标题名称:消息中间件系列介绍-传输与消费模式
本文URL:http://www.shufengxianlan.com/qtweb/news28/287578.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联