近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源。他们的最好成绩,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攻击的多种配置方法,需要的朋友可以参考下
- **负载均衡**:当单个服务器无法应对高并发时,可以采用负载均衡策略,将流量分发到多个服务器,如轮询、最少连接数、哈希等算法。 - **错误处理**:良好的错误处理机制是保证系统稳定性的关键,应能处理各种异常...
本项目基于C#实现了Socket的异步高并发处理,这对于构建能够应对大量并发连接的网络服务至关重要。 标题中的"Scoket异步高并发"指的是在C#中利用Socket类的异步操作特性来处理大量并发连接。在传统的同步Socket编程...
总结来说,优化Nginx以应对大并发访问,不仅需要对系统参数进行调整,还要对Nginx的配置进行精细控制,通过合理的进程管理、网络连接处理和资源分配策略,实现高效且稳定的高并发服务。同时,持续的压力测试和性能...
为应对高并发,可以采用读写分离、数据缓存(如Redis或Memcached)、分库分表、索引优化等策略。NoSQL数据库(如MongoDB)也能提供更灵活的存储方案,适应大数据量需求。 4. 缓存技术:缓存能够显著提高系统响应...
### 高并发Web网站构建和安全防护 #### 高并发Web网站构建 ##### 高并发的由来 随着互联网技术的飞速发展,用户对于Web应用的需求也日益增长,这直接导致了对Web服务器处理能力的要求越来越高。在早期,简单的...
### 高并发高负载网站系统架构 #### 一、引言 随着互联网技术的迅猛发展,网站系统面临着越来越大的访问压力。特别是在电商领域,诸如淘宝这样的电商平台经常需要应对大规模的突发流量,比如“双十一”、“双十二...
### Java秒杀系统方案优化与高性能高...通过上述一系列措施和技术手段的应用,我们可以成功地构建出一套能够应对高并发场景下稳定运行的Java秒杀系统。这不仅有助于提升用户体验,还能为企业节省大量成本,提高竞争力。
高并发是秒杀系统的关键挑战,系统需要能应对瞬间涌入的大量请求。这通常涉及到负载均衡、线程池优化、缓存策略、数据库连接池等技术。SpringBoot可以通过集成如RabbitMQ、Kafka等消息队列来削峰填谷,减少服务器...
### 大型网站系统构架-高并发高负载 随着互联网技术的发展,越来越多的企业和组织开始构建自己的在线平台,特别是大型网站,如门户站点等。这些网站通常面临着大量的用户访问和高并发请求的压力。为了应对这些问题...
本项目以"ssm高并发之秒杀系统"为主题,旨在探讨如何利用SSM框架来设计和实现一个能够应对高并发场景的秒杀系统。 1. **Spring框架**:Spring作为基础架构框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能,...
此外,还可以通过负载均衡、分布式服务、缓存优化、数据库读写分离、预热策略等手段来提高系统应对高并发的能力。负载均衡可以分散流量,分布式服务可以拆分系统,缓存优化可以减少数据库交互,数据库读写分离可以...
根据提供的文件信息,我们可以深入探讨有关“Java高性能高并发秒杀系统”的相关知识点。下面将详细介绍该主题涉及的核心概念、关键技术以及实现方案等。 ### 一、秒杀系统的概念与应用场景 #### 1.1 秒杀系统简介 ...
- **应对恶意流量**:建立防护机制,防止DDoS攻击等恶意行为对系统造成影响。 #### 监控机制 最后,完善的监控机制是保证系统稳定运行的关键。主要包括: - **统一日志平台**:收集并分析系统日志,及时发现和...
总的来说,Redis通过其`INCR`命令和强大的键值存储能力,能够很好地应对高并发计数器的需求。结合连接池的使用,能够提供高效的计数服务,并且易于扩展和维护。这种解决方案不仅适用于接口调用限制,还可以应用于...
在互联网应用中,服务器的安全性至关重要,尤其是对于高并发的场景。PHP作为常见的服务器端脚本语言,经常面临各类安全挑战,其中CC(Challenge Collapsar)攻击就是一种典型的DDoS(分布式拒绝服务)攻击方式。本文...
如何构建一个稳定、高效且能够应对高并发场景的秒杀系统成为了开发者的重大挑战之一。 #### 二、高并发秒杀系统的设计要点 ##### 1. 系统架构设计 - **分布式架构**:采用微服务或SOA(面向服务架构)模式,将系统...
在本项目中,"WebServer-master 牛客C++实战项目 高并发服务器(源码+注释)",我们关注的是使用C++语言构建一个能够处理高并发请求的Web服务器。这个实战项目旨在帮助开发者深入理解服务器端编程,特别是针对大规模...