Go微服务: 关于消息队列的选择和分类以及使用场景

news2025/1/21 2:56:46

消息队列概述

  • 在分布式系统和微服务架构中,消息队列(Message Queue)是一个核心组件,用于在不同的应用程序或服务之间异步传递消息
  • 在 Go 语言中,有多种实现消息队列的方式,包括使用开源的消息队列服务(如 RabbitMQ、Kafka、RocketMQ)和 基于 Go 语言的消息队列库

消息队列的基本概念

  • 消息队列允许生产者(Producer)将消息发送到队列中,而消费者(Consumer)则可以从队列中获取消息进行处理
  • 消息队列具有以下特性:
    • 异步处理:生产者和消费者无需实时连接,允许异步地处理和分发消息。
    • 解耦:通过消息队列,服务之间可以解耦,降低系统间的耦合度。
    • 流量削峰:在高峰时段,消息队列可以缓存消息,避免系统过载。
    • 可靠性:消息队列通常具有持久化机制,确保消息不会丢失。

常用消息队列的对比

1 )RocketMQ、 kafka、 RabbitMQ

RocketMQkafkaRabbitMQ
时效性ms级别在ms级以内微妙级
单机吞吐量10万级10万级万级别,比前面2个小一个量级
几百,几千的级别几百,几千的级别
可用性非常高 分布式架构(大多数保证)非常高 分布式架构(大多数保证)高 (主从架构实现高可用)
消息可考证待优化后保证待优化后保证
支持较完善,分布式,扩展好实时计算,日志采集erlang并发强 性能好 低延时
  • 选择:kafka 和 rocketmq 都是 java 生态,rabbitmq 是 erlang 生态,所以 后者被排除,遇到问题,怕很难解决
  • kafka 偏 日志 和 实时计算,所以现在 还剩 rocketmq
  • 选择合适自己的消息队列,在生产环境,独立部署一套
  • 可以先在一台单独的机器上测试
  • 现在选择并部署,在生产环境压一下,整个全链路压测多少时间,这样就可以推断出在每一个节点需要多少资源
  • 做活动的时候,按照基础评估,增加主从集群配置
  • MQ的缺点
    • 稳定性:宕机,业务就挂了,要保证高可用
    • 复杂性:原来一个服务器内搞定的事情,现在要异步调用,消息丢失怎么办?消息顺序如何保证?重复消费怎么办?
    • 一致性: 分布式系统中,多个系统,如果一个系统挂了,如何保证消息处理的一致性,这里涉及到分布式事务,后续继续深入学习
  • 所以,MQ 是需要做集群的,如果单点挂了,就挂了…

2 )使用 Go 语言的消息队列库

  • NSQ
    • NSQ 是一个基于 Go 语言的实时分布式消息队列。它设计用于大规模分布式系统,如实时分析、日志聚合和流数据传递
    • NSQ 提供了简单的 API 和丰富的功能,如发布/订阅、持久化、分布式和可扩展
  • NATS
    • NATS 是一个高性能、轻量级的云原生消息传递系统。
    • 它使用发布/订阅模型,支持多种编程语言和平台,包括 Go。NATS 特别适用于微服务架构中的事件驱动通信。
  • Go Channel
    • 虽然 Go Channel 不是一个完整的消息队列服务,但它为 Go 语言中的并发编程提供了强大的支持
    • 在简单的场景下,可以使用 Go Channel 来实现消息队列的功能
    • 然而,对于复杂的分布式系统,使用专门的消息队列服务可能更为合适

3 ) 如何选择消息队列

  • 在选择消息队列时,需要考虑以下因素:
    • 性能:确保消息队列能够满足系统的性能需求。
    • 可靠性:确保消息队列的可靠性,以避免数据丢失。
    • 可伸缩性:随着业务的发展,系统可能需要处理更多的消息。因此,消息队列需要具有良好的可伸缩性。
    • 易用性:选择易于使用和集成的消息队列服务或库。
    • 成本:考虑消息队列的部署和维护成本。

