高并发售票系统,系统设计

青楼好梦 2016-10-15 11:22:02
售票系统,怎么解决高并发? 求大神指导。
假设AAA演唱会 门票限量100张
1. 用户A购买90张,用户B购买5张, 同时支付成功。怎么分配票才能避免B分配的不是A买过的。(A也有可能支付失败)
2. 用户A购买90张,用户B购买20张,同时支付成功。怎么判断余票已不足。

分数不多,请大家帮忙提供一个具体的实现逻辑过程。
...全文
6465 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
维秀斯丢丢 2018-05-02
  • 打赏
  • 举报
回复
高并发一定涉及到解耦,那么消息队列 几乎是必用的。
维秀斯丢丢 2018-05-02
  • 打赏
  • 举报
回复
按京东的来说吧,订单提交后,是进入队列的,a订购90张请求先排队,且订购成功,那么B是买不到了的,会返回失败。
sp1234_maJia 2018-05-01
  • 打赏
  • 举报
回复
引用 楼主 tomyang7962 的回复:
售票系统,怎么解决高并发? 求大神指导。 假设AAA演唱会 门票限量100张 1. 用户A购买90张,用户B购买5张, 同时支付成功。怎么分配票才能避免B分配的不是A买过的。(A也有可能支付失败) 2. 用户A购买90张,用户B购买20张,同时支付成功。怎么判断余票已不足。 分数不多,请大家帮忙提供一个具体的实现逻辑过程。
单品管理就不可能出现1.的情况,因为分配是一瞬间的“转移库存”动作,随后不需要加锁,因为票的自然属性就是配到人的。而余票不足的判断,是以转移库存为依据,当没有哪一个号码的票可以转移了自然就不足了。 所以当年 12306 之所以前2年之所以搞不好系统,估计很大程度是体制问题,滥用数据库视图和增删改查语句之类的,而自己并不动手编写多线程、Task、SOA之类的复杂业务处理程序。
  • 打赏
  • 举报
回复
说白了,数据库加锁是浪费了1万倍的系统资源,但是通过多线程加锁互斥也是浪费了100倍的系统资源。 通过简单的业务重构,使得大规模数据库处理完全不用加锁,完全不用考虑线程互斥,完全是单线程不用任何保护、判断就能顺利处理各种业务。于是程序运行起来就是轻量级的,原本只能并发处理100个的事务,现在可以并发处理50000个事务,每一个事务都是极其细小的事务单元,但是内部封闭、不用考虑多线程编程问题。也方便于将这些对象不属于单独的 SOA 服务器上去处理。
  • 打赏
  • 举报
回复
假设你一直以为这时候的商品是按照品种来卖(同一品种的单品全都是相同的商品编号),那么这种业务设计,本身就造成随后的业务处理处处都在阻塞。
  • 打赏
  • 举报
回复
秒杀这类业务的高并发解决之道是业务问题,不仅仅是技术问题,至少技术是次要的问题。简单说,一旦发生接近于秒杀的事情,那么商品就不是按照品种来卖,而是按照单品来卖,对于电影票来说就是按照座位号来卖,一切业务都按照单品管理,那么只有一开始从单品列表上取下(移除)单品编号需要瞬间的阻塞(纳秒级的),所有后续长事务都相互隔离、不可能加锁(毫无必要加锁)。这个时候纠结加锁问题其实就是想多了。
qq_36265680 2018-04-18
  • 打赏
  • 举报
回复
看了下, 上面所有的回答,都是不能解决楼主的问题的。 高并发,比如有1000个人,1W个人在同时抢呢? 这个问题的解决是需要在写code的时候,要做线程同步处理,通过线程的死锁,这样的话,虽然是不同的客户端发起的,每个客户端是一个线程,这样就看CPU随机分配,分配给谁,谁接收到之后,就将处理下单的方法锁住,这样剩余9999个人都处于wait 状态中。然后等这个人操作完了,才开始CPU继续随机分配,直到分配完成,最后每个线程都处理完成,在票售完后,wait的进程等轮到的时候自然是没票了。
cy2889792 2018-02-23
  • 打赏
  • 举报
回复
下单的时候先把订单数据放到消息队列里面, 然后开一个异步线程实时接收消息队列的订单数据,每接收一条数据就处理一条数据。 这样就能处理好并发的问题了。这也是目前比较成熟的处理方式。
anythingBlank 2017-08-15
  • 打赏
  • 举报
回复
在程序本身使用队列。 数据库的可用事务,锁
yuquan1987 2017-08-15
  • 打赏
  • 举报
回复
虽然不知道你用什么开发,我只说一个思路,比如在数据库层面,这个可以用事务+锁机制的方式 1.首先是开事务 2.在查询分配票的时候,用with(rowlock,xlock,readpast)的方式,用于隔离排他,这样a用户和b用户各自查询到的票都是不一样的 希望能对你有帮助
Jason_0927 2017-01-04
  • 打赏
  • 举报
