削峰填谷与应用间解耦:分布式消息中间件在分布式环境下并发流量控制的应用

这是《百图解码支付系统设计与实现》专栏系列文章中的第(18)篇,也是流量控制系列的第(4)篇。点击上方关注,深入了解支付系统的方方面面。

本篇重点讲清楚分布式消息中间件的特点,常见消息中间件的简单对比,在支付系统的应用场景,比如削峰填谷,系统应用间的解耦,事务消息等。

内容偏入门介绍,已经使用过消息中间件的同学可以不用往下看了。

1. 前言

在流量控制系列文章中的前四篇,分别介绍了固定时间窗口算法、滑动时间窗口算法、漏桶原理、令牌桶原理,应用场景和java版本的核心代码。

我们做个简单回顾:

固定窗口:算法简单,对突然流量响应不够灵活。超过流量的会直接拒绝,通常用于限流。

滑动窗口: 算法简单,对突然流量响应比固定窗口灵活。超过流量的会直接拒绝,通常用于限流。

漏桶算法:在固定窗口的基础之上,使用队列缓冲流量。提供了稳定的流量输出,适用于对流量平滑性有严格要求的场景。

令牌桶算法:在滑动窗口的基础之上,使用队列缓冲流量。提供了稳定的流量输出,且能应对突发流量。

今天讲的分布式消息中间件在支付场景的削峰填谷用得比较多,且对精度没有那么苛刻的场景,比如集群低到1TPS,就无法做到。

2. 削峰填谷原理

削峰:在流量高峰期,通过消息中间件暂存大量的请求,减少对后端系统的直接压力。

填谷:在低峰期,逐渐处理这些积累的请求。

这种方法能有效平衡系统负载,防止在高峰时段系统崩溃。

我们一般使用消息中间件实现削峰填谷。下面是一个支付引擎自产生消的示例图。收到支付请求后,先扔到消息中间件,然后启用新的监听线程去消费。通过控制消费线程数来控制流量。

比如一下来了1000个请求,一共10台机器,每台机器消费线程只开5个,每个请求处理500ms,那么每秒就处理100个请求,共耗时10秒处理完。

消息中间件还有一个作用,就是应用间的解耦。比如支付成功后,渠道网关通过消息中间件返回给支付引擎。

3. 常见的分布式消息中间件介绍

消息中间件有很多,这里简单对比 RocketMQ、RabbitMQ 和 Kafka在性能、可靠性、易用性、功能特性、适用场景等方面的不同。如下:

性能

  • RocketMQ: 提供非常高的性能和吞吐量,特别适合大规模的消息传输和处理场景。
  • RabbitMQ: 性能优秀,尤其在小型消息的传递上非常高效。但在处理非常大量的消息时,性能可能不如 Kafka 和 RocketMQ。
  • Kafka: 专为高吞吐量设计,特别适合需要处理大数据流的场景。它在持久化和分布式处理方面的性能表现尤其出色。

可靠性

  • RocketMQ: 提供高可靠性保证,支持分布式事务。
  • RabbitMQ: 通过消息持久化、交付确认等机制提供可靠的消息服务。
  • Kafka: 数据持久化和高容错能力,确保了高可靠性。

易用性和管理

  • RocketMQ: 相对复杂,需要一定的学习曲线,但提供丰富的特性和灵活性。
  • RabbitMQ: 用户友好,易于安装和配置,拥有直观的管理界面。
  • Kafka: 配置和管理相对复杂,但社区支持强大,提供了丰富的文档资源。

功能特性

  • RocketMQ: 支持广泛的消息模式,包括顺序消息、定时/延时消息和事务消息。
  • RabbitMQ: 提供多种消息路由模式,支持灵活的消息模型和多种协议。
  • Kafka: 专注于高吞吐量的消息队列和流处理,支持实时数据处理。

适用场景

  • RocketMQ: 适用于大规模分布式系统中的消息处理,如电商平台和金融系统。
  • RabbitMQ: 适合需要复杂路由、多种消息协议和高效小消息处理的场景,如企业应用集成。
  • Kafka: 非常适合于需要高吞吐量、大数据处理和实时流处理的应用,如日志聚合和实时监控系统。

结论

  • 在支付系统,我个人更推荐RocketMQ,原因有两个:第一,经过阿里电商+支付各种非常高并发的大促洗礼,RocketMQ 在大型分布式系统中表现出色。第二,支持事务消息,这个在支付领域还是很有用的。

