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

消息队列概述

  • 在分布式系统和微服务架构中,消息队列(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的系统可以根据自身情况慢慢消化消费

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JimuReport 积木报表 v1.7.52 版本发布,免费的低代码报表

项目介绍 一款免费的数据可视化报表工具,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! Web 版报表设计器,类似于excel操作风格,通过拖拽完…

常见八大排序(纯C语言版)

目录 基本排序 一.冒泡排序 二.选择排序 三.插入排序 进阶排序(递归实现) 一.快排hoare排序 1.单趟排序 快排步凑 快排的优化 (1)三数取中 (2)小区间优化 二.前后指针法(递归实现) 三.快排的非…

计算机网络 ——网络层(IPv4地址)

计算机网络 ——网络层(IPv4地址) 什么是IPv4地址IP地址的分类特殊的IP地址 查看自己的IPv4地址 我们今天来看IPv4地址: 什么是IPv4地址 IPv4(Internet Protocol version 4)是第四版互联网协议,是第一个被…

欢乐钓鱼大师辅助:哪家云手机自动钓鱼更好操作!

在探索《欢乐钓鱼大师》的世界时,我们不得不提到一个强大的游戏辅助工具——VMOS云手机。通过VMOS云手机,你可以轻松实现自动钓鱼,让游戏体验更加便捷高效。 什么是VMOS云手机? VMOS云手机是一款基于虚拟机技术的云端工具&#…

AMPL下载安装于基本使用(二)

1 带有下标的优化模型 优化问题大部分情况下,参数有很多,约束也有很多,但大部分参数和约束都是同类型的,在数学表达式中往往都以下标来区分,例如《运筹学》(罗纳德 L. 拉丁)中的Pi Hybrids问题…

【postgresql初级使用】视图上的触发器instead of,替代计划的rewrite,实现不一样的审计日志

instead of 触发器 ​专栏内容: postgresql使用入门基础手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 文章目录 inst…

Linux宝塔部署数据库连接问题

博主在部署项目时发现网页可以成功部署,但是登录界面一直登录不进去推测是数据库连接问题。 博主当时在IDEA中写的是用户名为root 密码123456 但是在宝塔中因为自己是跟着教程学的所以就顺手把用户名和密码都改了,于是java中的配置和数据库配置连接不上…

C++第二十五弹---从零开始模拟STL中的list(下)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、函数补充 2、迭代器完善 3、const迭代器 总结 1、函数补充 拷贝构造 思路: 先构造一个头结点,然后将 lt 类中的元…

深入探索:十种流行的深度神经网络及其运作原理

算法 深入探索:十种流行的深度神经网络及其运作原理一、卷积神经网络(CNN)基本原理工作方式 二、循环神经网络(RNN)基本原理工作方式 三、长短期记忆网络(LSTM)基本原理工作方式 四、门控循环单…

.net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript

.net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript 我项目里需要用到“文字编码”,为了保证前端和后端的编码解码不处bug, 所以,我在项目中用了这个 下面推荐之前在.net F4.0时的方法 文章一&#…

js--hasOwnProperty()讲解与使用

@TOC 前言 hasOwnProperty(propertyName)方法 是用来检测属性是否为对象的自有属性 object.hasOwnProperty(propertyName) // true/false 讲解 hasOwnProperty() 方法是 Object 的原型方法(也称实例方法),它定义在 Object.prototype 对象之上,所有 Object 的实例对象都会继…

下载中心表设计

文件表 有哪些文件需要异步生成 文件夹表 添加文件夹功能时使用 权限表 文件权限绑定 对用户来说,下载文件和配置下载管理是两个可直接交互的功能。下载文件包括: 1)添加下载任务(手动开始)。 2)开始…

安卓约束性布局学习

据说这个布局是为了解决各种布局过度前套导致代码复杂的问题的。 我想按照自己想实现的各种效果来逐步学习,那么直接拿微信主页来练手,用约束性布局实现微信首页吧。 先上图 先实现顶部搜索框加号按钮 先实现 在布局中添加一个组件,然后摆放…

Java学习54-关键字this的使用

this是什么 this的作用: 它在方法(准确的说是实例方法或非static的方法)内部使用,表示调用该方法的对象 它在构造器内部使用,表示该构造器正在初始化的对象 this可以调用的结构:成员变量、方法和构造器 什么时候使用this 实…

安徽代理记账公司的专业服务和创新理念

在当今竞争激烈的市场环境中,为了提升企业的运营效率,许多企业开始寻找专业的代理记账公司进行财务管理和记账,本文将介绍一家名为安徽代理记账公司的专业服务和创新理念。 安徽代理记账公司是一家专注于为企业提供全方位会计服务的公司&…

[ 网络通信基础 ]——网络的传输介质(双绞线,光纤,标准,线序)

🏡作者主页:点击! 🤖网络通信基础TCP/IP专栏:点击! ⏰️创作时间:2024年6月8日14点23分 🀄️文章质量:94分 前言—— 在现代通信网络中,传输介质是数据传…

江西代理记账公司的专业服务和优质品质

作为一家专业的代理记账公司,我们始终以“专业、公正、公平”为宗旨,为客户提供全方位的会计咨询服务,我们的服务内容包括但不限于以下几点: 1、代理记账服务:我们拥有丰富的经验和专业知识,能够为企业提供…

【ARM Cache 系列文章 1.2 -- Data Cache 和 Unified Cache 的详细介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Data Cache and Unified Cache数据缓存 (Data Cache)统一缓存 (Unified Cache)数据缓存与统一缓存的比较小结 Data Cache and Unified Cache 在 ARM架构中,缓存&#xff08…

一次改SQLMAP的操作

前言 sqlmap这个工具,相信各位大佬们都不陌生,但sqlmap虽好,也时常会有些实际存在但无法注入的地方,这时候就需要我们改它的配置了,今天就以本人遇到的事件进行阐述。 正文 确认注入点 通过一系列测试最终确定这里…

论文高级图表绘制(Python语言,局部放大图)

本文将通过一个具体的示例,展示如何使用Python语言和Matplotlib库来绘制高级图表,包括局部放大图的制作。适用于多条曲线绘制在同一个图表中,但由于数据量过大,导致曲线的细节看不清,需要对细节进行局部放大。如下图: 环境准备 首先,确保你的Python环境中已经安装了以…