解决方案-汇总
参考文献
流量削峰
流量削峰的目的是在流量突增时,通过平滑处理请求,避免系统被过高的瞬时负载击垮.
开发层面:
限流,可以对每秒、每分钟、每小时等时间窗口内的请求数进行限制,避免短时间内请求量过大导致系统过载
解决方案-限流器
队列处理:对于瞬时流量过高的请求,可以使用 消息队列(如 Kafka、RabbitMQ)将请求异步处理.请求先入队列,后台系统根据处理能力逐步消费队列中的任务.
请求排队与优先级调度:通过 线程池 和 优先级队列 控制处理请求的优先级,对于非关键请求,可以将其排队等待
运维层面
通过 Nginx、HAProxy 等负载均衡工具,均匀分配请求到不同的后端服务节点,避免单点压力过大.
在流量突增时,通过 自动扩容(Auto Scaling) 技术,动态增加处理节点(如 Kubernetes 自动扩容、AWS EC2自动扩容等).
延迟响应
在高并发系统中,当无法快速处理某些请求时,通过延迟响应可以缓解系统的压力并防止系统崩溃.
开发层面
异步处理:对于不需要立即返回的操作,使用异步处理,如使用 Java CompletableFut ...
解决方案-压测
参考文献
全链路压测数据隔离方案的选择
影子库
影子表
工具
wrk
解决方案-HTML2PDF
参考文献
Flying Saucer
SpringBoot集成文件 - 集成itextpdf之导出PDF
调研历程
首先查阅资料,了解Java中现有PDF的框架
iText:
iText 是一个功能强大的 PDF 处理库,可以用于创建、修改和提取 PDF 文档的内容,支持文本、图像、表格等元素的处理.它提供了丰富的 API,可以满足各种 PDF 处理需求.
Apache PDF Box:
Apache PDF Box 是 Apache 软件基金会的一个开源 Java 库,用于操作 PDF 文档.它支持创建、修改和提取 PDF 文档的内容,以及数字签名和加密等功能.
JFreeReport:
JFreeReport 是一个用于生成报表的 Java 库,它支持创建复杂的、高度定制的报表,包括图表、表格、文本等元素,并且可以将报表输出为 PDF 格式.
PJX:
PJX 是一个用于创建 PDF 文档的 Java 库,它提供了简单易用的 API,可以用来生成包含文本、图像、表格等内容的 PDF 文件.
FOP:
FOP(Formatting Objects P ...
解决方案-网站优化
参考文献
传送现代格式的图片
网站优化
开启Gzip压缩
将图片格式换为 AVIF或WebP 格式的图片
与旧版 JPEG 和 PNG 相比,AVIF 和 WebP 这两种图片格式具有更优的压缩和质量特性.采用这些格式(而非 JPEG 或 PNG)对图片进行编码,可以提高图片的加载速度,并消耗更少的移动数据网络.
Chrome、Firefox 和 Opera 支持 AVIF,并且与具有相同画质设置的其他格式相比,AVIF 的大小会更小. 如需详细了解 AVIF,请参阅“提供 AVIF 图片”Codelab.
最新版本的 Chrome、Firefox、Safari、Edge 和 Opera 支持 WebP,可为网络上的图片提供更好的有损和无损压缩. 如需详细了解 WebP,请参阅新的 Web 图片格式.
解决方案-认证与授权
参考文献
https://docs.authing.cn/v2/concepts/
https://datatracker.ietf.org/doc/html/rfc6749
行业标准
OAuth 2.0: 一种授权标准,允许用户在一个站点向其他站点授予对其资源的有限访问权限,而无需获得其凭证(通常是账号密码).举个例子,你在手机上点击「使用微信登录」时都会使用此标准,并且系统会询问你是否同意与该应用共享你的头像、昵称等数据.
Open ID Connect: 这是 OAuth 2.0 的一个超集,他在 OAuth 2.0 之上提供了更多用户信息和获取权限和标准,比如他定义了用户的头像为 picture.
JSON Web Tokens: 一种开放标准,主要用来安全的传输信息,他的格式非常紧凑和独立,解析之后是一种 JSON 格式.
Security Assertion Markup Language (SAML): 一种基于 XML 的开放数据格式,SAML 允许企业应用程序和内部、外部程序无缝连接.
LDAP: 可以把轻量目录访问协议(Lightweight Director ...
解决方案-ID生成器
参考文献
雪花算法
雪花算法是一种用于生成全局唯一ID的算法,也称为Twitter雪花算法。它能够在分布式系统中生成唯一的ID,而不需要集中式的ID生成器来维护。雪花算法的原理如下:
雪花算法的ID由64位二进制数组成,其中第1位为符号位,始终为0;第2-42位为时间戳,记录当前时间与一个固定的起始时间之间的差值,精确到毫秒级别;第43-52位为机器ID,用于标识不同的机器,最多能够标识1024台机器;第53-64位为序列号,表示同一毫秒内生成的不同ID,最多能够生成4096个ID。
在生成ID之前,需要先初始化一些参数,包括起始时间、机器ID等。起始时间可以设置为某个固定的时间点,机器ID可以通过配置文件或者其他方式来获取。
在生成ID时,雪花算法会先获取当前时间,计算出时间戳,并将时间戳左移22位,使其占据ID的前42位。然后再将机器ID左移12位,占据ID的43-52位。最后,将序列号加1,并将其与机器ID和时间戳拼接起来,即为最终的ID。
如果在同一毫秒内生成的ID超过了4096个,序列号会重新从0开始计数。如果在同一毫秒内生成的ID超过了4096个,并且当前时间已经超过了 ...
解决方案-如何优雅地重试
参考文献
如何优雅地重试
解决方案-数据库缓存不一致问题
参考文献
数据库缓存数据不一致
一致性
“⼀致性”包含了两种情况:
缓存中有数据,那么,缓存的数据值需要和数据库中的值相同;
缓存中本⾝没有数据,那么,数据库中的值必须是最新值.
产生的原因
数据库缓存不一致问题通常是由于缓存和数据库的数据更新不同步或者同步出现问题导致的.
并发更新:在多个并发线程同时更新数据时,可能会出现数据不一致的问题.例如,一个线程更新了数据库中的数据,但是缓存中的数据并没有及时更新,这时另一个线程读取缓存中的数据就会与数据库中的数据不一致.
缓存更新失败:在更新缓存时,如果由于网络或其他原因导致缓存更新失败,就可能会导致缓存和数据库中的数据不一致.
数据库更新失败:在更新数据库时,如果由于网络或其他原因导致数据库更新失败,就可能会导致缓存和数据库中的数据不一致.
缓存过期:在缓存中存储的数据可能会因为时间到期或者缓存空间不足等原因被清除,但是数据库中的数据仍然存在,这时就会出现缓存和数据库中的数据不一致.
缓存穿透:如果请求一个不存在的数据,就会导致缓存中没有该数据,但是每次请求都会访问数据库,这就会出现缓存和数据库中的数据不一致.
解决方 ...
解决方案-网关
参考文献
网关系统就该这么设计(万能通用),稳的一批!
解决方案-限流器
参考文献
我司用了 6 年的 Redis 分布式限流器,可以说是非常厉害了!
限流的原理以及常用算法
关于两种限流模式
限流的目的
高并发系统中有三把利器用来保护系统:缓存,降级和限流.限流的目的是为了保护系统不被大量请求冲垮,限制系统的输入和输出流量已达到保护系统的目的.在电商的秒杀活动中,限流是必不可少的一个环节.
常见的限流算法有:令牌桶、漏桶.计数器也可以进行限流实现.
令牌桶
令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌.可以控制流量也可以控制并发量,假如我们想要控制 API 网关的并发量最高为 1000,可以创建一个令牌桶,以固定的速度往桶里添加令牌,超出了 1000 则不添加.
当一个请求到达之后就从桶中获取一个令牌,如果能获取到令牌就可以继续往下请求,获取不到就说明令牌不够,并发量达到了最高,请求就被拦截.
漏桶
漏桶是一个固定容量的桶,按照固定的速率流出,可以以任意的速率流入到漏桶中,超出了漏桶的容量就被丢弃,总容量是不变的.但是输出的速率是固定的,无论你上面的水流入的多快,下面的出口只有这么大,就像水坝开闸放水一样
常见的 ...