首页 > 其他分享 >关于消息队列的一些思考

关于消息队列的一些思考

时间:2023-05-29 17:55:06浏览次数:40  
标签:异步 事务 队列 消息 思考 日志 数据

  1. 日志与消费队列
  2. 消息队列的应用价值
    • 数据集成于系统解耦
    • 异步处理与事件驱动
    • 流量削峰
    • 事务消息与分布式事务的最终一致
  3. 从历史看消息队列的价值演化

思考手上的工作,找到他的价值和定位,将价值最大化

1. 日志和消息队列

推荐文章:The Log: What every software engineer should know about real-time data's unifying abstraction | LinkedIn Engineering

日志的应用目标:它记录了什么时间发生了什么事情。

由于日志【按时间天生有序】的特性,解决了分布式系统中的两个重要问题:修改操作的顺序数据分发,这为并发更新的一致性和副本复制提供了基础。将协商出一致的修改操作顺序写入日志,,利用日志做修改操作的“数据分发”,使得各副本能够在本地应用完全相同的操作顺序,无需考虑网络延迟等其他因素对操作顺序的影响,从而保证各副本数据的一致。

本质上是把多台机器一起执行同一件事情的问题简化为实现分布式一致性日志,通过日志的 Pub/Sub 保证多题啊机器对数据处理的最终一致。

Primary 将各种操作通过日志序列化,各 Replica 从日志中读取并应用到本地状态,这种解决问题的模式也叫 Pub/Sub,即抽象成通用的数据订阅机制,而将这种抽象产品化,这就是 消息队列

2. 消息队列的应用价值

消息队列作为大型分布式系统的关键组件,在实时数据或流式数据架构中扮演这重要的角色。它通常被应用再系统解耦、异步处理、流量削峰,分布式事务/金融电商等场景中。

1. 数据集成&系统解耦

数据集成:将一个组织所拥有的数据,使其在所有的服务和系统中都可用。

数据集成的难点在于需要面对:

  • 越来越多的数据
  • 越来越多的数据系统

图片

引入消息队列做数据分发。

好处:

  • 这样架构只需要关心如何将数据导入消息队列即可
  • 由于消息队列的解耦,架构复杂度大大降低,各系统间的数据同步不会互相影响
  • 由于消息队列的持久化,不易丢失数据,也可以在必要时进行数据重放
  • 由于所有数据都汇聚到消息队列中,数据集成很高效,可以快速介入新的系统而不影响存量架构

解耦是消息队列解决的最本质的问题,价值所在。

2. 异步处理&事件驱动

异步处理:本质上是解耦系统间的 RPC 调用,将那些依赖其他系统,同时对时效性要求不高的逻辑剥离出来,提高系统吞吐量和响应时间,降低系统耦合的复杂度。异步处理注重的是“通知”,事件驱动。

好处:

  • 简化业务逻辑,更快的返回结果,提升响应效率和系统吞吐,改善用户体验
  • 及时异步逻辑出现异常,也不会影响主流程,降低系统耦合度

图片

异步处理更多的是事件驱动,引入消息队列做事件的转述与投递,从架构上也会达到解耦的功效。事件驱动的核心就是一套稳定、靠谱的 Event-Streaming 系统:消息队列。

大型分布式架构的数据总线、微服务中隔离直连的异步调用,事件驱动,处处都有消息中间件的身影。

3. 流量削峰

为什么要削峰:

  1. 后端服务的处理能力往往是有限的,无法和前端对等,同样的机器能够支撑的并发量无法跟前端处在同一个数量级。
  2. 后端服务对到达自身的流量是不可控的,只要上游调用不限流,后端就随时暴露在流量洪峰的压力下。

图片

消息队列的作用:

  • 高吞吐的特点可以在不高的成本下承接住巨大的流量,起到蓄水池的作用
  • 后端采用拉取的消费模式,可以按照自身的处理能力进行流控,平稳的消费队列

4. 事务消息于分布式事务的最终一致

消息队列中的事务:指“业务执行本地事务”与“消息发送到消息队列“的原子性。

事务消息和普通消息的区别是,在事务提交前,这个消息对消费者来说是不可见的,基于事务消息,消息队列最终解决的是生产者与消费者在分布式事务场景中的一致性问题。

消费端对数据的处理逻辑一般是幂等的。

图片

对于以上场景,引入消费队列做异步处理,使用非事务消息可能会出现如下情况:

  • 创建订单成功,写入消息失败导致使用的优惠券没有被删掉
  • 订单因支付失败没有创建成功,优惠券却被删除了

事务消息要解决的就是上述问题,保证“业务执行本地事务”(创建订单)和“发送消息”这两件事情是原子性的,然后依赖消息队列的可靠投递,实现不同系统对数据处理的最终一致性。图片

服务端为了实现事务机制(保障下游系统能消费到客户端认为已经提交的事务信息),需要做以下事情:

  1. 引入事务状态来“记录”客户端事务是否提交
  2. 由于网络原因或订单系统重启,导致有些客户端已提交或撤回的消息在服务端的状态是未知的。需要辅助“补偿"机制(对不确定状态的消息进行回查或客户端询问)来解决

