基于木舟平台浅谈surging 的热点KEY的解决方法

news/2024/11/20 22:51:49/文章来源:https://www.cnblogs.com/fanliang11/p/18559532

 一、概述

      上篇文章介绍了基于surging的木舟平台如何构建起微服务 ,那么此篇文章将介绍基于木舟平台浅谈surging 的热点KEY的解决方法

      木舟 (Kayak) 是什么?

       木舟(Kayak)是基于.NET6.0软件环境下的surging微服务引擎进行开发的, 平台包含了微服务和物联网平台。支持异步和响应式编程开发,功能包含了物模型,设备,产品,网络组件的统一管理和微服务平台下的注册中心,服务路由,模块,中间服务等管理。还有多协议适配(TCP,MQTT,UDP,CoAP,HTTP,Grpc,websocket,rtmp,httpflv,webservice,等),通过灵活多样的配置适配能够接入不同厂家不同协议等设备。并且通过设备告警,消息通知,数据可视化等功能。能够让你能快速建立起微服务物联网平台系统。

      木舟kayal 平台开源地址:https://github.com/microsurging/

      surging 微服务引擎开源地址:https://github.com/fanliang11/surging(后面surging 会移动到microsurging进行维护)

 二、缓存热点Key的问题

  1. 什么是热点key的问题
    就是某个瞬间有大量的请求去访问Redis上某个固定的key,导致缓存击穿,请求都打到了DB上,压垮了缓存服务和DB服务,从而影响到服务的可用性;
  2. 怎么样会成为热点Key

          (1)、 QPS 集中访问频次占比比较高的会被称为热点Key,木舟平台会添加基于routepath访问频次统计,让技术人员查找出排名靠前的热点KEY,

        (2)、Value数据集合非常大导致带宽占用比较高会被称为热点KEY.

         3.热点KEY的危害

          (1)、占用带宽影响其它服务调用

          (2)、请求过大,降低了其它缓存调用性能

           (3)、缓存击穿,DB被压垮,引起业务雪崩。

三、基于surging 如何解决热点Key的问题

       1.基于MemoryCache缓存拦截

     访问频次比较高,数据不经常修改,而无需其它微服务共享调用的时候就可以使用MemoryCache进行缓存在本地,就比如木舟平台首页的产品,设备,设备消息统计,如下图

 你可以添加以下特性就能开启缓存拦截,Mode选择CacheTargetType.MemoryCache

        [ServiceCacheIntercept(CachingMethod.Get, Key = "GetProductStatistics", CacheSectionType = "ddlCache", EnableL2Cache = false, Mode = CacheTargetType.MemoryCache, Time = 1, EnableStageCache = true)]Task<ApiResult<ProductStatisticsModel>> GetProductStatistics();

删除的时候就可以使用CachingMethod.Remove,传入"GetProducts", "GetProductStatistics", 如果需要传入其它参数值就可以添加_{0}_{1} ,比如 GetProductsByName_{0}

        [ServiceCacheIntercept(CachingMethod.Remove, "GetProducts", "GetProductStatistics", CacheSectionType = "ddlCache", Mode = CacheTargetType.MemoryCache, EnableStageCache = true)][ServiceLogIntercept]Task<ApiResult<bool>> DeleteById(List<int> ids);

2. 基于redis 缓存

     访问频次比较高,数据不经常修改,但需其它微服务共享调用的时候就可以使用Redis进行缓存,就比如获取Token,就需要开启redis缓存拦截,可以在添加上添加,修改代码:Mode = CacheTargetType.Redis,如下图:

 

        [ServiceCacheIntercept(CachingMethod.Get, Key = "GetProductStatistics", CacheSectionType = "ddlCache", EnableL2Cache = false, Mode = CacheTargetType.Redis, Time = 1, EnableStageCache = true)]Task<ApiResult<ProductStatisticsModel>> GetProductStatistics();

 

3.二级缓存

访问频次比较高,数据会经常修改,Value数据集合非常大会导致占用带宽,这时候使用二级缓存是最适合的,因为大的数据集合会通过二级本地缓存读取,一级缓存存储标志位来管理二级缓存的失效,代码如下

        [Metadatas.ServiceCacheIntercept(Metadatas.CachingMethod.Get, Key = "GetUserId_{0}", CacheSectionType = "ddlCache", L2Key= "GetUserId_{0}",  EnableL2Cache = true, Mode = Metadatas.CacheTargetType.Redis, Time = 480,EnableStageCache =true)]

4. 缓存中间件的分片处理

缓存中间件使用了哈希一致性负载分流算法,这样就可以把不同的KEY分散到不同的服务节点上,也保证热点KEY的集中访问的问题,可以在cacheSettings配置文件中添加redis服务节点,配置文件代码如下:

