黑马点评04集群下的并发安全

实战篇-08.优惠券秒杀-集群下的线程并发安全问题_哔哩哔哩_bilibili

为了应对高并发,需要把项目部署到多个机器构成集群,所以需要配置nginx。

1.如何模拟集群

通过idea的ctrl + d修改配置,实现多个tomcat运行模拟集群

然后在nginx上配置节点,8080/api 会代理到backend,然后backend配置了各个节点的信息(upstream)

实现轮询节点达到负载均衡。

2.集群引出了新的并发问题

前文在单节点情况下实现了并发安全,但是如果一个用户发两个秒杀请求,分别被nginx分配到两个节点上,那么你一个节点上的用户锁(以用户id作为监视器),不能在不同的节点上生效,这样还是锁不住同一用户的多个秒杀行为,然后还是不能保证一人一单。所以就需要分布式锁。

原因:

前文的intern()函数为什么呢即使你new了只要内容相同就会返回相同的地址呢?因为他会从字符串常量池里去找这个字符串的地址,无论你来几次,返回的都是常量池里那个字符串的地址,所以是一样的。不管你哪个线程都是在一个tomcat上运行的,只有一个jvm就只有一个常量池。

而集群部署的时候,不同服务器有自己的tomcat,那么每个服务器都有独立的jvm,所以常量池也不一样。所以无法保证intern()返回值相同,也就无法保证两个服务器上的锁监视器是同一个,也就锁不住同一个用户。

只能保证一个jvm内部锁住同一个用户,不能保证所有的jvm都锁住一个用户。

相关推荐
hakuii6 分钟前
linux中的一些配置
linux·运维·服务器
测试人社区-千羽9 分钟前
生物识别系统的测试安全性与漏洞防护实践
运维·人工智能·opencv·安全·数据挖掘·自动化·边缘计算
光影少年23 分钟前
PostgreSQL数据库学习路线
数据库·学习·postgresql
一点事24 分钟前
centos7:离线安装docker
运维·docker·容器
哈哈老师啊30 分钟前
Springboot简单二手车网站qs5ed(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
JIngJaneIL35 分钟前
基于Java+ vue图书管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue考勤管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
晚风_END1 小时前
postgresql数据库|数据库维护系列|postgresql数据库参数配置详解和数据库维护时机的选择(三)
运维·开发语言·数据库·postgresql·oracle
一 乐1 小时前
幼儿园管理|基于springboot + vue幼儿园管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
JIngJaneIL1 小时前
基于Java + vue校园论坛系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端