电商网站双11运维架构设计思路,抗高并发!
DevOps技术栈
共 5497字,需浏览 11分钟
·
2021-11-27 17:49
秒杀应该考虑哪些问题呢?
超卖问题
高并发
接口防刷
秒杀 URL
数据库设计
大量请求问题
秒杀系统的设计和技术方案
秒杀系统数据库设计
秒杀 URL 的设计
为了避免有程序访问经验的人通过下单页面url直接访问后台接口来秒杀货品,我们需要将秒杀的 URL 实现动态化,即使是开发整个系统的人都无法在秒杀开始前知道秒杀的URL 。具体的做法就是通过 md5 加密一串随机字符作为秒杀的 URL,然后前端访问后台获取具体的 URL,后台校验通过之后才可以继续秒杀。
秒杀页面静态化
单体 Redis 升级为集群 Redis
使用 Nginx
精简 SQL
Redis 预减库存
接口限流
秒杀最终的本质是数据库的更新,但是有很多大量无效的请求,我们最终要做的就是如何把这些无效的请求过滤掉,防止渗透到数据库。限流的话,需要入手的方面很多:
同一个用户xx秒内重复请求直接拒绝
令牌桶算法限流
public class TestRateLimiter {
public static void main(String[] args) {
//1秒产生1个令牌
final RateLimiter rateLimiter = RateLimiter.create(1);
for (int i = 0; i < 10; i++) {
//该方法会阻塞线程,直到令牌桶中能取到令牌为止才继续向下执行。
double waitTime= rateLimiter.acquire();
System.out.println("任务执行" + i + "等待时间" + waitTime);
}
System.out.println("执行结束");
}
}
public class TestRateLimiter2 {
public static void main(String[] args) {
final RateLimiter rateLimiter = RateLimiter.create(1);
for (int i = 0; i < 10; i++) {
long timeOut = (long) 0.5;
boolean isValid = rateLimiter.tryAcquire(timeOut, TimeUnit.SECONDS);
System.out.println("任务" + i + "执行是否有效:" + isValid);
if (!isValid) {
continue;
}
System.out.println("任务" + i + "在执行");
}
System.out.println("结束");
}
}
异步下单
服务降级
总结
推荐阅读
Kubernetes 企业运维进阶实战 某大型证券公司DevOps持续交付应用实践 vivo 公司 Kubernetes 集群 Ingress 网关实践 Kubernetes 实现灰度和蓝绿发布 Gitlab+Jenkins+k8s+Helm 的自动化部署实践 民生银行 IT运维故障管理 可视化案例 Nginx配置中一个不起眼字符"/"的巨大作用,失之毫厘谬以千里 Kubernetes上生产环境后,99%都会遇到这2个故障 K8s kubectl 常用命令总结(建议收藏) Kubernetes 的这些核心资源原理,你一定要了解 基于Nginx实现灰度发布与AB测试 编写 Dockerfile 最佳实践 12年资深运维老司机的成长感悟 搭建一套完整的企业级 K8s 集群(kubeadm方式)
点亮,服务器三年不宕机
评论