服务流控方案总结
转载自:https://developer.aliyun.com/article/765912
一 流控的场景流控的意义其实无需多言了。最常用的场景下,流控是为了保护下游有限的资源不被流量冲垮,保证服务的可用性,一般允许流控的阈值有一定的弹性,偶尔的超量访问是可以接受的。
有的时候,流控服务于收费模式,比如某些云厂商会对调用 API 的频次进行计费。既然涉及到钱,一般就不允许有超出阈值的调用量。
这些不同的场景下,适用的流控算法不尽相同。大多数情况下,使用 Sentinel 中间件已经能很好地应对,但 Sentinel 也并不是万能的,需要思考其他的流控方案。
二 接口定义为了方便,以下所有的示例代码实现都是基于 Throttler 接口。
Throttler 接口定义了一个通用的方法用于申请单个配额。
当然你也可以定义一个 tryAcquire(String key, int permits) 签名的方法用于一次申请多个配额,实现的思路是一样的。
有些流控算法需要为每个 key 维护一个 Throttler 实例。
123456789public interface Thrott ...
常见垃圾收集器的特点
CMS(Concurrent Mark Sweep)收集器
缺点:1.CMS收集器对CPU资源非常敏感。并发执行的特性,会对用户线程产生影响。2.CMS收集器无法处理浮动垃圾。并发清理阶段用户线程还在运行着,伴随程序运行自然还会有新的垃圾不断产生,CMS无法处理他们。3.采用标记-清楚算法实现,产生内存碎片。
G1(Garbage-First)收集器
特点:1.并发与并行。2.分代收集。3.空间整合。标记-整理算法。4.可预测的停顿。降低停顿时间是G1和CMS共同的关注点。5.G1可以进行垃圾收集的范围包括新生代和老年代。将整个Java堆划分为多个大小相等的独立区域,虽然还保留新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region的集合。化整为零的思路,并维护优先队列,使得G1收集器实现可预测的停顿。6.可达性分析时跨Region对象引用的问题,虚拟机维护Remembered Set来避免全堆扫描。
ZGC()收集器堆外内存导致溢出错误堆外内存不在垃圾回收的范围内,如果发生内存溢出的情况,也有可能是堆外内存引起的,常见的堆外内存包括:1.Direct Me ...
Redis常见面试题
和Redis结缘还是2011年刚开始实习,做的第一款游戏《部落战争》,就是使用的Redis作为持久层和缓存。 当时对Redis的认识还比较浅,但是Redis的好多特性已经开始慢慢了解。
这里推荐一下大神的Redis公众号。付磊。快手同事,《Redis开发与运维》一书的作者,强烈推荐这本书,偏向实战,另外一本很有名的书《Redis设计与实现》更注重原理。两本书都非常值得好好读下。
Memcached相比于Redis的主要特点有如下:\1. 超高OPS:例如千万级别以上(线上千万OPS以上的Redis也存在)\2. 多线程:抗热点能力强。\3. 支持大value:例如Memcached 5支持100MB以上的value
但Memcached相比于Redis维护成本会更高,而且对于很多基础设施支持也不好(双机房、键值分析、内存优化、服务端高可用)。
最近发现KCC上出现Memcached滥用的情况
为防止滥用,必须满足如下规则才会开通:
\1. OPS: 超过100万\2. big value:10MB+\3. 明显热点\4. CAS需求
一、Redis常见的数据结构和使用场景
(一 ...
云服务器被挖矿病毒感染!
记录下病毒感染的始末。从发现到折磨,再到最后解决的痛苦过程。总结教训,不能大意,还是得做好快照备份。一、3月13号发现服务器ssh连接困难,连上就掉线,根本无法操作,用top指令查看发现有进程名为:dblaunch高负载,占满cpu。没多想,联系腾讯云处理,最后给出的建议:做好快照,重启机器。腾讯帮忙注释掉了启动脚本中lampp中mysql的bin环境变量,现在来看,这个操作没任务作用。重启完后机器恢复正常,也就没再进一步追踪。
二、3月15号,公司下周去美国,需要搭建对外服务器在美国登陆,就部署到我的腾讯云服务器,由于我明天去日本的飞机,赶忙晚上部署服务器完毕,测试无恙,一切正常。
三、3月16号,在日本凌晨3点钟, 同事反应游戏服务器连不上,登陆ssh后台发现根本连不上, 再次联系腾讯云,最后还是强制重启解决,噩梦开始,由于人在日本,只能通过手机操作,没有别的办法,只能每天早上起床后第一件事就是重启机器,以保障美国方能正常展示游戏。
四、回国后开始排查问题,发现进程sustse跑满cpu,网上查看后才知道是被挖矿病毒感染,第一次服务器被病毒感染的经历。随后开始了各种尝试,试图删 ...
云服务器重启事项
今天遇到腾讯云服务器控制台连上就断开的问题。和腾讯云沟通后反馈可能是由于cpu长时间负载过高引起的。
登陆服务器后查看状态,发现进程:dblaunch的cpu负载高达200%。最后定位问题发生在lampp配置和权限的问题。注释掉下面这两行重启即可。
正好记录下重启服务器时需要启动的服务,以免遗漏。1.lampp
2.redis
3./usr/local/server下需要启动的服务
4.maven仓库
自己动手写JVM
根据《自己动手写Java虚拟机》一书
实现的go代码在GitHub中:QJvm可视化查看class文件的工具:查看class工具,启动类:ClasspyApp。书籍自身代码:代码
Class文件解析:
如上图所示:
常量池解析:
1.读取16位的常量池大小cp_count。
2.索引从1到cp_count-1,依次读取常量信息。
3.常量信息有tag(8bit)表示常量类型。不同的类型读取数据方式不同。
// 常量池类型
const (
CONSTANT_Class = 7
CONSTANT_Fieldref = 9
CONSTANT_Methodref = 10
CONSTANT_InterfaceMethodref = 11
CONSTANT_String = 8
CONSTANT_Integer = 3
CONSTANT_Float = 4
CONSTANT_Long = 5
CONSTANT_Double = 6
CONSTANT_NameAndType = 12
CONSTANT_Utf8 = 1
CONSTANT_Met ...
JAVA HTTPS服务
分自签证书和CA证书两种方式。一、制作一张自签证书(jks格式)1#keytool -genkey -keysize 2048 -validity 3650 -keyalg RSA -dname "CN=myyiba.com" -keypass 123456 -storepass 123456 -keystore myyiba.jks
keytool为JDK提供的生成证书工具
-keysize 2048 密钥长度2048位(这个长度的密钥目前可认为无法被暴力破解)
-validity 3650 证书有效期3650天
-keyalg RSA 使用RSA非对称加密算法
-dname “CN=myyiba.com” 设置Common Name为myyiba.com,这是我的域名
-keypass 123456 密钥的访问密码为123456
-storepass 123456 密钥库的访问密码为123456(其实这两个密码也可以设置一样,通常都设置一样,方便记)
-keystore myyiba.jks 指定生成的密钥库文件为 myyiba .jks
完了之后就拿到了 ...
JAVA版ZSet性能测试
自己实现的JAVA版ZSet的主要功能,源码在github:
https://github.com/zhangga/JAVAZSet
性能测试:
下面数据都是在本地windows下执行10次的评价值:JVM10G + i7-8700开着各种应用。Eclipse Run 预热几次稳定后。
ZSet使用TreeMap、list的组合存放分值信息。100W条总数据,分值为1W(0-9999)个,这样平均相同分值会有100条数据在list中。获取1000-3000分值的数据,执行1W次,
取样10次用时ms:6604+6490+6648+6602+7718+7626+6682+7498+6588+7358=69814/10=6981
ZSet使用ConcurrentSkipListMap、list的组合存放分值信息。100W条总数据,分值为1W(0-9999)个,这样平均相同分值会有100条数据在list中。获取1000-3000分值的数据,执行1W次,
取样10次用时ms:7594+8279+8622+8476+7810+7397+7241+8579+8019+8554=80571/10= ...
TCP/KCP详解,及源码注解
KCP-Netty的中文注解版:kcp-netty中文注释
KCP/UDT比较:kcp/udt
KCP传输层,可靠性,ARQ协议。
目的:解决在网络拥堵情况下tcp协议的网络速度慢的问题。可靠性,传输速度。
一般用udp作为下层传输协议,udp报文+控制头。
传输数据大于mss(最大报文段)时,kcp将数据分片存储在多个kcp包(Segment)中。
滑动窗口机制:kcp采用滑动窗口机制来提高发送速度。由于UDP在网络中的传输是不可靠的,因此会出现丢包和包的乱序。kcp是可靠的保证数据有序的协议,所以为了纠正包的乱序。接收方维护一个接收窗口。接收窗口有一个起始序号rcv_nxt以及尾序号rcv_nxt+rcv_wnd。如果接收窗口收到序号为rcv_nxt的分片那么rcv_nxt就加一,形象一点的说法是滑动窗口右移,并把该数据放入接收队列供应用层取用。如果收到的数据在窗口范围内但不是rcv_nxt那么就把数据保存起来,等收到rcv_nxt序号的分片时再一并放入接收队列供应用层取用。
快速重传机制:数据在网络中的传输时间是不固定的,因此超时重传时间比较长。而为了尽早地判断出数据 ...
使用Flutter进行APP开发流程
资源加载:1.本地12static const String DEFAULT_USER_ICON = 'static/images/logo.png';Image.asset(AppICons.DEFAULT_USER_ICON, width: AppICons.USER_ICON_WIDTH, height: AppICons.USER_ICON_HEIGHT),
2.iconfont。 https://www.iconfont.cn/在iconfont网站上传资源。下载到本地,放入项目资源文件夹下。
pubspec.yaml中配置。
1234fonts: - family: myIconFont fonts: - asset: static/font/iconfont.ttf
3.UI编辑器。 https://norbert515.github.io/widget_maker/website/https://github.com/Norbert515/flutter_ide
项目中使用:
123static const String FO ...