如何为微服务选择正确的消息队列

3cc5a430a9251b3560a15e5a94f7334e.png

微服务及消息队列简史

自从 Peter Rodgers 博士 2005 年在 Web Services Edge 会议上首次提出 Micro-Web-Services 一词后,IT 行业慢慢地从单体架构转向了微服务。

2009 年,Netflix 决定把其单体架构拆分为微服务。

2010 年,Best Buy 开始把它们的单体架构转变为微服务架构。

2011 年,eBay 开始推行微服务。

2001 年,当时 Amazon 的零售网站还是个巨大的单体架构。

Rob Brigham 在 Amazon 的 re:Invent 2015 会议上提出了微服务改造建议:

  • 将服务端拆分成松耦合的微服务

  • 隔离微服务时应该关注业务而非团队技术栈

  • 成立更小单位的研发团队,专注于定义良好的服务,使他们可以更高效、更大规模的完成交付

今天,服务端基本都遵循微服务架构设计模式。然而,基于消息队列的进程间或线程间通信可以追溯到 20 世纪 80 年代初,当时使用的是 UNIX 的 V API 或其它实时操作系统内核。直到 2000 年代,基于网络间通讯的消息队列才诞生。

  • RabbitMQ 在 2007.07.01 发布了它的 v1.0.0 版本

  • Kafka 最初由 LinkedIn 开发,随后于 2011 年初开源

  • Amazon SQS 于 2004 年底进入测试阶段,并于 2006 年年中正式上市

使用同步通讯还是异步通讯

选择了微服务架构,就面临着选择服务间的通讯协议:

  • 同步:HTTP,如 REST、SOAP、RPC、gRPC 等

  • 异步:消息队列,如 AMQP、Kafka、MQTT 等

同步通讯更容易出错,更难调试,也更难恢复。如果不是实时性要求特别强的功能,可以考虑异步通讯。

异步通讯提供了单一、可靠的消息总线,使得调试更容易,更不容易出错,服务间数据传递更可靠也更安全。

也就是说,除非存在使用较旧编程语言的遗留服务,或者无法改造的旧基础架构,云原生时代更建议选择异步通讯。

选择了使用异步方法,就需要决定使用什么消息队列中间件和消息队列协议。

消息队列中间件

以下是截至 2021 年比较著名的消息队列中间件以及云服务列表:

  • RabbitMQ

  • Apache Qpid

  • Apache Kafka

  • Apache ActiveMQ

  • Redis

  • Eclipse OpenMQ

  • JoramMQ

  • Eclipse Mosquitto

  • HiveMQ

  • Solace PubSub+

  • Google Cloud Pub/Sub

  • Amazon SQS

  • Amazon MQ

  • IBM MQ

  • Azure Event Hubs

  • Azure Service Bus

消息队列协议矩阵

以下是消息队列协议比较矩阵:

fddc44d495746893f44ab9a21e149afd.png

注意:Headers 表示具有任意数量键的 dictionary 或 map,而 attrs 表示一组有限的键值对。

相似点:

  • 所有协议都有队列的 FIFO 概念

  • 所有协议都基于 TCP

  • 所有协议都有生产者、消费者的概念

  • 所有协议都有负载(payload)与正文(body)

不同点:

  • AMQP 有不同的消息传递模型

  • Cloud-based 的消息队列具有死信队列

  • 消息检索(routing key)方法不同

  • Headers 和 attrs 的支持有限

  • Redis、STOMP、MQTT 的功能最不丰富,而 AMQP 的功能最丰富

  • Cloud-based 的消息队列具有一些独特的配置以及相关 API。

消息队列协议详解

消息队列协议的选择实际上比消息队列中间件的选择更重要。因为如果选择一个更通用的协议,就更容易找到其他中间件作为替代。

AMQP

AMQP - Advanced Message Queue Protocol 是一种基于 TCP 的二进制协议,已成为 ISO 和 OASIS 的标准,AMQP 协议主要由 RabbitMQ 使用。

优点:

  • 针对不同的用户场景使用不同的消息传递模型,在协议级别降低了架构的复杂性

  • AMQP 是 ISO 和 OASIS 标准,被广泛采用

  • AMQP 快速、安全,可能是消息队列协议中最成熟的

  • 可以在公有云上找到对应的云产品,并且可以在云产品和自有 RabbitMQ 间轻松切换

  • 使用 classical 队列或 quorum 队列进行队列镜像,使其易于扩展

  • RabbitMQ 的消息大小限制在版本 3.7.0 之前为 2GB,在版本 3.8.0 中减少到 128MB

缺点:

  • 不向下兼容,客户端只实现协议的一个版本,版本之间升级迁移可能很耗时

  • 依赖 RabbitMQ 许多插件可能会面临运维挑战

  • 调试和监控可能存在问题

  • 虽然 AMQP ‍感觉像是标准化的消息队列协议,但大多数消息队列中间件都不支持它