RocketMQ的选择与使用

  • 文档:https://rocketmq.apache.org
  • 消息模型(Message Model)
    • RocketMQ主要由Producer、 Broker、Consumer三部分组成,其中Producer负责生产消息,Consumer负责消费消息,Broker负责存储消息
    • Broker 在实际部署过程中对应一台服务器,每个Broker可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的Broker
    • Message Queue用于存储消息的物理地址,每个Topic中的消息地址存储于多个Message Queue中
    • ConsumerGroup 由多个Consumer实例构成

1 ) 消息生产者(Producer)

  • 负责生产消息,一般由业务系统负责生产消息
  • 一个消息生产者会把业务应用系统里产生的消息发送到broker服务器
  • RocketMQ提供多种发送方式,同步发送、异步发送、顺序发送、单向发送
  • 同步和异步方式均需要Broker返回确认信息,单向发送不需要

2 ) 消息消费者(Consumer)

  • 负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从Broker服务器拉取消息、并将其提供给应用程序
  • 从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费

3 ) 主题(Topic)

  • 表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位

4 ) 代理服务器(Broker Server)

  • 消息中转角色,负责存储消息、转发消息
  • 代理服务器在RocketMQ系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备
  • 代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等
  • 可以理解为 仓库

5 ) 名字服务(Name Server)

  • 名称服务充当路由消息的提供者
  • 生产者或消费者能够通过名字服务查找各主题相应的BrokerIP列表
  • 多个Namesrv实例组成集群,但相互独立,没有信息交换

6 ) 拉取式消费(Pull Consumer)

  • Consumer消费的一种类型,应用通常主动调用Consumer的拉消息方法从Broker服务器拉消息、主动权由应用控制
  • 一旦获取了批量消息,应用就会启动消费过程

7 ) 推动式消费(Push Consumer)

  • Consumer消费的一种类型,该模式下Broker收到数据后会主动推送给消费端,该消费模式一般实时性较高

8 ) 生产者组(Producer Group)

  • 同一类Producer的集合,这类Producer发送同一类消息且发送逻辑一致
  • 如果发送的是事务消息且原始生产者在发送之后崩溃,则Broker服务器会联系同一生产者组的其他生产者实例以提交或回溯消费

9 ) 消费者组(Consumer Group)

  • 同一类Consumer的集合,这类Consumer通常消费同一类消息且消费逻辑一致
  • 消费者组使得在消息消费方面,实现负载均衡和容错的目标变得非常容易
  • 要注意的是,消费者组的消费者实例必须订阅完全相同的Topic
  • RocketMQ支持两种消息模式:集群消费(Clustering)和广播消费(Broadcasting)

10 ) 集群消费(Clustering)

  • 集群消费模式下,相同Consumer Group的每个Consumer实例平均分摊消息

11 ) 广播消费(Broadcasting)

  • 广播消费模式下,相同Consumer Group的每个Consumer实例都接收全量的消息

12 ) 普通顺序消息(Normal Ordered Message)

  • 普通顺序消费模式下,消费者通过同一个消息队列(Topic分区,称作Message Queue)收到的消息是有顺序的
  • 不同消息队列收到的消息则可能是无顺序的

14 ) 严格顺序消息(Strictly Ordered Message)

  • 严格顺序消息模式下,消费者收到的所有消息均是有顺序的

15 ) 消息(Message)

  • 消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题
  • RocketMQ中每个消息拥有唯一的MessagelD,且可以携带具有业务标识的Key
  • 系统提供了通过Message ID和Key查询消息的功能

16 ) 标签(Tag)

  • 为消息设置的标志,用于同一主题下区分不同类型的消息
  • 来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签
  • 标签能够有效地保持代码的清晰度和连贯性,并优化RocketMQ提供的查询系统
  • 消费者可以根据Tag实现对不同子主题的不同消费逻辑,实现更好的扩展性

消息队列类型


1 )按照发送方式分

  • 同步:发送并阻塞

  • 异步:指定回调函数,发送后立即返回即可,不阻塞,在回调中起一个线程执行

  • 单向:发送后不返回,只管发,性能高,不可靠,发消息级别在ms级别,大多场景不适用,视频通话可用,但为何用mq呢, 这里不适用视频通话

  • 主要关注:同步异步