通过两阶段提交语义(事务消息),事务状态反查的机制补偿,消息队列的可靠投递,以及业务消费逻辑的幂等,实现分布式事务最终一致。

3. 从历史看消息队列的价值演化

  1. 最早的消息队列开源产品 ActiveMQ,可以追溯到2003年,这一阶段主要是用来减轻经典 RPC 调用的紧耦合,剥离异步处理逻辑,解耦系统复杂度。(调用松耦合,异步处理
  2. 第二阶段便是以kafka为经典代表的实时数据管道时代,这一阶段的产品在吞吐和数据量上都有质的提升,主要是为了解决数据集成的痛点,提高数据在不同系统之间的流转效率。(数据管道,数据集成,实时计算
  3. 消息系统的第三个阶段,流数据平台,不仅仅是一个数据管道,更多的是强调平台化。平台化使得消息系统必须配备完善的多租户管理,I/O阻隔,流控与配额管理等。随着容器化发展,消息队列需要一个灵活的架构来适应这种变革,未来存储计算分离很可能是中间件产品的架构发展方向。(平台化,容器化,存储计算分离架构

标签:异步,事务,队列,消息,思考,日志,数据
From: https://www.cnblogs.com/radish40/p/17441228.html

相关文章

  • 详解大数据中必不可少的消息中间件 kafka(3.x 新版本)
    楔子本次来聊一聊kafka,相信大家都知道它是一个应用于大数据实时领域、基于发布/订阅模式的分布式消息中间件(或者说消息队列),能够和不同的进程进行通信,从而实现上下游之间的消息传递。有了消息队列之后,上游服务和下游服务就无需直接通信了,上游服务将消息发送到队列中,下游从队列中......
  • 微信公众号开发---基础消息能力开发
    微信公众号接收普通消息1.配置开发服务器微信公众平台->开发->开发者工具->公众平台测试账号appid:是微信公众号的唯一标识,通过和appsecret进行验证。URL:开发服务器的路径,接收微信服务器发送的数据。Token:自设定的token,和开发服务器中进行验证的token保持一致。微信公众号用户,......
  • Python generator 构建协程,实现异步编程(使用yield构建消息处理者和消息创造者)
    协程的定义理解Python协程可以在单个处理机或多个处理机上运行,这取决于具体实现方式。在Python中,主要有两种协程实现方式:生成器协程和asyncio协程。生成器协程只能在单个处理机上运行,因为生成器协程是通过生成器函数实现的,而生成器函数在单个线程中执行。生成器协程也称为......
  • Disruptor内存消息队列简单使用
    Disruptor内存消息队列最近在做一个有关使用内存消息队列到功能,比如将日志信息或点击统计信息持久化等操作,开始想着用java到内存队列作为缓冲区,后来在网上搜到Disruptor这个东西,神乎其神到,就简单了解了一下,做了一个demo,感觉还不错,可以用用,有关概念可以自行搜索,下面就简单介绍一下开......
  • 微服务架构学习与思考(13):分布式配置中心
    一、配置中心的诞生用编程语言编写应用项目时,一般都会有项目的配置文件。比如用java编写项目,有一个properties的配置文件,会把一些配置信息写入到该文本文件中,例如数据库相关的配置信息。这也体现了软件设计的一个原则:关注点分离。把代码和配置信息相分离。​......
  • 数据结构之队列
    @TOC前言本文章讲述的是数据结构的特殊线性表——队列一.什么是队列,队列的特点队列是数据结构中的一种特殊的线性表,它与栈不同,队列的基本图例如上图:显然,队列的特点就是:先进先出FirstInFirstOut那么我们使用什么样的方式来实现队列呢?基于队列的特点,使用链表而不是数组来实现队......
  • 代码随想录Day11|栈和队列
    20.有效的括号经典的利用栈的题目这里选择用java来写,注意我们的java中的泛型不能用基本数据类型,而是应该使用包装类注意!java一定是定义后需要声明,然后才能使用1047.删除字符串中的所有相邻重复项 略比较简单150.逆波兰表达式求值注意:leetcode内置jdk的问题,不能使......
  • 优先级队列的实现详解( Java 实现)
    前言优先级队列是在队列的基础上,每个元素都带有一个优先级,可以实现按照优先级高低进行存储和访问。Java提供了许多实现优先级队列的方法,例如使用堆来实现。在本篇博客中,我将介绍Java实现优先级队列实现的具体方法,以及如何使用它来解决实际问题。一、优先级队列的概念优先级队列......
  • 团队开发一些思考
    团队项目总结设想和目标我们的项目是智能排班系统。1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述?智能排班系统旨在更加高效地管理和优化人员排班流程,以满足各种行业(如医疗、零售、制造业等)的排班需求,其中主要解决以下问题:优化排班流程:......
  • 思考-关于纸质还是电子笔记
    原因有长期用纸质记录规划每天生活的习惯,但是由于长期使用键盘打字,在使用纸笔写字的过程中,写字速度有点慢,手写速度更不上大脑的思考速度;其次,手部手写过程中出现不适感,而在打字的过程中,虽然有打错字的概率,但总体上还行。纸质的好处写作的内容较为随意写作的方式、风格较为......