近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源。他们的最好成绩,1秒钟 可以并发6次,赶在Database入库前,Cache进行Missing Loading前,强占这其中十几毫秒的时间,进行恶意攻击。
为了应对上述情况,做了如下调整:
- 更新数据时,先写Cache,然后写Database(双写),如果可以,写操作交给队列后续完成。
- 限制统一帐号,同一动作,同一秒钟并发次数,超过1次不做做动作,返回操作失败。
- 限制统一用户,每日动作次数,超限返回操作失败。
要完成上述操作,同事给我支招。用Memcached的add方法,就可以很快速的解决问题。不需要很繁琐的开发,也不需要依赖数据库记录,完全内存操作。
以下实现一个判定冲突的方法:
- /**
- * 冲突延时 1秒
- */
- public static final int MUTEX_EXP = 1;
- /**
- * 冲突键
- */
- public static final String MUTEX_KEY_PREFIX = "MUTEX_";
- /**
- * 冲突判定
- *
- * @param key
- */
- public boolean isMutex(String key) {
- return isMutex(key, MUTEX_EXP);
- }
- /**
- * 冲突判定
- *
- * @param key
- * @param exp
- * @return true 冲突
- */
- public boolean isMutex(String key, int exp) {
- boolean status = true;
- try {
- if (memcachedClient.add(MUTEX_KEY_PREFIX + key, exp, "true")) {
- status = false;
- }
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- }
- return status;
- }
做个说明:
选项 | 说明 |
add | 仅当存储空间中不存在键相同的数据时才保存 |
replace | 仅当存储空间中存在键相同的数据时才保存 |
set | 与add和replace不同,无论何时都保存 |
也就是说,如果add操作返回为true,则认为当前不冲突!
回归场景,恶意用户1秒钟操作6次,遇到上述这个方法,只有乖乖地1秒后再来。别小看这1秒钟,一个数据库操作不过几毫秒。1秒延迟,足以降低系统负载,增加恶意用户成本。
附我用到的基于XMemcached实现:
- import net.rubyeye.xmemcached.MemcachedClient;
- import org.apache.log4j.Logger;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
- /**
- *
- * @author Snowolf
- * @version 1.0
- * @since 1.0
- */
- @Component
- public class MemcachedManager {
- /**
- * 缓存时效 1天
- */
- public static final int CACHE_EXP_DAY = 3600 * 24;
- /**
- * 缓存时效 1周
- */
- public static final int CACHE_EXP_WEEK = 3600 * 24 * 7;
- /**
- * 缓存时效 1月
- */
- public static final int CACHE_EXP_MONTH = 3600 * 24 * 30 * 7;
- /**
- * 缓存时效 永久
- */
- public static final int CACHE_EXP_FOREVER = 0;
- /**
- * 冲突延时 1秒
- */
- public static final int MUTEX_EXP = 1;
- /**
- * 冲突键
- */
- public static final String MUTEX_KEY_PREFIX = "MUTEX_";
- /**
- * Logger for this class
- */
- private static final Logger logger = Logger
- .getLogger(MemcachedManager.class);
- /**
- * Memcached Client
- */
- @Autowired
- private MemcachedClient memcachedClient;
- /**
- * 缓存
- *
- * @param key
- * @param value
- * @param exp
- * 失效时间
- */
- public void cacheObject(String key, Object value, int exp) {
- try {
- memcachedClient.set(key, exp, value);
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- }
- logger.info("Cache Object: [" + key + "]");
- }
- /**
- * Shut down the Memcached Cilent.
- */
- public void finalize() {
- if (memcachedClient != null) {
- try {
- if (!memcachedClient.isShutdown()) {
- memcachedClient.shutdown();
- logger.debug("Shutdown MemcachedManager...");
- }
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- }
- }
- }
- /**
- * 清理对象
- *
- * @param key
- */
- public void flushObject(String key) {
- try {
- memcachedClient.deleteWithNoReply(key);
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- }
- logger.info("Flush Object: [" + key + "]");
- }
- /**
- * 冲突判定
- *
- * @param key
- */
- public boolean isMutex(String key) {
- return isMutex(key, MUTEX_EXP);
- }
- /**
- * 冲突判定
- *
- * @param key
- * @param exp
- * @return true 冲突
- */
- public boolean isMutex(String key, int exp) {
- boolean status = true;
- try {
- if (memcachedClient.add(MUTEX_KEY_PREFIX + key, exp, "true")) {
- status = false;
- }
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- }
- return status;
- }
- /**
- * 加载缓存对象
- *
- * @param key
- * @return
- */
- public <T> T loadObject(String key) {
- T object = null;
- try {
- object = memcachedClient.<T> get(key);
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- }
- logger.info("Load Object: [" + key + "]");
- return object;
- }
- }
相关推荐
主要介绍了Windows服务器应对高并发和DDOS攻击的配置方法,本文讲解了应对高并发请求、应对DDOS攻击的多种配置方法,需要的朋友可以参考下
能够轻松应对高并发,等以前版本无法应对的并发问题,也不会被恶意补单漏洞侵扰,全站修复了XSS攻击漏洞。 【主要功能说明】 1、支付类型可包含 H5、当面付、公众号、扫码、银联、快捷; 2、结算类型包含 普通结算...
能够轻松应对高并发,等以前版本无法应对的并发问题,也不会被恶意补单漏洞侵扰,全站修复了XSS攻击漏洞。 【主要功能说明】 1、支付类型可包含 H5、当面付、公众号、扫码、银联、快捷; 2、结算类型包含 普通结算...
2.2.2 弹性伸缩 轻松应对高并发 6 2.2.3 云数据服务 安全稳定 6 2.2.4 大数据分析 体现数据价值 7 2.2.5 与360相同级别的全方位安全防护 7 2.3 平台设计 7 2.3.1 KVM虚拟机系统 7 2.3.2 Ceph 分布式存储 8 2.3.3 云...
能够轻松应对高并发,等以前版本无法应对的并发问题,也不会被恶意补单漏洞侵扰,全站修复了XSS攻击漏洞。 【主要功能说明】 1、支付类型可包含 H5、当面付、公众号、扫码、银联、快捷; 2、结算类型包含 普通结算、...
一旦上升到百万、千万级别的规模就要考虑分布式集群来应对瞬时高并发。 构层级 一般商家在做活动的时候,经常会遇到各种不怀好意的DDOS攻击(利用无辜的吃瓜群众夺取资源),导致真正的我们无法获得服务!所以说高防IP...
SpringBoot项目基于SpringBoot的秒杀系统设计与实现是一个高性能的网络应用程序,旨在处理高并发的商品抢购场景。该系统通过优化数据处理和缓存策略,确保在极端压力下也能平稳运行,为用户提供公平且高效的购物体验...
扩展性:MySQL 5.7.19 支持水平和垂直扩展,可以轻松应对不断增长的数据量和并发访问需求。 MySQL 官方文档:https://dev.mysql.com/doc/ MySQL 教程和示例:...
能够轻松应对高并发,等以前版本无法应对的并发问题,也不会被恶意补单漏洞侵扰,全站修复了XSS攻击漏洞。 【主要功能说明】 1、支付类型可包含 H5、当面付、公众号、扫码、银联、快捷; 2、结算类型包含 普通结算...
核心价值:随网站所需灵活应对 驱动力量:网站的业务发展 网站架构设计误区 一味追随大公司的解决方案 为技术而技术 企图用技术解决一切问题 大型网站架构模式 架构模式 分层 分割 分布式 ...
简述本文目的:梳理并探讨后端开发实践中常见的技术挑战及其应对策略 二、基础架构与部署问题 服务器配置与优化 CPU、内存使用率过高 I/O瓶颈 解决方案:负载均衡、资源监控与自动扩展机制、缓存技术的应用 数据库...