{"CachingSettings": [{"Id": "ddlCache","Class": "Surging.Core.Caching.RedisCache.RedisContext,Surging.Core.Caching","InitMethod": "","Maps": null,"Properties": [{"Name": "appRuleFile","Ref": "rule","Value": "","Maps": null},{"Name": "dataContextPool","Ref": "ddls_sample","Value": "","Maps": [{"Name": "Redis","Properties": [{"Name": null,"Ref": null,"Value": "127.0.0.1:6379::1","Maps": null},{"Name": null,"Ref": null,"Value": "127.0.0.1:6379::1","Maps": null},{"Name": null,"Ref": null,"Value": "127.0.0.1:6379::1","Maps": null}]},{"Name": "MemoryCache","Properties": null}]},{"Name": "defaultExpireTime","Ref": "","Value": "120","Maps": null},{"Name": "connectTimeout","Ref": "","Value": "120","Maps": null},{"Name": "minSize","Ref": "","Value": "1","Maps": null},{"Name": "maxSize","Ref": "","Value": "10","Maps": null}]},{"Id": "userCache","Class": "Surging.Core.Caching.RedisCache.RedisContext,Surging.Core.Caching","InitMethod": "","Maps": null,"Properties": [{"Name": "appRuleFile","Ref": "rule","Value": "","Maps": null},{"Name": "dataContextPool","Ref": "ddls_sample","Value": "","Maps": [{"Name": "Redis","Properties": [{"Name": null,"Ref": null,"Value": "127.0.0.1:7000::1","Maps": null},{"Name": null,"Ref": null,"Value": "127.0.0.1:7005::1","Maps": null},{"Name": null,"Ref": null,"Value": "127.0.0.1:6379::1","Maps": null}]},{"Name": "MemoryCache","Properties": null}]},{"Name": "defaultExpireTime","Ref": "","Value": "120","Maps": null},{"Name": "connectTimeout","Ref": "","Value": "120","Maps": null},{"Name": "minSize","Ref": "","Value": "1","Maps": null},{"Name": "maxSize","Ref": "","Value": "10","Maps": null}]}]
}

四、总结

  木舟平台api,ui已经开源发布,后面陆续更新,等完成mqtt和国标28181设备接入,会搭建官方网站和DEMO,敬请期待。

 

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

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

相关文章

单变量微积分学习笔记:线性和二阶近似(16)【3】

线性近似 公式 \(x \to x_0\),\(f(x) \approx f(x_0) + f(x_0)(x-x_0)\)【切线】推导: \(f(x_0) = \lim_{x \to x_0}\frac{f(x)-f(x_0)}{x-x_0}\)【导数的定义】推论 前提:\(x \approx 0\), \[\sin(x) \approx x \]\[\cos(x) \approx 1 \]\[e^x \approx 1 + x \]\[ln(x+1) …

Spring之OCP开闭原则和DIP依赖倒置原则

通过如下代码,来分析几个开发原则(OCP开闭原则和DIP依赖倒置原则) 代码结构1.Test类 package com.xu.spring6.client;import com.xu.spring6.web.UserAction;public class Test {public static void main(String[] args) {UserAction userAction = new UserAction();userAct…

Blog2-题目集4~6

一、前言: 本次的大作业,包含了两个部分,一个是之前的1-3大作业(答题程序)还剩余的一次迭代,另外两个是最近做的电路设计的迭代,总而来说,这些大作业都是对于自己能力的考验,也是对自己的提升。二、设计与分析: 大作业4最后一题: 1.源码分析: 这次的迭代相比于上次…

面试题精选04-使用Linq怎么将数据分组之后按时间排序取最新1条数据

实体类 public class Movie {public string Name { get; set; }public string Area { get; set; }public DateTime ProductTime { get; set; } }初始化数据 public static List<Movie> InitData() {List<Movie> data = new List<Movie>(){new Movie(){ Name=…

WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

什么是文件包含 1、原理 程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时, 直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为文件包含。 在包含文件的过程中,如果文件能进行控制(如进行替换和修改),则存储文件包含漏洞白盒发现: 在php…

局部变量和成员变量的区别

1,区别2.内存位置不同如图,主方法里的变量stu1和stu2在栈内存,new开辟空间后,name变量在堆内存 . 3.生命周期不同 1.随着对象的消失而消失 https://kdocs.cn/l/cuQvFYJirzaR?linkname=150996495 主方法进栈,遇到method,method进栈,有new进堆,name成员变量进入空间 随着…

53.8 MB/s,新晋开源神器榨干你的网速:Gopeed!

软件介绍 今天给大家推荐一款全平台多线程高速下载器(支持磁力BT):Gopeed !Gopeed(全称 Go Speed),中文名叫做够快下载器,是一款由 Golang + Flutter 开发的现代化高速下载器,它是一款全平台多线程高速下载器,支持Windows、Macos、Linux、Android、iOS、Web、Docker、…

几个实用渲染技术原理和实现

一、快速高斯模糊 1.1 背景 ​ ​​  高斯模糊在wiki上定义为一种图像模糊滤波器,使用正态分布计算每个像素输出颜色。正态分布函数和图像如下所示: \[G(u,v)=\frac{1}{2\pi\delta^2}e^{(-u^2+v^2)/(2\delta^2)} \] ​ ​​  由图可以发现,当x在\(-3\delta\)到\(3\del…

STM32F103嵌套向量中断控制器

一、STM32F103中断介绍 1.1 什么是中断 中断:打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行;举例:当你正在写作业时,做到一半又去吃饭,吃完饭后又回来接着原来的作业继续完成。 对于单片机来说,中断是指CPU正在处理某个事件A,发生了另一件事件…

NFLS贪心与数据结构题单笔记(未完结)

A. 奶牛飞车贪心,把最慢的放前面#include <bits/stdc++.h> using namespace std; constexpr int maxn = 1e6 + 10; int n, m, d, L; int s[maxn]; int ans = 0; inline bool cmp(int x, int y) { return x > y; } int main() {cin >> n >> m >> d …

提取图片中目标物轮廓的像素尺寸

利用OpenCV库,对图片空间转化、灰度处理、二值化处理等,寻找图片中目标物轮廓像素尺寸。1.导入数据库 import cv2 import numpy as np from PIL import Image2.导入图片 image_tif = Image.open(1.tif) #导入tif图像 image_tif.convert(RGB).save(1p.png,PNG) # 转换为png格…

[极客大挑战 2019]BuyFlag

点击右上角的菜单,有一个payflag,直接点击,进入到了pay.php页面发现,需要得到flag有两个要求:必须是该校的学生,密码必须正确。在该页面的网页底部,有代码提示,要求密码不能是纯数字,最后又要==404密码才正确。我们可以想到利用php的弱类型比较:只要前缀有404就好。那…