沈阳开发网站公司,商业软文怎么写,网站流量是什么,网页编辑格式你好#xff0c;我是田哥 最近#xff0c;我在对充电桩项目进行微服务升级中#xff0c;肯定会遇到一些问题 前面分享了#xff1a;充电桩项目实战#xff1a;搞定多数据源#xff01; 题外话#xff1a;如果想年后找到更好的工作#xff0c;推荐看这篇文章#xff1a… 你好我是田哥 最近我在对充电桩项目进行微服务升级中肯定会遇到一些问题 前面分享了充电桩项目实战搞定多数据源 题外话如果想年后找到更好的工作推荐看这篇文章 Java后端面试复习规划表5万字 登录界面 在做充电桩项目时其中用户的登录、注册等都需要用到短信这个功能所以我们在开发之前要做一些相对深入的考虑。 比如 短信模板如何存储常见存储方式有哪些用户发送次数是否要限制如何限制 短信发送后采取的了60秒后能再次重发这么设计还有个好处就是规避有些人恶意攻击系统频繁发送短信短信一条也就几分钱但是量上来了这个成本就不能小看了。 通常3分/条如果100条那就是3块10000条就是300块100w条那就是3万块 但是这个60秒也还不能完全杜绝这类事情发生只是说这个量级变了一个用户每隔60秒发一次一小时就可以发60次一条24*601440次10个用户都这么恶搞那就是每天短信成本变成 每天10个用户恶搞14400*343200换算下来432恶搞一个月就是432*30 一万多了。 所以我们还可以对用户进行每天次数限制每月次数限制。比如每天每个用户的某个功能发短信的次数限制在8次或者20次。至少也能规避掉前面带来的问题。 其实上述问题也可以说不能完全规避掉只能说在不影响用户使用的前提下我们可以尽可能规避。所以我们可以采取一个分布式限流技术就是每一个用户每天或者每分钟或每小时最多只能发送xx次-----限流。 分布式限流解决方案 分布式限流方案有以下几种 1. 基于令牌桶算法的限流 ● 优点实现简单算法成熟可以平滑限流请求具有较高的容错性和稳定性。 ● 缺点限流粒度较粗无法应对瞬时流量突增的情况。 ● 适用场景对于不需要严格限制每个请求的时间间隔的情况可以使用基于令牌桶算法的限流方案。 2. 基于漏桶算法的限流 ● 优点实现简单可以平滑限流请求具有较高的容错性和稳定性。 ● 缺点限流粒度较粗无法应对瞬时流量突增的情况。 ● 适用场景对于不需要严格限制每个请求的时间间隔的情况可以使用基于漏桶算法的限流方案。 3. 基于计数器的限流 ● 优点实现简单可以较为准确地控制请求的速率。 ● 缺点无法平滑限流请求容易因瞬时流量突增而导致系统压力过大。 ● 适用场景对于需要严格控制每个请求的时间间隔的情况可以使用基于计数器的限流方案。 4. 基于分布式缓存的限流 ● 优点可以分布式地存储和管理限流规则适用于大规模分布式系统。 ● 缺点需要依赖分布式缓存系统增加了系统的复杂性。 ● 适用场景对于需要分布式地管理限流规则的大规模系统可以使用基于分布式缓存的限流方案。 5. 基于流量控制网关的限流 ● 优点可以集中管理和控制流量支持多种限流策略适用于大规模分布式系统。 ● 缺点需要引入额外的流量控制网关增加了系统的复杂性。 ● 适用场景对于需要集中管理和控制流量的大规模系统可以使用基于流量控制网关的限流方案。 不同的限流方案适用于不同的场景我们需要根据具体的业务需求和系统架构来选择合适的方案。假设我们采用每小时用户最多只能发送6次短信那我们可以采取滑动窗口来解决。 关于滑动窗口模型图 滑动窗口 在我们的充电桩项目中采用的是Redisson来实现限流的。 public boolean limitBySlidingWindow(String key,long rate, long rateInterval, RateIntervalUnit rateIntervalUnit) {RRateLimiter rateLimiter redissonClient.getRateLimiter(key);rateLimiter.trySetRate(RateType.OVERALL, rate, rateInterval, rateIntervalUnit);if (rateLimiter.tryAcquire()) {return false;} else {// 触发限流处理return true;}} trySetRate()方法参数介绍 RateType mode速率类型表示限流的模式例如固定速率Fixed或滑动窗口速率Sliding Window。long rate速率值表示每秒允许的请求数量。long rateInterval速率间隔表示滑动窗口的时间长度单位由 rateIntervalUnit 参数指定。RateIntervalUnit rateIntervalUnit速率间隔单位表示滑动窗口时间长度的单位例如秒Seconds、分钟Minutes等。这里可能很多人不太理解这个速率类型下面来聊聊速率类型的区别。 速率类型 固定速率Fixed和滑动窗口速率Sliding Window是两种常见的限流算法它们在实现上有一些区别。 1. 固定速率Fixed 原理固定速率算法根据预设的速率限制来控制请求的处理速度。它通过设置一个固定的请求处理时间间隔确保在单位时间内只处理一定数量的请求。示例假设我们有一个API接口我们希望限制每秒最多只能处理10个请求。使用固定速率算法我们可以设置一个时间间隔为100毫秒即每个请求之间至少需要等待100毫秒才能被处理。这样即使有大量请求同时到达我们也只会在每100毫秒内处理一个请求从而保证不超过每秒10个请求的限制。 2. 滑动窗口速率Sliding Window 原理滑动窗口算法通过维护一个时间窗口来控制请求的处理速度。它将时间划分为多个小的时间窗口每个窗口都有一个对应的请求处理数量限制。当请求到达时会根据当前时间所在的窗口来决定是否允许处理该请求。示例假设我们仍然希望限制每秒最多只能处理10个请求。使用滑动窗口算法我们可以将时间划分为1秒内的10个等长的小窗口每个窗口持续100毫秒。每个窗口都有一个计数器用于记录在该窗口内处理的请求数量。当一个新的请求到达时我们会检查当前时间所在的窗口如果该窗口的计数器未达到限制例如10个请求则允许处理该请求并将计数器加一否则拒绝该请求。随着时间的流逝每个窗口都会逐渐向前滑动旧的窗口将被丢弃新的窗口将被创建从而实现对请求的处理速度进行限制。 总结固定速率算法通过设置固定的请求处理时间间隔来限制请求的处理速度而滑动窗口算法通过维护一个时间窗口来控制请求的处理速度。两者都可以实现对请求的处理速度进行限制但具体实现方式和效果略有不同。 估计很多人看了这段话还是不太清楚我们到底要选择哪一种 两种速率的优缺点 固定速率的优点 ● 实现简单固定速率算法的实现相对简单只需要设置一个时间间隔确保每个请求之间有足够的处理时间。 ● 预测性强由于时间间隔是固定的所以可以很容易地预测系统的处理能力便于进行资源规划和分配。固定速率的缺点 ● 不够灵活在高并发情况下固定速率可能会导致资源浪费因为它不考虑实际的请求情况即使请求量减少也会保持相同的处理速度。 ● 无法应对突发流量当遇到突发流量时固定速率可能无法及时响应因为它不能根据实际情况动态调整处理速度。 滑动窗口速率的优点 ● 灵活性高滑动窗口算法可以根据实际的请求情况动态调整处理速度更加灵活地应对不同的流量模式。 ● 资源利用率高通过动态调整时间窗口的大小滑动窗口算法可以更有效地利用系统资源避免在请求量少时的资源浪费。 滑动窗口速率的缺点 ● 实现复杂相比于固定速率滑动窗口算法的实现更为复杂需要考虑窗口的大小和滑动的策略。 ● 性能开销大由于需要维护一个时间窗口的数据结构滑动窗口算法可能会引入额外的性能开销。 总的来说固定速率算法适合对处理速度要求较为稳定的场景而滑动窗口速率算法则更适合对处理速度有较高灵活性要求的场景。 短信模块设计 在充电桩项目中短信模块设计整体流程如下 短信模块设计 用到了策略模式和模板方法模式。关于策略模式和模板方法模式之前我已经分享过所以参考之前的文章即可。 加入我的学习圈子即可解锁充电桩项目设计文档、源码、原型图。V:tj20120622 回复77免费获取《面试小抄》 回复电子书免费获取《200本后端必读书籍》 推荐 MySQL 开发规范非常详细建议收藏 16k面试中的10个问题 从0开始搭建公司技术栈yyds 全程面试辅导保驾护航