2 )按消息类型分

  • 普通消息:日常最多,生产者发送,消费者消费,无需保证消息顺序
  • 顺序消息:全局顺序(先进先出,开销大)和分区顺序(开销较小,无需严格先进先出)
  • 延迟消息:订单超时,库存归还,防止友商下单不支付
  • 事务消息:分布式和微服务相关

MQ 使用场景

  • 场景:订单新建完成之后,给用户发送一条短信,(下订单成功通知),还要给用户增加积分
    • 单体服务,发送完短信,就发送积分增加信息
    • 短信是第三方服务,不稳定,体现在第三方服务可能会崩溃,短信发送频率要符合短信平台的规定(限制)
    • 短信欠费被停,这样短信发不出去,积分是没法增加
  • 1 ) 解决方案
    • 异步发送短信,中间加一层 redis, 但要保证 redis 不能挂
    • 这也会造成一些问题
  • 2 )解决方案升级:
    • 把 中间的 redis 替换成 MQ
    • mq 是队列,先进先出, 谁先来,消费谁
    • 这样,积分服务无需关心订单服务,只需要关心 MQ 中的订阅
    • 销峰:订单量大了,直接把消息发送到 MQ 里就算成功,后续订阅MQ的系统可以根据自身情况慢慢消化消费

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

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

相关文章

2024 年最全的 21 款数据恢复工具软件汇总

使用其中任何一款免费数据恢复工具,您都可以找回那些您认为已经永远消失的文件。我根据这些程序对我而言的易用性和它们提供的功能对这些程序进行了排名。 这些应用程序从您的硬盘、USB 驱动器、媒体卡等恢复文档、视频、图像、音乐等。我建议每个计算机所有者都安装…

附录二-nmap基本用法

参考 黑客工具—Nmap的使用_哔哩哔哩_bilibili nmap是扫描IP和端口的,相当于攻击前的索敌步骤。不止网络安全方面会用到,平时运维的时候也会用到nmap 1 下载nmap nmap官网 https://nmap.org/ 点击下载,然后点你用的平台就行了 往下滚可以…

[职场] 硬件研发是什么职业 #职场发展#其他

硬件研发是什么职业 硬件研发工程师需要具备丰富的电子电路知识、熟练掌握各种电子元器件的性能及应用、具备一定的机械结构设计能力,同时还要具备良好的团队协作和沟通能力。本文会进行详细介绍。 一、硬件研发是什么 硬件研发,全称硬件研发工程师&am…

一文搞懂Python的异常

人生之事,不如意者十之有九。 在编程中亦是如此。异常(Exception),遍布于程序各个角落,开发工作的大部分coding,都是为了应对和解决它。 概念 异常,简而言之,是程序在执行期间发生的非预期的、非正常的事件或情况。 举个实际生活的例子: 你周末出门买大龙虾,但当你…

Vue-App桌面程序列表

Vue-App桌面程序列表 文章说明讲解视频核心代码效果展示项目链接 文章说明 采用Vue实现PC端的桌面程序列表,采用HBuilderX将程序转化为5App,实现移动端的适配;支持桌面打开新应用,底部导航展示当前应用列表,可切换或关…

用你熟悉的语言就能开发智能合约,Vara Network 以 WASM 解锁未来应用创新

Vara Network 自推出以来,凭借其基于 Gear Protocol 的独特架构和强大的开发工具,为开发者提供了一个高效、安全的智能合约构建平台。Vara Network 通过采用先进的 Actor 模型、持久内存概念和 WebAssembly 技术,实现了异步消息处理、并行计算…

在线OJ项目测试(selenium+Junit5)

目录 在线OJ项目测试的思维导图 在线OJ的UI自动化测试 测试一:检查未登录时的页面访问以及一些未登录时的非法操作 测试二:测试注册界面 测试三:测试登录界面 测试四:测试题目列表界面 测试五:测试题目详情界面…

Android Kotlin 异步操作回调转换为挂起函数

