12306 抢票的糟糕体验

又到了一年一度的 12306 抢票时,和秒杀,抢购一样,这种事往往给人的体验非常差,去年经历过上海四月的应该深有感触。
我此前论述过随着网络带宽增加的速度超过 buffer 容量增加的速度,端到端拥塞控制将越来越不起作用,因为一个拥塞周期相对于反应时间来说,太短了,换句话说,来不及反应。抢购体验差也是这个原因。
排队时间,服务时间,从获取信息至排队的时间,这三者若在一个量级,体验就不会差,比如老年人早市上抢购新鲜打折鸡蛋。
时间是一个杠杆,被撬动的是公平,也就是信息差。
在前互联网时代,人们步行,乘车到达火车站售票大厅,排队,咨询售票员出票,这个时间在同一数量级,那些彻夜排队的人也受制于人的生理极限,最多不过比平均时间多几倍。换句话说,时间被较粗的粒度平滑了。
在互联网时代,排队时间和一个事务处理均 ms 记,而人的操作时间在尺度上要大 1000 倍,稍微犹豫半秒就会错过 上千次请求,与此相对,你去售票大厅的路上上趟厕所蹲半小时对结果也不会有太大影响。
为了尽量保留一点公平,分批放票是最简单的方法,但在每一次的放票点,依然存在抢购时间信息差问题。
信息差不仅被时间放大,还会被时间缩小,所谓全局同步。
有 100 件货,100 个人每人限购 1 件,在抢购的场景下,时间完全校准,100 人同时抢,第一次只有 1 人成功,99 人超时沮丧,剩余 99 人继续,98 人沮丧,如此类推,平均要沮丧 50 次才能抢到,但如果把超时预期放长一些,体验就会好很多。
类似 12306 购票这种系统,一次事务需要多次操作,在首次操作提交之前就把票池锁住非常不现实,这样排队时延将快速上升到几乎无限,而人们对网络的预期反应不会超过 10 秒,超时后重试往往是拥塞加剧的根源。
和直觉相反,票量和购票人数之比并没有小到很夸张,但上述例子表明,给人的感觉就好像只有 100 张票,而买票的人超过几百万。问题不在人数,也不在票量,而在购票系统。如果差距太大,铁路部门要做的是加车,而不是优化购票系统。
再次反转,由于我们的无座票和座票卖一个价格,这就降低了他们加车的动机,毕竟加车要费油费电,但凡无座票打个折,问题就解决了,因为他们总能算出一个点,加车的全价票收益减去成本达到最大,他们总会加车,从而每人回家有车坐。
火车票并不是稀缺资源,但购票系统给了人稀缺的感觉,火车票数量本就根据潜在购票人数决定,就像带宽也不是稀缺资源,但 capacity-search 营造了稀缺的氛围,同样,道路也不稀缺,只是突发流量造成拥堵,多等等,总会到家的。
对有限资源的突发需求量,要么等,要么扩容。我强调过,网络加速的唯一方案就是升级硬件带宽,而不是靠什么算法,购票也一样,加车才有票,但往往到了最后,都会加车的,很少有人因为买不到票而无法出行。

浙江温州皮鞋湿,下雨进水不会胖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Leetcode】239.滑动窗口最大值(Hard)

