当前位置: 首页 > news >正文

服务保护sentinel

线程隔离

- 线程池隔离:给每个服务调用业务分配一个线程池,利用线程池本身实现隔离效果。
- 信号量隔离:不创建线程池,而是计数器模式,记录业务使用的线程数量,达到信号量上限时,禁止新的请求。

这两种隔离方式都是用于保护系统在高负载情况下不受影响的方法。线程池隔离和信号量隔离都是常见的微服务架构中的隔离策略。

线程池隔离是通过为每个服务调用分配一个专门的线程池来实现隔离。这意味着每个服务都有自己的一组线程可供使用,这些线程不会被其他服务所共享。这种方式可以确保某个服务的高负载不会影响到其他服务,因为每个服务都有自己的线程资源。这种方式的优势在于能够很好地控制每个服务的资源使用情况,但缺点是需要消耗更多的系统资源来维护多个线程池

信号量隔离则是一种更轻量级的隔离方式,它通过限制并发请求的数量来保护系统免受高负载的影响。当达到信号量上限时,系统会拒绝新的请求,直到之前的请求完成并释放出资源。这种方式的优势在于相对较少的资源消耗,但可能会导致请求被拒绝,需要合理设置信号量上限以平衡系统的负载和可用性。

在选择隔离方式时,需要根据具体的业务需求和系统架构来进行权衡。通常情况下,线程池隔离适用于需要更精细控制资源分配的场景,而信号量隔离适用于需要简单有效地限制并发请求数量的场景。

基于这两种写一下java实现方法

当涉及Java实现时,你可以使用Java的并发工具来实现线程池隔离和信号量隔离。以下是使用Java的Executor框架和Semaphore类的简单示例:

线程池隔离的Java实现:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolIsolationExample {
    public static void main(String[] args) {
        // 创建一个固定大小的线程池,每个服务调用分配一个线程池
        ExecutorService service1ThreadPool = Executors.newFixedThreadPool(10);
        ExecutorService service2ThreadPool = Executors.newFixedThreadPool(10);

        // 向线程池提交任务
        service1ThreadPool.submit(() -> {
            // 执行服务1的业务逻辑
        });

        service2ThreadPool.submit(() -> {
            // 执行服务2的业务逻辑
        });

        // 关闭线程池
        service1ThreadPool.shutdown();
        service2ThreadPool.shutdown();
    }
}

信号量隔离的Java实现:

import java.util.concurrent.Semaphore;

public class SemaphoreIsolationExample {
    public static void main(String[] args) {
        // 创建信号量,限制并发请求的数量
        Semaphore semaphore = new Semaphore(10); // 假设限制为10个并发请求

        // 在处理请求之前尝试获取信号量
        try {
            semaphore.acquire(); // 获取信号量,如果达到上限,会阻塞直到有信号量可用
            // 执行业务逻辑
        } catch (InterruptedException e) {
            // 处理中断异常
        } finally {
            semaphore.release(); // 释放信号量
        }
    }
}

以上是简单的示例代码,实际场景中需要根据具体需求进行更加完善的实现,并考虑异常处理、线程池的生命周期管理、资源的合理分配等问题。

滑动窗口算法

在熔断功能中,需要统计异常请求或慢请求比例,也就是计数。在限流的时候,要统计每秒钟的QPS,同样是计数。可见计数算法在熔断限流中的应用非常多。sentinel中采用的计数器算法就是滑动窗口计数算法。

移动窗口算法通常用于监控一段时间内事件的发生频率或者比例,比如成功请求和失败请求的比例、异常事件的频率等。在移动窗口算法中,我们使用一个固定大小的窗口来追踪一段时间内的事件情况,通过移动窗口来计算事件的比例或者频率。

对于请求监控来说,我们可以使用移动窗口算法来监控一段时间内的请求失败率。每次有新的请求到达时,我们会根据请求的结果(成功或失败)和时间戳来更新窗口中的数据,然后根据窗口中的数据来计算失败请求的比例。这个比例可以帮助我们判断当前系统的稳定性,以及是否需要采取一些措施比如熔断来保护系统免受过多失败请求的影响。

在实际的应用中,移动窗口算法可以帮助我们快速地捕捉到系统的异常情况,并根据异常情况来做出相应的调整和处理。这种算法在微服务架构中的容错机制中经常被使用,比如用于熔断、限流等场景。

import java.util.ArrayDeque;
import java.util.Queue;

public class Request {
    private long timestamp;
    private boolean isFailed;

