Java Web应用开发案例|模拟12306抢票

简介: 模拟12306网上抢票的业务场景。春节等高峰时期,车票资源非常紧张,因此在约定时间放票,会存在大量抢票行为。服务器为了缓解并发高峰时的压力,抢票请求会用消息中间件进行排队处理。出票行为在服务器的独立线程中进行,这样主线程主要用于接收购票请求,异步线程用于出票,会大大缓解服务器的压力。

image.png


模拟12306网上抢票的业务场景。春节等高峰时期,车票资源非常紧张,因此在约定时间放票,会存在大量抢票行为。服务器为了缓解并发高峰时的压力,抢票请求会用消息中间件进行排队处理。出票行为在服务器的独立线程中进行,这样主线程主要用于接收购票请求,异步线程用于出票,会大大缓解服务器的压力。
# 01、案例:12306抢票

操作步骤如下所述。
(1) 新建控制器支持异步模式。
js @WebServlet(asyncSupported = true,urlPatterns ="/AuctionSvl") public class AuctionSvl extends HttpServlet
(2) 控制器的service()方法是一个高并发环境。
每个HTTP请求都使用独立的request对象。调用request.startAsync(),为每个HTTP请求创建一个异步回应的环境。
js public void service(HttpServletRequest request HttpServletResponse response)throws ServletException,IOException (System.out.println("servlet 主线程:”+ Thread.currentThread().getId()) //lineNum 为行号String linenum = request.getParameter("lineNum”); AsyncContext act = request.startAsync(); act.getRequest().setAttribute("linenum”linenum); AuctionListener.add(act);
(3) 所有异步回应在独立线程中统一处理。
AuctionListener实现了ServletContextListener监听器,因此在Tomcat启动时被加载。BlockingQueue为阻塞队列,装载所有与请求对应的AsyncContext对象。
js public class AuctionListener implements ServletContextListener( private static final BlockingOueue < AsyncContext > queue= new LinkedBlockingOueue < AsyncContext >(); private volatile Thread thread; public static void add(AsvncContext c)queue.add(c); contextInitialized(); //参见下面的代码实现
ServletContextListener的contextInitialized()方法代码如下,独立的后台线程从队列queue中顺序提取AsyncContext对象,然后分别调用每个AsyncContext的response对象,给不同的客户端回应数据。
js public void contextInitialized(ServletContextEvent servletContextEvent) (thread = new Thread(new Runnable() public void run(){ while (true) AsyncContext acontext = null; while ( queue.peek() != null) try{ acontext = (AsyncContext)queue.poll(); ServletResponse response = acontext.getResponse();response.setContentType("text/html;charset = utf - 8");PrintWriter out = response.getWriter();Thread.sleep(200);String name ="异步线程:” +Thread.currentThread().getId();long duration = System.currentTimeMillis(); //提取前面输入的行号,并输出 out.println(acontext.getRequest().getAttribute("linenum") } "+ name +”"duration) out.close(); catch (Exception e) throw new RuntimeException(e.getMessage(),e);finally(if(acontext != null)acontext.complete(); thread.start(); } }
(4) 客户端模拟多用户并发抢票,循环发出20个异步请求。
js S.ajax( url:"AuctionSvl" type: "post" dataType:"html" data: data, timeout:50000 cache:false dataFilter:function (data,type) (return data; success:function(data,testStatus)var dataArray = Array();dataArray = data.split("")* 填充表格 *$("# tablel").append("< tr id='tr"+ i+ "class = 'mytr'></tr>") ;for(var j=0;j< dataArray.length; j++)[ $ ("#tr"+ i).append("< td>" + dataArray[j] + "</td>") error:function(msg) );
(5) 对比服务器异步回应和同步回应,异步抢票结果见图1。
在这个示例中,所有用户的并发购票请求,都会先存在一个阻塞队列中,然后由一个后台异步线程,顺序从阻塞队列中提取请求,当出票结束后再回应客户端。这样做的好处是服务器的压力很小,虽然用户的等待时间较长,但是这样保证了用户购票请求的正确处理。

image.png


■ 图1 12306抢票

目录
相关文章
|
1月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
206 4
|
2月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
339 1
|
2月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
307 0
|
1月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
2月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
2月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
105 0
|
3月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
293 1
|
Java Docker 微服务
微服务架构已成为Java Web开发的新趋势,它通过将应用分解为独立、可部署的服务单元,提升了系统的灵活性与可维护性。
微服务架构已成为Java Web开发的新趋势,它通过将应用分解为独立、可部署的服务单元,提升了系统的灵活性与可维护性。每个服务负责特定功能,通过轻量通信机制协作。利用Spring Boot与Spring Cloud等框架可简化开发流程,支持模块化设计、独立部署、技术多样性和容错性,适应快速迭代的需求。
202 1
|
Java Spring 开发者
Java Web开发新潮流:Vaadin与Spring Boot强强联手,打造高效便捷的应用体验!
【8月更文挑战第31天】《Vaadin与Spring Boot集成:最佳实践指南》介绍了如何结合Vaadin和Spring Boot的优势进行高效Java Web开发。文章首先概述了集成的基本步骤,包括引入依赖和配置自动功能,然后通过示例展示了如何创建和使用Vaadin组件。相较于传统框架,这种集成方式简化了配置、提升了开发效率并便于部署。尽管可能存在性能和学习曲线方面的挑战,但合理的框架组合能显著提升应用开发的质量和速度。
416 0