RocketMQ 的保险丝| Sentinel 如何通过匀速请求和冷启动来保障服务的稳定性

本文主要是介绍RocketMQ 的保险丝| Sentinel 如何通过匀速请求和冷启动来保障服务的稳定性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是围绕 Sentinel 的使用场景、技术对比和实现、开发者实践等维度推出的系列文章的第二篇。


第一篇:Dubbo 的流量防卫兵 | Sentinel如何通过限流实现服务的高可用性 - 链接


本期将通过 Sentinel 的匀速请求和冷启动的特性,处理消息场景中经常会遇到的消息突刺的情况,通过“削峰填谷”,来打造服务的稳定性。


» 8月26日,Aliware Open Source 将首次在成都举办 Apache Dubbo 的meetup活动,Dubbo 、Sentinel和 Nacos 的小哥哥和小姐姐都会在现场进行技术分享,欢迎成都的朋友报名参加我们的活动喔,公众号后台发送“成都meetup”,获取报名链接。


一、需求场景描述

在 RocketMQ 中,当消费者去消费消息的时候,无论是通过 pull 的方式还是 push 的方式,都可能会出现大批量的消息突刺。如果此时要处理所有消息,很可能会导致系统负载过高,影响稳定性。但其实可能后面几秒之内都没有消息投递,若直接把多余的消息丢掉则没有充分利用系统处理消息的能力。


640?wx_fmt=png

上图中红色的部分代表超出消息处理能力的部分


我们可以看到消息突刺往往都是瞬时的、不规律的,其后一段时间系统往往都会有空闲资源。我们希望把红色的那部分消息平摊到后面空闲时去处理,这样既可以保证系统负载处在一个稳定的水位,又可以尽可能地处理更多消息,这时候我们可以通过 Sentinel匀速请求的特性 ,来为 RocketMQ 削峰填谷,保驾护航。


二、Apache RocketMQ 一键接入 Sentinel

1、实时监控:

Sentinel 提供 API 用于获取实时的监控信息,使用时可以添加以下依赖:

API 接入文档:

https://github.com/alibaba/Sentinel/wiki/实时监控


为了便于使用,Sentinel 还提供了一个控制台(Dashboard)用于配置规则、查看监控、机器发现等功能。我们只需要按照 Sentinel 控制台文档 启动控制台,然后给对应的应用程序添加相应参数并启动即可(注意客户端需要添加上面的 transport 依赖)。

控制台文档:

https://github.com/alibaba/Sentinel/wiki/控制台


这样在启动 Consumer 示例以后,就可以在 Sentinel 控制台中找到我们的应用了。可以很方便地在控制台中配置限流规则:

640?wx_fmt=png

或者查看实时监控(这里对应匀速模式,图中标注的 b_qps 代表每秒被 block 的数目,下同):

640?wx_fmt=png

对比普通限流模式下的监控图线:

640?wx_fmt=png

可以看到普通限流模式下每次流量突刺都只能在一瞬间处理少量消息,其它请求都会立即被限掉。而匀速模式下可以把突刺的部分平滑到后面的时间中处理,每次消息量激增时都可以处理更多的消息。两种模式对比说明匀速模式下消息处理能力得到了更好的利用。

2、一键接入

在结合 RocketMQ Client 使用 Sentinel 时,用户首先需要引入 sentinel-core 依赖,由于 RocketMQ Client 未提供相应拦截机制,而且每次收到都可能是批量的消息,因此用户在处理消息时需要手动进行埋点。在 RocketMQ 的场景中,用户可以根据不同的 group 和不同的 topic 分别设置限流规则,开启匀速器模式,并在处理消息时埋点,即可以以固定的速率处理消息。然后在处理消息的时候手动埋点(以 pull consumer 为例):


PullConsumerDemo地址:https://github.com/alibaba/Sentinel/blob/master/sentinel-demo/sentinel-demo-rocketmq/src/main/java/com/alibaba/csp/sentinel/demo/rocketmq/PullConsumerDemo.java

下面我们来看一下具体的运行效果。首先根据 RocketMQ 的文档来在本地启动 RocketMQ,然后向对应 group 的对应 topic 发送 1000 条消息,然后按上面的例子配限流规则,启动消费者应用。可以看到消息消费的速率是匀速的,大约每 200 ms 消费一条消息。同时不断有排队的处理任务完成,超出等待时长的处理请求直接被拒绝。注意在处理请求被拒绝的时候,需要根据需求决定是否需要重新消费消息。

如果不开启匀速模式,只是普通的限流模式,则只会同时处理 5 条消息,其余的全部被拒绝,即使后面的时间系统资源充足多余的请求也无法被处理,因而浪费了许多空闲资源。


三、Sentinel 基于 Apache RocketMQ 的最佳实践 

1、匀速器

借助 Sentinel 匀速请求的特性,可以把突然到来的大量请求以匀速的形式均摊,以固定的间隔时间让请求通过,以稳定的速度逐步处理这些请求,从而避免流量突刺造成系统负载过高。同时堆积的请求将会排队,逐步进行处理;当请求排队预计超过最大超时时长的时候则直接拒绝,而不是拒绝全部请求。

匀速器Demo 示例:

https://github.com/alibaba/Sentinel/wikii/限流---匀速器

比如在 RocketMQ 的场景下配置了匀速模式下请求 QPS 为 5,则会每 200 ms 处理一条消息,多余的处理任务将排队;同时设置了超时时间为 5s,预计排队时长超过 5s 的处理任务将会直接被拒绝。示意图如下:

640?wx_fmt=png


2、冷启动

除了匀速器,另一种在面对RocketMQ 场景下流量突增时来保障系统稳定性的的方式是冷启动。该方式主要用于系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮的情况。具体的例子参见 WarmUpFlowDemo。

匀速器Demo 示例:https://github.com/alibaba/Sentinel/blob/master/sentinel-demo/sentinel-demo-basic/src/main/java/com/alibaba/csp/sentinel/demo/flow/WarmUpFlowDemo.java

通常冷启动的过程系统允许通过的 QPS 曲线如下图所示:

640?wx_fmt=gif

通过前两期的分享,我们已经理解了 Sentinel 在 Dubbo和RocketMQ 这两个体系中的使用场景和实践方法,在下一周的第三期中,我们将对比Sentinel和传统的限流产品Hystrix,希望对开发者在进行限流产品的技术选型时有所裨益。


今日推文

点击下方图片即可阅读


»  Dubbo 的流量防卫兵| Sentinel如何通过限流实现服务的高可用性

640?wx_fmt=png

这篇关于RocketMQ 的保险丝| Sentinel 如何通过匀速请求和冷启动来保障服务的稳定性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/347538

相关文章

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,

linux服务之NIS账户管理服务方式

《linux服务之NIS账户管理服务方式》:本文主要介绍linux服务之NIS账户管理服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、所需要的软件二、服务器配置1、安装 NIS 服务2、设定 NIS 的域名 (NIS domain name)3、修改主

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转