    public Request(long timestamp, boolean isFailed) {
        this.timestamp = timestamp;
        this.isFailed = isFailed;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public boolean isFailed() {
        return isFailed;
    }
}

public class FailureRateMonitor {
    private final long interval;
    private final int n;
    private final long timeInterval;
    private final Queue<Request> requests;

    public FailureRateMonitor(long interval, int n) {
        this.interval = interval;
        this.n = n;
        this.timeInterval = interval / n;
        this.requests = new ArrayDeque<>();
    }

    public void addRequest(boolean isFailed, long currentTime) {
        evictOldRequests(currentTime);
        requests.add(new Request(currentTime, isFailed));
    }

    public double getFailureRate(long currentTime) {
        evictOldRequests(currentTime);
        if (requests.isEmpty()) {
            return 0.0;
        } else {
            long failureCount = requests.stream().filter(r -> r.isFailed()).count();
            return (double) failureCount / requests.size();
        }
    }

    private void evictOldRequests(long currentTime) {
        long startTime = currentTime - interval;
        while (!requests.isEmpty() && requests.peek().getTimestamp() < startTime) {
            requests.poll();
        }
    }

    public static void main(String[] args) {
        FailureRateMonitor monitor = new FailureRateMonitor(1000, 2);
        long currentTime = System.currentTimeMillis();
        for (int i = 0; i < 10; i++) {
            boolean isFailed = i % 3 == 0;
            monitor.addRequest(isFailed, currentTime + i * 300);
            System.out.println("Current failure rate: " + monitor.getFailureRate(currentTime + i * 300));
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

漏桶算法

import lombok.extern.slf4j.Slf4j;
 
import java.util.concurrent.atomic.AtomicInteger;
 
/**
 * @author YY-帆S
 * @Date 2024/3/26 22:46
 */
@Slf4j
public class LeakyBucketRateLimiter {
 
    private AtomicInteger bucketLevel; // 当前桶中的请求数量
    private int capacity; // 桶的容量
    private long leakRate; // 漏水速率,单位:请求/秒
    private long lastLeakTime; // 上一次漏水的时间戳
 
    public LeakyBucketRateLimiter(int capacity, long leakRate) {
        this.capacity = capacity;
        this.leakRate = leakRate;
        this.bucketLevel = new AtomicInteger(0);
        this.lastLeakTime = System.currentTimeMillis();
    }
 
    public synchronized boolean tryAcquire() {
        // 获取当前时间
        long currentTime = System.currentTimeMillis();
        //流出时间
        long elapsedTime = currentTime - lastLeakTime;
        //计算流出的水量 = (当前时间 - 上次时间) * 出水速率
        long leaked = (long) (elapsedTime * (leakRate / 1000.0));
 
        //只有有流出水才更新时间戳,不然会漏不出水
        if (leaked > 0) {
            //计算桶内水量 = 桶内当前水量 - 流出的水量
            int newLevel = Math.max(0, bucketLevel.get() - (int) leaked);
            bucketLevel.set(newLevel);
 
            //更新上次漏水时间戳
            lastLeakTime = currentTime;
        }
 
        // 尝试将请求加入桶中
        if (bucketLevel.get() < capacity) {
            bucketLevel.incrementAndGet();
            return true;
        } else {
            return false;
        }
    }
 
    public static void main(String[] args) throws InterruptedException {
        LeakyBucketRateLimiter limiter = new LeakyBucketRateLimiter(1, 1); // 容量为1,漏水速率为1请求/秒
 
        // 模拟发送请求
        for (int i = 0; i < 20; i++) {
            new Thread(() -> {
                if (limiter.tryAcquire()) {
                    log.info(Thread.currentThread().getName() + " 获得了许可,执行操作。");
                } else {
                    log.info(Thread.currentThread().getName() + " 请求被拒绝。");
                }
            }).start();
            //模拟执行时间
            Thread.sleep(500);
        }
    }
 
 
}

相关文章:

服务保护sentinel

线程隔离 - 线程池隔离&#xff1a;给每个服务调用业务分配一个线程池&#xff0c;利用线程池本身实现隔离效果。 - 信号量隔离&#xff1a;不创建线程池&#xff0c;而是计数器模式&#xff0c;记录业务使用的线程数量&#xff0c;达到信号量上限时&#xff0c;禁止新的请求。…...

【ubuntu】Ubuntu20.04安装中文百度输入法

1.download 百度Linux输入法-支持全拼、双拼、五笔 2.unzip unzip Ubuntu_Deepin-fcitx-baidupinyin-64.zip 3.setting 3.1 setting fcitx sudo apt install aptitude sudo aptitude install fcitx-bin fcitx-table fcitx-config-gtk fcitx-frontend-all sudo aptitude in…...

蓝桥杯【物联网】零基础到国奖之路:十八. 扩展模块之光敏和AS312

蓝桥杯【物联网】零基础到国奖之路:十八.扩展模块之光敏和AS312 第一节 硬件解读第二节 CubeMX配置第二节 代码 第一节 硬件解读 光敏和AS312如下图&#xff1a; 光敏电阻接到了扩展模块的5号引脚&#xff0c;5号引脚接了2个电阻&#xff0c;R8和光敏电阻。我们通过ADC读取这…...

如何在微信小程序中实现分包加载和预下载

如何在微信小程序中实现分包加载和预下载 概述 微信小程序提供了分包加载和预下载功能&#xff0c;这有助于优化应用的加载时间&#xff0c;提升用户体验。本文将详细介绍如何在微信小程序中配置分包加载和预下载。 步骤一&#xff1a;配置分包加载 修改app.json文件&#x…...

初识TCP/IP协议

回顾上文 来回顾一下TCP协议的特性&#xff0c;有一道比较经典的题&#xff1a;如何使用UDP实现可靠传输&#xff0c;通过应用程序的代码&#xff0c;完成可靠传输的过程&#xff1f; 原则&#xff0c;TCO有啥就吹啥&#xff0c;引入滑动窗口&#xff0c;引入流量控制&#x…...

使用 classification_report 评估 scikit-learn 中的分类模型

介绍 在机器学习领域&#xff0c;评估分类模型的性能至关重要。scikit-learn 是一个功能强大的 Python 机器学习工具&#xff0c;提供了多种模型评估工具。其中最有用的函数之一是 classification_report&#xff0c;它可以全面概述分类模型的关键指标。在这篇文章中&#xff…...

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十)高翔书中的细节:参考链接;卫星导航;ESKF

一、 参考链接 我认真查找了好多地方:结果在最后一页。 作者GITHUB链接如下: https://github.com/gaoxiang12/slam_in_autonomous_driving 全书所有参考链接 :如下 1 https://www.sae.org/standards/content/j3016_202104 2 http://www.evinchina.com/articleshow-217.htm…...

【在Python中爬取网页信息并存储】

在Python中爬取网页信息并存储的过程通常涉及几个关键步骤&#xff1a;发送HTTP请求、解析HTML内容、提取所需数据&#xff0c;以及将数据存储到适当的格式中&#xff08;如文本文件、CSV文件、数据库等&#xff09;。以下是一个更详细的指南&#xff0c;包括示例代码&#xff…...

ESP32 Bluedroid 篇(1)—— ibeacon 广播

前言 前面我们已经了解了 ESP32 的 BLE 整体架构&#xff0c;现在我们开始实际学习一下Bluedroid 从机篇的广播和扫描。本文将会以 ble_ibeacon demo 为例子进行讲解&#xff0c;需要注意的一点是。ibeacon 分为两个部分&#xff0c;一个是作为广播者&#xff0c;一个是作为观…...

【通配符】粗浅学习

1 背景说明 首先要注意&#xff0c;通配符中的符号和正则表达式中的特殊符号具备不同的匹配意义&#xff0c;例如&#xff1a;*在正则表达式中表示里面是指匹配前面的子表达式0次或者多次&#xff0c;而在通配符领域则是表示代表0个到无穷个任意字符。 此外&#xff0c;要注意…...

Spring MVC 常用注解

目录 基础概念 常用注解介绍 基础概念 1、MVC &#xff1a;代表一种软件架构设计思想&#xff0c;通俗的理解&#xff1a;客户端发送请求到后台服务器的Controller(C)&#xff0c;控制器调用Model(M)来处理业务逻辑&#xff0c;处理完成后&#xff0c;返回处理后的数据到Vie…...

水泵模块(5V STM32)

目录 一、介绍 二、传感器原理 1.尺寸介绍 2.继电器控制水泵电路原理图 三、程序设计 main.c文件 bump.h文件 bump.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 水泵模块(bump)通常是指用于液体输送系统的组件&#xff0c;它负责将水或其他流体从低处提…...

需求6:如何写一个后端接口?

这两天一直在对之前做的工作做梳理总结&#xff0c;不过前两天我都是在总结一些bug的问题。尽管有些bug问题我还没写文章&#xff0c;但是&#xff0c;我今天不得不先停下对bug的总结了。因为在国庆之后&#xff0c;我需要自己开发一个IT资产管理的功能&#xff0c;这个功能需要…...

《Linux从小白到高手》理论篇(五):文件权限控制及文件操作相关的命令

本篇介绍Linux文件权限控制及文件操作相关的命令&#xff0c;看完本文&#xff0c;有关Linux文件权限控制及文件操作相关的常用命令你就掌握了99%了。 文件权限 在介绍文件权限之前先来复习下Linux的文件类型&#xff0c;始终记住那句话&#xff1a;Linux系统下&#xff0c;一…...

异常场景分析

优质博文&#xff1a;IT-BLOG-CN 为了防止黑客从前台异常信息&#xff0c;对系统进行攻击。同时&#xff0c;为了提高用户体验&#xff0c;我们都会都抛出的异常进行拦截处理。 一、异常处理类 Java把异常当做是破坏正常流程的一个事件&#xff0c;当事件发生后&#xff0c;…...

Leetcode: 0001-0010题速览

Leetcode: 0001-0010题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer&#xff08;第 2 版&#xff09;》、《程序员面试金典&#xff08;第 6 版&#xff09;》题解 遵从开源协议为知识共享 版权归属-相同方式…...

计算机的错误计算(一百一十二)

摘要 计算机的错误计算&#xff08;六十三&#xff09;与&#xff08;六十八&#xff09;以及&#xff08;六十九&#xff09;分别探讨了大数与 附近数以及 附近数 的余切函数的计算精度问题。本节讨论余切序列&#xff08;即迭代 &#xff09;的计算精度问题。 余切序列是指…...

C++基础(7)——STL简介及string类

目录 1.STL简介 1.1什么是 1.2STL的历史版本 1.3STL的六大组件 ​编辑 1.4有用的网址 2.string类 2.1string的多种定义方式 2.2string的插入 2.2.1尾插&#xff08;push_back&#xff09; 2.2.2insert插入 2.3拼接&#xff08;append&#xff09; 2.4删除 2.4.1尾…...

配置Nginx以支持通过HTTPS回源到CDN

要配置Nginx以支持通过HTTPS回源到CDN&#xff0c;你需要确保Nginx已正确配置SSL&#xff0c;并且能够处理来自CDN的HTTPS请求。以下是一个简化的Nginx配置示例&#xff0c;它配置了SSL并设置了代理服务器参数以回源到CDN&#xff1a; server {listen 443 ssl;server_name you…...

yolov10+strongsort的目标跟踪实现

此次yolov10deepsort不论是准确率还是稳定性&#xff0c;再次超越了之前的yolodeepsort系列。 yolov10介绍——实时端到端物体检测 YOLOv10 是清华大学研究人员在 UltralyticsPython 清华大学的研究人员在 YOLOv10软件包的基础上&#xff0c;引入了一种新的实时目标检测…...

C# 字符与字符串

本课要点&#xff1a; 1、字符类Char的使用 2、字符串类String的使用 3、可变字符串****StringBuilder 4、常见错误 一 何时用到字符与字符串 问题&#xff1a; 输出C#**课考试最高分&#xff1a;**98.5 输出最高分学生姓名&#xff1a;张三 输出最高分学生性别&#x…...

在Ubuntu 16.04上使用LEMP安装WordPress的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 WordPress 是互联网上最流行的 CMS&#xff08;内容管理系统&#xff09;。它允许您在 MySQL 后端和 PHP 处理的基础上轻松设置灵…...

显示器放大后,大漠识图识色坐标偏移解决方法

原因分析&#xff1a; 显示器分辨率较高&#xff0c;DPI设置放大125% or 150% or 200%&#xff0c;游戏打开时也会默认会根据显示器的放大比例自行放大&#xff0c;但是大漠综合管理工具抓图不会放大&#xff1b; 解决方法&#xff1a; 1、大漠综合管理…...

C++容器之list基本使用

目录 前言 一、list的介绍&#xff1f; 二、使用 1.list的构造 2.list iterator的使用 3.list capacity &#x1f947; empty &#x1f947;size 4.list element access &#x1f947; front &#x1f947; back 5.list modifiers &#x1f947; push_front &#x1f947; po…...

Redis-哨兵

概念 Redis Sentinel 相关名词解释 注意: 哨兵机制不负责存储数据,只是对其它的redis-server进程起到监控的作用哨兵节点,也会搞一个集合,防止一个挂了 ⼈⼯恢复主节点故障 用户监控: 实际开发中,对于服务器后端开发,监控程序,是很重要的 服务器长期运行,总会有一些意外,…...

Pikachu-Sql-Inject - 基于时间的盲注

基于时间的盲注&#xff1a; 就是前端的基于time 的盲注&#xff0c;什么错误信息都看不到&#xff0c;但是还可以通过特定的输入&#xff0c;判断后台的执行时间&#xff0c;从而确定注入。 mysql 里函数sleep() 是延时的意思&#xff0c;sleep(10)就是数据库延时10 秒返回内…...

JAVA开源项目 旅游管理系统 计算机毕业设计

本文项目编号 T 063 &#xff0c;文末自助获取源码 \color{red}{T063&#xff0c;文末自助获取源码} T063&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…...

景联文科技入选《2024中国AI大模型产业图谱2.0版》数据集代表厂商

近日&#xff0c;大数据产业领域头部媒体数据猿携手上海大数据联盟联合发布了备受瞩目的《2024中国AI大模型产业图谱2.0版》。以大数据与AI为代表的智能技术为主要视角&#xff0c;聚焦全产业链&#xff0c;为业内提供更为专业直观的行业指导。 景联文科技凭借高质量数据集&…...

【C语言】内存函数的使用和模拟实现

文章目录 一、memcpy的使用和模拟实现二、memmove的使用和模拟实现三、memset的使用四、memcmp的使用 一、memcpy的使用和模拟实现 在之前我们学习了使用和模拟实现strncpy函数&#xff0c;它是一个字符串函数&#xff0c;用来按照给定的字节个数来拷贝字符串&#xff0c;那么问…...

在WPF中实现多语言切换的四种方式

在WPF中有多种方式可以实现多语言&#xff0c;这里提供几种常用的方式。 一、使用XML实现多语言切换 使用XML实现多语言的思路就是使用XML作为绑定的数据源。主要用到XmlDataProvider类. 使用XmlDataProvider.Source属性指定XML文件的路径或通过XmlDataProvider.Document指定…...

百度推广常州/青岛谷歌优化公司

微软入华多年来一直是个争议的存在&#xff0c;业务压力重重又要面对本土互联网企业的竞争&#xff0c;种种因素使得这一互联网巨鳄在华收益惨淡。近期&#xff0c;微软则一改依赖版权的惯性&#xff0c;Windows 10开放免费升级、小冰回归微信、与多家互联网企业签订协议……柔…...

网站开发技术及开发环境/crm客户管理系统

在数学中&#xff0c;矩阵的“谱半径”是指其特征值的模集合的上确界。换言之&#xff0c;对于给定的n个复数空间的特征值{a1b1i, ..., anbni}&#xff0c;它们的模为实部与虚部的平方和的开方&#xff0c;而“谱半径”就是最大模。 现在给定一些复数空间的特征值&#xff0c;请…...

做直销上哪个网站好/优化方案怎么写

添加强类型化ReportDocument时发生错误&#xff0c;报表可能已损坏或无效 可能书写SQL语句时出错&#xff0c; 如SELECT T_BJ_Inventory.Inventory_No,to_char(Start_Time,yyyy-MM-dd) as Start_Time。。。 如果写成SELECT T_BJ_Inventory.Inventory_No,Start_Time。。。就出错…...

做专业网站/中国足球世界排名

java ee如果您还记得我写的题为《 Java EE 8&#xff1a;当前状态是什么》的文章&#xff0c;很明显&#xff0c;Java EE的发展在过去几个月中肯定放慢了。 肯定有一些Java EE下的JSR比其他JSR具有更多的活动&#xff0c;但是自JavaOne 2015以来&#xff0c;整个Java EE几乎没有…...

品牌网站建设 磐石网络的确好/网址查询服务器地址

1、IPAD中papership和电脑端无法同步 解决方法&#xff1a;将这个文件复制到目录下 然后在iPad里重新verify一下https://junlu.club:5006/zhangwei 2、添加标签 然后再左侧指派颜色 3、插入文献到word中 (3条消息) 标准论文参考文献添加方法——Zotero入门使用教程_MISAYAON…...

适合女孩做的网站/百度用户客服电话

虽然将 .idea/* 加入了.gitignore,但是.idea仍然会被跟踪&#xff0c;这是因为在创建gitignore 的时候&#xff0c;idea 文件夹已经被跟踪。 解决办法&#xff1a; git rm -rf .idea; git commit -m "delete .idea"; git push origin master...