异步接口回调是一种通过接口将任务的执行和结果处理分离开来的编程设计模式。通常用于网络请求、数据库查询等耗时操作。 挂起函数是 Kotlin 中的一个特性,用于简化异步编程。挂起函数是可以在协程中暂停执行并恢复的函数,避免了回调地狱问题&#xff0…

php质量工具系列之PHPCPD

PHPCPD 用于检测重复代码,直观的说就是复制粘贴再稍微改改 该工具作者已经 停止维护 安装 composer global require --dev sebastian/phpcpd执行 phpcpd --log-pmd phpcpd_result.xml ./app参数介绍 --log-pmd 将结果保存在phpcpd_result.xml 中 ./app 是phpcpd扫…

linux系统PXE自动装机和无人值守

一、PXE 1.PXE:c/s模式,允许客户端通过网络从远程服务器(服务端)下载引导镜像,加载安装文件,实现自动化安装操作系统。(c/s客户端和服务端都可以是多台) 2.PXE优点:规模…

【机器学习基础】Python编程08:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

基于STM32开发的智能家居监控系统

目录 引言环境准备智能家居监控系统基础代码实现:实现智能家居监控系统 4.1 传感器数据读取4.2 电器设备控制4.3 实时数据监控与分析4.4 用户界面与数据可视化应用场景:家庭安全监控与管理问题解决方案与优化收尾与总结 1. 引言 随着智能家居技术的发…

AI绘画中的图像格式技术

在数字艺术的广阔天地里,AI绘画作为一种新兴的艺术形式,正在逐渐占据一席之地。不同于传统绘画,AI绘画依赖于复杂的算法和机器学习模型来生成图像,而这一切的背后,图像格式技术发挥着至关重要的作用。图像格式不仅关系…

23 二叉搜索树

本节目标 1.内容安排说明 2.二叉搜索树实现 3.应用分析 4.进阶题 1. 内容安排说明 二叉树在c数据结构已经说过了,本节内容是因为: map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构二叉搜索树的特性了解,有助于…

LNMP与动静态网站介绍

Nginx发展 Nginx nginx http server Nginx是俄罗斯人 Igor Sysoev(伊戈尔.塞索耶夫)开发的一款高性能的HTTP和反向代理服务器。 Nginx以高效的epoll.kqueue,eventport作为网络IO模型,在高并发场景下,Nginx能够轻松支持5w并发连接数的响应,并…

OrangePi AIpro Ubuntu 22.04 aarch64 安装MySql 8.0

查看MySQL安装包 接下来可以使用以下命令安装MySQL服务器: 安装MySQL 8.0 # 安装最新版本 sudo apt install -y mysql-server # 安装指定版本 sudo apt install -y mysql-server-8.0初始化配置信息 sudo mysql_secure_installationVALIDATE PASSWORD COMPONENT ca…

算法分析与设计期末考试复习(更新ing)

重点内容: 绪论: 简单的递推方程求解 1.19(1)(2) 、 教材例题 多个函数按照阶的大小排序 1.18 分治法: 分治法解决芯片测试问题 计算a^n的复杂度为logn的算法(快速幂) 分治法解决平面最近点对问…

SecureCRT[po破] for Mac SSH终端操作工具[解] 安装教程

文章目录 效果一、准备工作二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、 应用程序显示软件图标,表示安装成功 三、输入对应参数1、解决“软件已损坏,无法打开,要移到废纸篓”问题解决步骤…

从零开始实现自己的串口调试助手(8)-循环发送

循环发送 准备 创建槽函数 设置QSpinBox的最大值 注意: // 我们不能在qt的ui线程中延时,否则将导致页面刷新问题 //QThread::msleep(ui->spinBox->text().toInt());//设置下次发送时间间隔 定时器实现 关联信号与槽: //添加自动换行定…

【Vue】什么是props

文章目录 一、介绍二、代码示例三、props校验四、props校验完整写法五、props&data、单向数据流 一、介绍 Props 定义 组件上 注册的一些 自定义属性 Props 作用 向子组件传递数据 特点 可以 传递 任意数量 的prop可以 传递 任意类型 的prop 二、代码示例 父组件App…