一、题目 1、题目描述 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例1: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[…

AI变现项目:刚做五天收益突破单日破50+,干货经验谈

今日是我单号操作的第五天。 打开今日头条,发现收益破新高了。 我这是一个号操作,10个号,20个号呢? 下面主要说说我的操作经验。 先确定领域 我是做的情感故事领域。 为什么做这个领域?(简单,原创度高…

家用洗地机哪款好用?洗地机品牌排行榜推荐

在如今的日常生活中,家用洗地机已经成为了家庭清洁中不可或缺的工具。然而,市面上各种不同品牌型号的洗地机让人眼花缭乱,让人难以选择。那么,家用洗地机现在买什么牌子质量好呢?为了解答这个问题,笔者选了几款品牌质…

120°AGV|RGV小车激光障碍物传感器|避障雷达DE系列安装与连线方法

120AGV|RGV小车激光障碍物传感器|避障雷达DE系列包含DE-4211、DE-4611、DE-4311、DE-4511等型号,根据激光飞行时间(TOF)测量原理运行的,利用激光光束对周围进行 120 半径 4m(90%反射率)扫描,获得…

鸿蒙开发解决agconnect sdk not initialized. please call initialize()

文章目录 项目场景:问题描述原因分析:解决方案:总结:项目场景: 鸿蒙开发报错: agconnect sdk not initialized. please call initialize() 问题描述 报错内容为: 10-25 11:41:01.152 6076-16676 E A0c0d0/JSApp: app Log: 数据查询失败: {“code”:1100001,“messag…

Linux的Inode号和日志服务管理

目录 一、Inode号 1.inode和block 2.查看inode信息 二、日志服务管理 1.日志的级别 2.日志的种类 3.日志的功能和日志文件的分类 4.日志的格式和分析工具 三、rsyslog日志处理系统 1、使用Rsyslog创建日志优点 2、Rsyslog配置文件解析 3.通过rsyslog将ssh服务的日志…

基于sigma-delta和MASHIII调制器的频率合成器simulink建模与仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 Sigma-Delta调制器原理 4.2 数学模型 4.3 噪声整形 4.4 MASH III调制器原理 4.5 基于Sigma-Delta和MASH III的频率合成器 5.算法完整程序工程 1.算法运行效果图预览 其误差当系统进…

Django(五)

员工管理系统(部门管理) 1.新建项目 2.创建app python manage.py startapp app012.1 注册app 3. 设计表结构(django) from django.db import modelsclass Department(models.Model):"""部门表"""title models.CharFiel…

sentinel相关问题及答案(2024)

数据结构和算法 1、什么是哨兵值?它在算法中是如何使用的? 哨兵值是在计算中用作标记或信号的特殊值,通常用于指示数据结构的边界或结束,或者作为检测特定条件的触发器。在算法中,哨兵值的使用可以简化代码并提高效…

熟悉HBase常用操作

1. 用Hadoop提供的HBase Shell命令完成以下任务 (1)列出HBase所有表的相关信息,如表名、创建时间等。 启动HBase: cd /usr/local/hbase bin/start-hbase.sh bin/hbase shell列出HBase所有表的信息: hbase(main):001:0> list(2)在终端输出指定表的所有记录数据。 …

数据通讯平台建设方案(物联网数据采集平台)

1.数据通讯平台 软件开发全资料获取:软件项目开发全套文档下载_软件项目技术实现文档-CSDN博客 1.1.1.系统概述 对不同的数据协议、数据模式进行采集适配。基于XX智慧平台统一数据交换标准,与第三方系统对接,实现数据交换;实现不…

【金猿CIO展】是石科技CIO侯建业:算力产业赋能,促进数字经济建设

‍ 侯建业 本文由是石科技CIO侯建业撰写并投递参与“数据猿年度金猿策划活动——2023大数据产业年度优秀CIO榜单及奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 是石科技(江苏)有限公司成立于2021年,由国家超级计算无锡中心与…

ECharts 实现省份在对应地图的中心位置

使用 ECharts 下载的中国省市区的json文件不是居中的(如下图所示),此时需要修改json文件中的 cp 地理位置,设置成每个省份的中心位置 {"type": "FeatureCollection","features":[{ "type": "Feature"…

flask web学习之模板(二)

文章目录 一、模板结构组织1.1 局部模板1.2 宏1.3 模板继承 二、模板进阶2.1 空白控制2.2 加载静态文件2.3 消息闪现2.4 自定义错误页面2.5 在js和css中使用Jinja2 一、模板结构组织 1.1 局部模板 当多个独立模板中都会使用同一块HTML代码时,我们可以把这部分代码…

牛客刷题:BC45 小乐乐改数字(中等)

自我介绍:一个脑子不好的大一学生,c语言接触还没到半年,若涉及到效率等问题,各位都可以在评论区提出见解,谢谢啦。 该账号介绍:此帐号会发布游戏(目前还只会简单小游戏)&#xff0c…

如何在 NestJS 中使用 TypeORM 实现多数据库连接配置

前言 当你打算在一个 NestJS 应用中操作多个数据库时,TypeORM 提供了优雅而强大的解决方案。在本教程中,我们将一步步了解如何在 NestJS 项目中配置 TypeORM 以使用多个数据库。 实现步骤 一、创建 NestJS 项目 如果你还没有一个 NestJS 项目&#x…

P9 视频码率及其码率控制方式

前言 从本章开始我们将要学习嵌入式音视频的学习了 ,使用的瑞芯微的开发板 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《Linux C应用编程(概念类)_C…

《微信小程序开发从入门到实战》学习七十五

6.8 文件API 6.8.4 删除文件API 使用wx.removeSavedFile可删除小程序中保存的本地文件。示例代码如下: // 获取文件列表 wx.getSavedFileList({ success(res) { if (res.fileList.length > 0) { // 删除第一个文件 wx.removeSavedFile({ filePath: res.fileLis…

react中使用 react-draggable 问题总结

react-draggable 是在使用 React 时经常用到的拖拽库,不过在使用时,下面是一些常见的问题,做此记录 1、在移动端中使用 react-draggable 进行拖拽操作时,在拖拽内部onClick事件是失效的 解决方案:使用onTouchStart来替换onClick事…