Apache Kafka

Apche Kafka 既是消息队列中间件的名称,也是协议本身。截至 2021,该协议共有 12 个版本,客户端可同时兼容所有版本。

Apche Kafka 是一个由 Apache 软件基金会开发和维护的项目,用 Scala 和 Java 编写。

Apache Kafka 团队选择定义自己的协议,而不是采用 AMQP 或 STOMP。是因为他们认为协议决定了实现,因此,采用已有的协议会降低了他们创建分布式消息中间件以及进行某些优化的自由度。

优点:

  • Apache Kafka 的 partition 和 replication 的功能使其易于扩展

  • Apache Kafka 提供了一种批量发送小消息的方法,使得该协议非常高效

  • Apache Kafka 提供的管理 API 使调试变得很容易

缺点:

  • Apache Kafka 需要部署 ZooKeeper 和 Kafka 两部分,对于初学者而言具有一定的挑战性

  • Apache Kafka 协议规范不断升级变化,客户端可能很难跟上其变化,升级也可能具有挑战性

  • 消息大小限制为 1MB

STOMP

STOMP - Streaming Text Oriented Messaging Protocol 是一种基于文本的协议,与 AMQP 非常相似。但它缺乏其他协议所具有的许多功能和优化。另一方面,STOMP 的简单性使其更易于采用。因此,有许多客户端支持该协议,RabbitMQ 也可以通过插件支持 STOMP。对于一些简单的用例或快速原型,可以考虑使用 STOMP‍。

优点:

  • 简单,易于集成

  • 通过插件方式支持 RabbitMQ

缺点:

  • 与其他协议相比,功能和优化更少

MQTT

MQTT - Message Queuing Telemetry Transport 是物联网(IoT)的消息队列协议,它是 ISO 和 OASIS 标准,当前支持 MQTT 的最著名的中间件是 Eclipse Mosquitto 和 HiveMQ。

优点:

  • 轻量

  • 双向

缺点:

  • 不适用于与物联网无关的微服务

  • 功能不够丰富

Redis

RESP - Redis Serialization Protocol 是 Redis 的协议。Redis 是一个基于内存的 Key-Value 数据库。从技术上讲,Redis 不是一个消息队列中间件,但通过一些客户端手段,Redis 可以用于异步消息通讯。这主要是那些喜欢使用 Redis 的开发者或者一些简单场景采用的手段,因此,也把 Redis 纳入消息中间件。

优点:

  • Redis 基于内存,速度相当快

  • 对于已经使用 Redis 的人来说,基本无学习曲线


缺点:

  • 消息没有持久化,有丢消息的风险

  • 功能不够丰富

  • 不适用于其他协议能解决的所有应用场景

云服务,如 AWS SQS

如果不想自己维护基础设施,并需要自动扩容,或者本身就在公有云上,此时,可以考虑直接使用云服务。

优点:

  • 方便快捷

  • 稳定,自动扩容

  • 无需个人维护

缺点:

  • 对于简单或轻量的业务场景 ,费用可能过高

  • 客户端兼容问题依赖云厂商解决,对某些开发语言可能兼容不好

  • 非客户端交互模式,如 API 方式可能存在性能问题

如何选择消息队列

总之,一般情况下使用 AMQP - RabbitMQ 或 Kafka,对消息可靠性要求较高时考虑 RabbitMQ,否则选择 Kafka。

请勿采用 STOMP,因为它没有被很好的兼容,而且没有很好的优化。

如果您在从事物联网业务,那么请使用 MQTT,它适合物联网。

如果您喜欢 Redis,并且无法添加其它新技术,那么可以继续使用 Redis,但需要接受 Redis 在消息队列中的缺点。

如果您本身就在使用公有云,具备一定的用户或业务体量,对消息队列有稳定性及自动扩容的要求,并且能接受其费用,那么,选择云服务提供的消息队列。

参考总结

以上就是本文希望分享的内容,如果大家有什么问题,欢迎在公众号 - 跬步之巅留言交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【小白必懂】C语言回文数判断

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我,若你是真心学习可以送你书籍,指导你学习,给予你目标方向的学习路线,无套路,博客为证。 情景再现 👸小媛:小C,今天可以教我…

『技术群里聊些啥』查看 dotnet 源码,用它!用它!用它!

前言有网友在交流群中询问,怎么找到 System.Linq 源码的库:其实,我一直使用http://source.dot.net查看 dotnet 源码,这可是David Fowler(微软 .NET 架构师)也推荐的:功能演示那它到底有哪些功能…

(7)3分钟搞定 C# 逻辑运算

本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课程也将会逐步更新。 若…

