初步认识web服务并发请求带来的线程安全问题

本文介绍了web服务中的并发请求处理,从HTTP、TCP连接到Tomcat的线程池机制。讨论了JavaWeb和SpringWeb中线程安全问题,强调在Spring框架下,由于对象默认为单例,需要关注无状态业务类的设计以避免线程安全问题。同时,通过nginx和Tomcat集群提高并发量,并引入分布式事务解决微服务场景下的并发安全。
摘要由CSDN通过智能技术生成

前言

个人对web服务并发请求带来的线程安全问题的初步认识。看个乐子就好。

基础
  • 网站输入一个网址,有浏览器应用程序发起的请求是应用层请求也就是http请求,请求一个页面在浏览器上展示用于与用户交互。http请求是应用层通信,依托于应用层的下一层运输层tcp连接,tcp需要三次握手构建客户端和服务端之间稳定的网络连接,来在此基础上进行http请求。
  • tcp连接和数据通信需要服务器来处理,这就有了服务端处理网络请求的应用程序,tomcat就是这样一个应用程序,也可以简单抽象理解为一个web服务器,当然实际web服务器也包含硬件服务器主机计算机的抽象。
javaweb
  • WEB服务器中的tomcat服务程序的Servlet容器来处理TCP连接来交互;在代码上建立了客户端和服务端的socket通信,也就是客户端和服务器双方都需要创建socket对象绑定地址后,来进行tcp三次握手。
  • 很多用户可以同时访问同一个网站,也就是一个服务器需要同时处理大量的请求。每一个客户端请求都需要建立双方的网络链接,所以tomcat就会使用多线程的机制,每一个不同客户端的请求就开启一个线程建立socket连接。tomcat维护一个线程池,可以进行配置,一个tomcat服务同时处理500-1000个连接。每个线程都要使用程序、操作数据库。多个线程可以使用同一个对象(需要考虑线程安全问题和数据库线程安全),也可以在每个线程中创建自己的对象使用(线程操作自己的对象不存在公共资源所以不需要考虑线程安全,但是需要考虑数据库安全,只要多线程操作数据库就需要考虑事务问题。)
springweb
  • 不再使用javaweb的古老开发方式,使用spring框架简化web项目的开发,将对象创建交给spring进行管理。spring的对象默认都是单例的,使用tomcat插件或者tomcat应用运行spring创建的web项目的时候当然就存在线程安全的问题。但是我们使用springMVC最佳实践开发web项目时,创建(dao\service\controller)几乎不会考虑线程安全,从而忽略了这个问题,是因为业务类中只有业务方法,没有成员变量(除了自动注入的依赖)。对象的成员变量标识了对象的状态,另一个线程操作单例对象修改了成员变量就改变了当前线程的对象的状态才出现线程安全问题。所以spring的web项目需要考虑并发下的线程安全问题。当然我们很少在web项目中使用成员变量,如果要使用可以使用synchronized来加锁保证线程安全。
  • 以上着重说明是程序中的数据安全,也就是保证对象的并发安全。数据库的并发安全问题只要存在并发访问就一定存在,所以需要事务来保证数据安全。可以使用spring的声明式事务来解决事务问题。
  • 在实际springMVC项目中我们会使用nginx(单台或集群) + tomcat(集群)的方式来提高并发量,一台tomcat只能处理1000请求,使用nginx(可以处理10w并发)反向代理,来分发请求到不同的tomcat上来提高并发。这时候仍然可以使用声明事务来解决并发问题。
分布式
  • 在springboot做微服务分布式项目后,因为微服务之间存在级联调用问题,一个事务要在服务间实现,就需要使用分布式事务来解决并发安全问题了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值