回复
我觉得你可以像某票一样,下单锁定车票票号,然后是支付过程,这样是最有效的解决出现同时的状况
software_artisan 2017-01-04
  • 打赏
  • 举报
回复
在提交数据时,需要检查所选的票是否被占,如故被占,则下单失败,需要让用户重新下单。12306不让选座的原因就是高并发时,指定具体的票太容易和别的购票者冲突造成无法下单,不给选座就可以避免这个问题,只要票数够就可以下单成功。
software_artisan 2017-01-04
  • 打赏
  • 举报
回复
你首先要明白100张票不是票x100,而是票1、票2、票3……票100。如果这点理解不能的话,下面就没必要看了。 然后,用户在购票时,需要选择票,就是购买譬如票88而不是票,如果不需要选择票,那就系统自动帮用户选择票。在此,这张票(票88)需要和用户进行绑定。但是,用户或系统不可以选择已『有效』绑定用户或已付款的票。这个绑定关系只维持一个较短的时间,譬如30分钟。也就是说这个关系如果超过了设定的时间,就是无效的。 这样,你永远不用担心把一张票卖给多个用户。
那城 2016-10-17
  • 打赏
  • 举报
回复
每张票都是有编号的,先锁定最先的。
  • 打赏
  • 举报
回复
其实就跟某票一样,下单成功时就将席位锁定了,或者加字段来标记锁定。然后才是支付过程 查询的时候席位表.Not Exists(席位号 = 订单表.Where(等待支付且未超时或已支付).席位号)
  • 打赏
  • 举报
回复
在你的问题中,题目跟你描述的“1、2”本身并不对应。你的问题写的是“高并发”,而你具体的问题描述却是问“数据一致性”,无法判断你是否在提出问题之前已经有过一定的技术推导、无法判断你问的深入一点的设计逻辑是什么样的。
  • 打赏
  • 举报
回复
这要看你所谓的“高并发”是什么强度的“高”并发。 关系数据库是性能的瓶颈,而许多人除了依赖频繁地查询和存储数据到关系数据库,大概也就不会编程了。因此高并发的系统设计,核心要点就是:对于瓶颈操作,看你脱离数据库之后能如何设计。
threenewbee 2016-10-15
  • 打赏
  • 举报
回复
事务队列,排到谁算谁的
毕业设计是高等教育阶段学生在完成学业前所进行的一项重要学术任务,旨在检验学生通过学习所获得的知识、技能以及对特定领域的深刻理解能力。这项任务通常要求学生运用所学专业知识,通过独立研究和创新,完成一个实际问题的解决方案或者开展一项有价值的项目。 首先,毕业设计的选择通常由学生根据个人兴趣、专业方向以及实际需求来确定。学生需要在导师的指导下明确研究目标、问题陈述,确立研究的范围和深度。毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用各种研究方法,如实验、调查、案例分析等,以获取必要的数据和信息。通过这些活动,学生能够培养扎实的专业技能,提升解决实际问题的实际能力。 第三,毕业设计的撰写是整个过程的重要组成部分。学生需要将研究过程、方法、结果以及结论等详细记录在毕业论文中,以展示其研究的全貌和成果。同时,撰写毕业设计还有助于提高学生的学术写作水平,培养清晰、逻辑的表达能力。 最后,毕业设计的评价通常由导师和相关专业人士进行。评价标准包括研究的创新性、实用性、方法的科学性以及论文的质量等方面。学生在毕业设计中获得的成绩也将直接影响其最终的学业成绩和学位授予。 总的来说,毕业设计是高等教育中的一项重要环节,通过此过程,学生不仅能够巩固所学知识,还能培养独立思考和解决问题的能力,为将来的职业发展奠定坚实的基础。
毕业设计是高等教育阶段学生在完成学业前所进行的一项重要学术任务,旨在检验学生通过学习所获得的知识、技能以及对特定领域的深刻理解能力。这项任务通常要求学生运用所学专业知识,通过独立研究和创新,完成一个实际问题的解决方案或者开展一项有价值的项目。 首先,毕业设计的选择通常由学生根据个人兴趣、专业方向以及实际需求来确定。学生需要在导师的指导下明确研究目标、问题陈述,确立研究的范围和深度。毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用各种研究方法,如实验、调查、案例分析等,以获取必要的数据和信息。通过这些活动,学生能够培养扎实的专业技能,提升解决实际问题的实际能力。 第三,毕业设计的撰写是整个过程的重要组成部分。学生需要将研究过程、方法、结果以及结论等详细记录在毕业论文中,以展示其研究的全貌和成果。同时,撰写毕业设计还有助于提高学生的学术写作水平,培养清晰、逻辑的表达能力。 最后,毕业设计的评价通常由导师和相关专业人士进行。评价标准包括研究的创新性、实用性、方法的科学性以及论文的质量等方面。学生在毕业设计中获得的成绩也将直接影响其最终的学业成绩和学位授予。 总的来说,毕业设计是高等教育中的一项重要环节,通过此过程,学生不仅能够巩固所学知识,还能培养独立思考和解决问题的能力,为将来的职业发展奠定坚实的基础。

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