【经典回放】多种语言系列数据结构算法:二叉树(C#版)

实验任务描述 1 用C#语言完成二叉树的类、并构造出一个二叉树; 2 用递归方法完成二叉树的遍历; 3 泛型的二叉树遍历之一、用队列给出遍历结果 4 泛型的二叉树遍历之二、委托方式给出二叉树遍历结果 1 二叉树类的设计 同C语言一样,要构建一个二叉树,要用到类似struct的东西…

ThinkPHP讲解(十二)——文本编辑器和ajax传址

一、文本编辑器 1.首先&#xff0c;在网上下载ueditor文件 2.在要添加文本编辑器的页面中引用ueditor文件中的js文件 <script type"text/javascript" charset"utf-8" src"../ueditor/utf8-php/ueditor.config.js"></script> <scr…

(8)小白又如何?3分钟搞定一个 C# 知识点

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

华为鸿蒙vogtloop30pro价格,华为Mate30系列基本确认:首发麒麟985+鸿蒙系统,价格感人!...

原标题&#xff1a;华为Mate30系列基本确认&#xff1a;首发麒麟985鸿蒙系统&#xff0c;价格感人&#xff01;转眼间即将步入6月份&#xff0c;近期关于各大厂商下半年的新机消息也是多了起来&#xff0c;就拿华为下半年的高端旗舰华为Mate30系列来说&#xff0c;在各方媒体的…

(11)python里面while到底有多少知识点

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

【经典回放】多种语言系列数据结构算法:二叉树(JavaScript版)

1 二叉树类的设计以及二叉树遍历 要完成二叉树的类设计&#xff0c;最好把链表下的Node.js复制过来&#xff0c;相比链表的结点&#xff0c;二叉树仅仅是多了一个结点指针而已。略加修改后&#xff0c;就是&#xff1a; function TNODE(DATA) { this.DataDATA; this.lChildnu…

Fiddler之解决https链接返回数据显示乱码问题

1 、问题 我网页访问淘宝&#xff0c;然后F12查看关键链接&#xff0c;返回的数据里面有json各式的数据&#xff0c;然后我通过关键字在Fiddler里面找到链接&#xff0c;然后查看返回的内容是乱码。 2 、解决办法 然后这样设置&#xff0c;再去查看SyntaxView或者Raw都可以看到…

android上传图片被旋转,input上传照片旋转解决办法

需求很简单&#xff1a;h5拍照上传照片&#xff0c;然后显示出来问题在&#xff1a;上传之后的图片在PC&#xff0c;IOS端均能正常显示&#xff0c;Android端显示的则是被旋转90度的。直接上代码下面这个方法传入file对象&#xff0c;然后会去除掉照片中的exIf信息&#xff0c;…

(12)python 的列表我从没想过会那么好用

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

html5 语义化标签

html5 语义化标签 在HTML 5出来之前&#xff0c;我们用div来表示页面章节&#xff0c;但是这些div都没有实际意义。&#xff08;即使我们用css样式的id和class形容这块内容的意义&#xff09;。这些标签只是我们提供给浏览器的指令&#xff0c;只是定义一个网页的某些部分。但…

Android之实现首尾带圆角的多颜色水平条

1 效果图 3 代码实现 这里我们采用PercentRelativeLayout布局,首尾我们用半圆shape实现,代码如下 color.xml <color name="progress_first">#1ebBd5</color><color name="progress_second">#f36f53</color><color name=&…

(9)有一些人在学习编程的时候总以为代码是死板的

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

.NET性能优化-推荐使用Collections.Pooled

简介性能优化就是如何在保证处理相同数量的请求情况下占用更少的资源&#xff0c;而这个资源一般就是CPU或者内存&#xff0c;当然还有操作系统IO句柄、网络流量、磁盘占用等等。但是绝大多数时候&#xff0c;我们就是在降低CPU和内存的占用率。之前分享的内容都有一些局限性&a…

避免活跃性危险(第十章)

2019独角兽企业重金招聘Python工程师标准>>> 避免活跃性危险 在安全性与活跃性之间通常存在着某种制衡&#xff0c;我们使用加锁机制来确保线程安全&#xff0c;但如果过度地使用加锁&#xff0c;则可能导致“锁顺序死锁”。同样&#xff0c;我们使用线程池和信号量…

(10)C#偷懒的开始永无止境的循环?

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

活照片 android,活照片app安卓

活照片app是当前国内一款最新的图片处理应用软件&#xff0c;能帮助大家快速进行最新的手机拍照、处理功能&#xff0c;当前活照片app已经推出了安卓、苹果版本&#xff0c;可以帮助大家一键修图&#xff0c;将你的图片变得更加有趣。活照片app功能&#xff1a;它可以让你的照片…

Jwt隐藏大坑,通过源码揭秘

前言JWT是目前最为流行的接口认证方案之一&#xff0c;有关JWT协议的详细内容&#xff0c;请参考&#xff1a;https://jwt.io/introduction今天分享一下在使用JWT在项目中遇到的一个问题&#xff0c;主要是一个协议的细节&#xff0c;非常容易被忽略&#xff0c;如果不是自己遇…