另外,我也只是简单介绍,大家实际应用的时候,根据实际情况去选型,建议是做多方了解后,部署验证后才规模使用。不过话说回来,这几款分布式消息中间件的技术非常成熟了,除了几个顶流的互联网公司外,基本可以随便用,哪个手熟就使用哪个。

4. 使用注意事项

脑裂问题

曾经在生产环境碰到过RabbitMQ脑裂问题,交易全部中断。在分布式环境中完全避免也不现实,建议加强监控。

消费线程数问题

消费线程要合理设置,太多,可能达不到削峰填谷的效果,太少,消息有可能会积累,影响处理时效。

比如支付是有时效,积压太久就会导致用户放弃支付。

消息积压应对

提前做好预估,以及监控。一旦把中间件压爆,可能整个交易系统。

持久化与恢复

防止系统崩溃导致的数据丢失。

事务消息

在需要保证数据一致性的场景中,合理使用事务消息。

消息确认与重试

合理设置消息确认机制和重试策略。如果本次无法处理,一定再抛回去。建议不要先确认再处理,万一确认后,本机又无法处理,消息就丢失了。

5. 支付系统应用案例

消息中间件在支付系统中核心有几个核心应用场景:

  1. 流量的削峰填谷。尤其是支付交易。
  2. 系统应用间的解耦。比如支付成功后,渠道网关发出支付成功消息,由支付引擎和账务分别监听。
  3. 事务消息。
  4. 离线数据同步。有些公司使用离线库来做,有些公司直接抛消息。比如实时库根据用户来分库分表,离线库要根据商户来聚合等。

基本上,消息中间件在支付系统中无所不在。

6. JAVA版的示例代码

先声明,以下代码纯演示,生产环境需要考虑更多因素。

比如支付场景下,接收请求后,先放到队列,然后使用单独的消费线程去消费。以下是简单示例。

1. 添加依赖

首先,你需要在项目的 pom.xml 文件中添加 RocketMQ 的依赖:

<dependencies><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5.1.4</version></dependency>
</dependencies>

确保使用最新版本的依赖。

2. 创建生产者 (Producer)

创建一个生产者以发送消息到 RocketMQ 服务器:

public class PayServiceImpl implements PayService {@Autowiredprivate MQProducer mqProducer;public PayOrder pay(PayRequest request) {PayOrder payOrder = buildPayOrder(request);// 前置处理,比如校验、保存DB等... ...// 发送到队列Message msg = buildMessage(payOrder);mqProducer.send(msg);// 前置处理... ...return payOrder;}public boolean processPay(PayOrder payOrder) {// 外发处理... ...}
}

3. 创建消费者 (Consumer)

创建一个消费者来接收从 RocketMQ 发送的消息:

public class PayConsumerServiceImpl implements PayConsumerService {@Autowiredprivate MQConsumer mqConsumer;@Autowiredprivate PayService payService;@Postconstructpublic void init() {mqConsumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {payService.processPay(buildPayOrder(msg);return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;});}
}

再次声明,上述代码纯演示,在生产环境中,需要考虑更复杂的场景和错误处理机制。

7. 结束语

通过使用分布式消息中间件进行并发流量控制,支付系统可以更有效地应对高并发场景。能很好地提高系统整体的稳定性和可靠性,毕竟瞬间的大流量被缓冲到了消息中间件里。

但有些场景无法使用消息中间件,比如要求整个集群低到1TPS,又或者对接了外部上百个渠道,每个渠道要求不一样,有些要求最高20TPS,有些最高100TPS,使用消息中间件不好实现,就需要前面文章介绍的手撸一个漏桶或令牌桶。

下一篇聊聊阿里开源的流量控制与熔断利器:Sentinel。

8.精选

专栏地址百图解码支付系统设计与实现
《百图解码支付系统设计与实现》专栏介绍
《百图解码支付系统设计与实现》专栏大纲及文章链接汇总(进度更新于2023.1.15)
领域相关(部分)
支付行业黑话:支付系统必知术语一网打尽
跟着图走,学支付:在线支付系统设计的图解教程
图解收单平台:打造商户收款的高效之道
图解结算平台:准确高效给商户结款
图解收银台:支付系统承上启下的关键应用
图解支付引擎:资产流动的枢纽
图解渠道网关:不只是对接渠道的接口(一)

技术专题(部分)
交易流水号的艺术:掌握支付系统的业务ID生成指南
揭密支付安全:为什么你的交易无法被篡改
金融密语:揭秘支付系统的加解密艺术
支付系统日志设计完全指南:构建高效监控和问题排查体系的关键基石
避免重复扣款:分布式支付系统的幂等性原理与实践
支付系统的心脏:简洁而精妙的状态机设计与核心代码实现
精确掌控并发:固定时间窗口算法在分布式环境下并发流量控制的设计与实现
精确掌控并发:滑动时间窗口算法在分布式环境下并发流量控制的设计与实现

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

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

相关文章

MiniTab的相关性统计

相关概述 相关可以度量两个变量之间关联的强度和方向。可以在以下两种相关方法之间进行选择&#xff1a;Pearson 积矩相关和 Spearman 秩次相关。Pearson 相关&#xff08;又称为 r&#xff09;是最常见的方法&#xff0c;它度量两个连续变量之间的线性关系。 如果变量之间的…

通讯录项目的实现以及动态顺序表(基于顺序表)

首先我们要知道什么是顺序表: 顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝,顺序表分为静态顺序表(使⽤定⻓数组存储元素)和动态顺序表(按需申请) 静态顺序表缺点: 空间给少了不够⽤,给多了造成空间浪费 拿出来我之前以及写好了的顺序表的代码:…

SQL SERVER无法连接到服务器解决过程记录

很久没用sql server了&#xff0c;这几天打算更新SQL SERVER数据库&#xff1a;SQL看这一篇就看够了&#xff08;附详细代码及截图&#xff09; 这篇文章&#xff0c;发现连接不上服务器。 找一下解决办法。 一、打开服务界面 在键盘上按“WINR”快捷键&#xff0c;打开运行…

rust使用protobuf

前言 c,java,go 等直接是用 &#xff0c;具体就不说了&#xff0c;这章主要讲述rust 使用protobuf 这章主要讲述2种 1 > protoc protoc-gen-rust plugin 2> protoc prost-build 1&#xff1a;环境 win10 rustrover64 25-2 下载地址 https://github.com/protocolbu…

简单实用的恒温控制器

工作原理如下&#xff1a;ST是WTQ-288型电接点压力式温度计&#xff0c;当恒温箱内的温度降低到下限时&#xff0c;ST的指针与下限接点接触&#xff0c;双向可控硅通过R被强制触发导通&#xff0c;接通加热器RL的电源&#xff0c;于是恒温箱内温度上升。ST的指针转动&#xff0…

插入排序(一)——直接插入排序与希尔排序

目录 一.前言 二.排序的概念及其运用 1.1排序的概念 1.2 常用排序算法 三.常用排序算法的实现 3.1 插入排序 3.1.1 基本思想 3.1.2 直接插入排序 3.1.3 希尔排序&#xff08;缩小增量排序&#xff09; 四.全部代码 sort.c sort.h test.c 五.结语 一.前言 本文我们…

航空飞行器运维VR模拟互动教学更直观有趣

传统的二手车鉴定评估培训模式存在实践性不强、教学样本不足、与实际脱节等一些固有的不足。有了VR虚拟仿真技术的加持&#xff0c;二手车鉴定评估VR虚拟仿真实训系统逐渐进入实训领域&#xff0c;为院校及企业二手车检测培训提供了全新的解决方案。 高职院校汽车专业虚拟仿真实…

DC-3靶机刷题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1-P5ezyt5hUbmmGMP4EI7kw?pwdrt2c 提取码&#xff1a;rt2c 参考&#xff1a; http://t.csdnimg.cn/hhPi8https://www.vulnhub.com/entry/dc-32,312/ 官网http://t.csdnimg.cn/5mVZ7DC-3 (1).pdfhttps://…

模具制造企业ERP系统有哪些?企业怎么选型适配的软件

模具的生产管理过程比较繁琐&#xff0c;涵盖接单报价、车间排期、班组负荷评估、库存盘点、材料采购、供应商选择、工艺流转、品质检验等诸多环节。 有些采用传统管理手段的模具制造企业存在各业务数据传递不畅、信息滞后、不能及时掌握订单和车间生产情况&#xff0c;难以对…

【CF比赛记录】 —— Codeforces Round 920 (Div. 3)(A、B、C、D)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;CF比赛记录 &#x1f48c;其他专栏&#xff1a; &#x1f534;每日一题 &#x1f7e1; cf闯关练习 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓…

【ARMv8M Cortex-M33 系列 7.1 -- xPSR | CFSR | HFSR | BFAR | MMFAR 寄存器】

文章目录 问题背景Cortex-M33 Fault 寄存器介绍xPSR (程序状态寄存器)CFSR (可配置故障状态寄存器)HFSR (硬件故障状态寄存器)BFAR (总线故障地址寄存器)MMFAR (内存管理故障地址寄存器) 问题背景 由于在RA4M2&#xff08;Cortex-M33&#xff09;移植RT-Thread OS的时候遇到了…

第十五届蓝桥杯单片机组——串口通信UART

文章目录 一、什么是串口通信二、UART重要参数三、利用STC-ISP生成初始化代码四、使用UART发送和接收数据 一、什么是串口通信 微控制器与外部设备的数据通信&#xff0c;根据连线结构和传送方式的不同&#xff0c;可以分为两种:并行通信和串行通信。   并行通信:指数据的各位…

亚马逊云科技 WAF 部署小指南(六)追踪 Amazon WAF Request ID,排查误杀原因

众所周知&#xff0c;中国是全球制造业的巨大力量&#xff0c;许多中国企业通过 2B 电商平台网站进行商品销售和采购。在这些电商平台上&#xff0c;Web 应用防火墙&#xff08;WAF&#xff09;成为不可或缺的安全工具。然而&#xff0c;WAF 也可能导致误杀问题。一旦误杀发生&…

计算机毕设thinkphp+mysql+_vue房屋租赁系统h3sem

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp5 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin 房屋租赁管理系统有不同的用户角色。不同的用户权限对应不…

【办公类-21-03】20240119 提取不连续的男女学号 set()和list法

背景需求&#xff1a;了解班级幼儿性别比例 查看点名册&#xff0c;发现中4班最初的学号是按照先男后女的方式排列&#xff0c;但是随着幼儿转出&#xff0c;空出一些学号&#xff0c;于是新插班的孩子就插入空的学号&#xff0c;空格插完了&#xff0c;就排在学号尾部。 我想…

Docker Consul详解与部署示例

目录 Consul构成 Docker Consul 概述 Raft算法 服务注册与发现 健康检查 Key/Value存储 多数据中心 部署模式 consul-template守护进程 registrator容器 consul服务部署&#xff08;192.168.41.31&#xff09; 环境准备 搭建Consul服务 查看集群信息 registrato…

YOLOv5改进 | 主干篇 | 华为GhostnetV1一种移动端的专用特征提取网络

一、本文介绍 本文给大家带来的改进机制是华为移动端模型Ghostnetv1,华为GhostnetV1一种移动端的专用特征提取网络,旨在在计算资源有限的嵌入式设备上实现高性能的图像分类。GhostNet的关键思想在于通过引入Ghost模块,以较低的计算成本增加了特征图的数量,从而提高了模型的…

深度剖析Spring循环依赖(实战Bug)

目录 前言1. 问题所示2. 原理分析3. 基本知识4. Lazy注解 前言 通过实战更好的回馈问题&#xff0c;意识更加深刻 起因是我出现如下问题之后&#xff0c;才意识到中了Spring的循环依赖了&#xff01; 1. 问题所示 在执行项目的时候&#xff0c;出现如下问题&#xff0c;问题…

面试之Glide如何绑定Activity的生命周期

Glide绑定Activity生命周期 Glide.with() 下面都是它的重载方法&#xff0c;Context&#xff0c;Activity&#xff0c;FragmentActivity, Fragment, android.app.Fragment fragment,View都可以作为他的参数&#xff0c;内容大同小异&#xff0c;都是先getRetriever&#xff0…

016-Vue-黑马2023:前后端分离开发(在线接口文档),前端工程化、Element、vue编写一个完成页面、Vue路由、vue打包部署到nginx

第三节 前后端分离开发 1、介绍 开发模式 前后端混合开发&#xff1a;传统开发模式 前后端分离开发&#xff1a;当前最为主流的开发模式 页面原型需求案例&#xff1a;分析出接口文档 离线开发文档示例&#xff1a; 2、YAPI&#xff08;官网已停用&#xff09; 202…