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的系统可以根据自身情况慢慢消化消费

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

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

相关文章

redis学习路线

待更新… 一、nosql讲解 1. 为什么要用nosql? 用户的个人信息,社交网络,地理位置,自己产生的数据,日志等等爆发式增长!传统的关系型数据库已无法满足这些数据处理的要求,这时我们就需要使用N…

零基础入门学用Arduino 第一部分(三)

重要的内容写在前面: 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后,整体感觉是很好的,如果有条件的可以先学习一些相关课程,学起来会更加轻松,相关课程有数字电路…

KT1404A语音芯片USB连电脑,win7正常识别WIN10无法识别USB设备

一、简介 KT1404A语音芯片画的板子,USB连接电脑,win7可以正常识别到U盘,WIN10提示无法识别USB设备(获取设备描述符失败),这是什么问题 问题 首先,这款芯片已经出货非常非常多了,所…

【Java】Java18的新特性

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

【Docker】上海交通大学开源镜像站服务变更:Docker 用户需迅速行动

近日,上海交通大学开源镜像站宣布了一个重大变更,对国内Docker用户来说,这一消息无疑具有紧迫性。 镜像站服务的变更 上海交通大学开源镜像站一直是国内Docker用户的重要资源,它提供了快速下载DockerHub仓库镜像的服务。然而&a…

react学习-高阶组件

1.简介 react高阶组件是一个函数,接收一个组件作为参数,返回一个新的组件,可以用来进行组件封装,将一些公共逻辑提取到高阶组件内部。 2.基本实现 以下案例为利用高阶组件来增强props import React, { Component } from "re…

浙江大学蒋明凯研究员《Nature》正刊最新成果!揭示生态系统磷循环响应大气二氧化碳浓度升高关键机制

随着大气二氧化碳浓度的升高,陆地生态系统固存额外碳汇的能力取决于土壤养分的可利用性。前期的研究证据表明,在土壤低磷环境下,大气二氧化碳浓度的升高可以提升成熟森林的光合速率,但是没有产生额外生物量固碳。热带和亚热带森林…

国产Sora免费体验-快手旗下可灵大模型发布

自从OpenAI公布了Sora后,震爆了全世界,但由于其技术的不成熟和应用的局限性,未能大规模推广,只有零零散散的几个公布出来的一些视频。昨日,快手成立13周年,可灵(Kling)大模型发布&am…

11-Linux文件系统与日志分析

11.1深入理解Linux文件系统 在处理Liunx系统出现故障时,故障的症状是最易发现。数学LInux系统中常见的日志文件,可以帮助管理员快速定位故障点,并及时解决各种系统问题。 11.1.1 inode与block详解 文件系统通常会将这两部分内容分别存放在…

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

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

机器学习与数据挖掘知识点总结(一)

简介:随着人工智能(AI)蓬勃发展,也有越来越多的人涌入到这一行业。下面简单介绍一下机器学习的各大领域,机器学习包含深度学习以及强化学习,在本节的机器学习中主要阐述一下机器学习的线性回归逻辑回归&…

Python | Leetcode Python题解之第138题随机链表的复制

题目: 题解: class Solution:def copyRandomList(self, head: Optional[Node]) -> Optional[Node]:allNode[] # 用一个数组存储所有结点cur1headwhile cur1:allNode.append(cur1)cur1cur1.nextnlen(allNode)allRandom[-1]*n # 用一个数组存储所有节点…

超详解——识别None——小白篇

目录 1. 内建类型的布尔值 2. 对象身份的比较 3. 对象类型比较 4. 类型工厂函数 5. Python不支持的类型 总结: 1. 内建类型的布尔值 在Python中,布尔值的计算遵循如下规则: None、False、空序列(如空列表 [],空…

算法学习笔记(7.7)-贪心算法(Dijkstra算法-最短路径问题)

目录 1.最短路径问题 2.Dijkstra算法介绍 3.Dijkstra算法演示 4.Dijkstra算法的代码示例 1.最短路径问题 图论中的一个经典问题,通常是指在一个加权图中找到从一个起始顶点到目标顶点的最短路径。 单源最短路径问题:给定一个加权图和一个起始顶点&…

【传知代码】Noise2Noise图像去噪(论文复现)

前言:在数字时代,图像已成为我们记录生活、传达信息、探索世界的重要媒介。然而,随着摄影技术的飞速发展,图像噪声——这一影响图像质量的顽疾,始终困扰着我们。Noise2Noise图像去噪技术为我们提供了一种全新的解决方案…

第二十七章HTML.CSS综合案例

1.产品介绍 效果图如下&#xff1a; 代码部分如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

Elastic Search (ES)Java 入门实操(1)下载安装、概念

实现数据查询代码&#xff1a;Elastic Search&#xff08;ES&#xff09;Java 入门实操&#xff08;2&#xff09;搜索代码-CSDN博客 Elastic Search&#xff08;ES&#xff09;Java 入门实操&#xff08;3&#xff09;数据同步-CSDN博客 Elastic Search 官方描述&#xff0c…

Python下载库

注&#xff1a;本文一律使用windows讲解。 一、使用cmd下载 先用快捷键win R打开"运行"窗口&#xff0c;如下图。 在输入框中输入cmd并按回车Enter或点确定键&#xff0c;随后会出现这个画面&#xff1a; 输入pip install 你想下载的库名&#xff0c;并按回车&…

贰[2],VisionMaster/.NetCore的WPF应用程序调用控件

1&#xff0c;环境 VisionMaster4.2 VisualStudio2022 WPF/.Net6.0 2&#xff0c;记录原因 .NetFrameWork的WPF应用程序调用添加例程.NetFrameWork的Winform应用程序相应的库&#xff0c;不会出现报错&#xff0c;界面也能正常显示操作&#xff0c;但是.NetCore的程序却总是…

JavaScript入门宝典:核心知识全攻略(下)

文章目录 前言一、获取标签元素二、操作标签元素属性1. 属性的操作2. innerHTML 三、数组及操作方法1. 数组的定义2. 数组的操作 四、循环语句五、字符串拼接六、定时器1. 定时器的使用3. 清除定时器 七、ajax1. ajax的介绍2. ajax的使用 前言 JavaScript是前端开发不可或缺的技…