Just Me ...
好的/谢谢/知道了~
Enterprise Architect画图
ABBYY_Screenshot_Reader_11_TrialOCR识别
在线二维码识别:https://uutool.cn/qrcode-decode/
excel->markdhttps://tableconvert.com/own
华为体检套餐:南京华为454套餐A(男性≤35岁)
https://www.hackerrank.com/tests/fq3qhfkt1qd/login?b=eyJ1c2VybmFtZSI6ImFpdGhvc2FAb3V0bG9vay5jb20iLCJwYXNzd29yZCI6ImE0NTZjMTk2IiwiaGlkZSI6dHJ1ZSwiYWNjb21tb2RhdGlvbnMiOnsiYWRkaXRpb25hbF90aW1lX3BlcmNlbnQiOjUwfX0=
https://bsurl.cn/J9VCgVqItxwv2
https://bsurl.cn/v2/KTZuVavv
16岁以下和70岁以上没法预定机票协议价,会转公布运价
16-18算成人票,但是又不能享受协议价
18岁就可以带儿童,16-18是成人票但是不能带儿童
儿童本身是半价(公布运价/全价的半价,成人儿童同舱)
乘机当天的年龄,不是购票的年龄
日历推送:每个日历事件需要一个ID,后续需要通过这个Id进行删除操作对于预定:乘客每个人用的都是票号,预定人用的是操作单号,每个人独立发送即可对于改期:是先增加新的日历事件,再删除老的时间1.增加:这个方法和预定日历是一样的,改签预定人用的是改签操作单的Id2.删除:这也是个公用方法,和退票一样。由于预定和改期都可以生成事件,所以删的时候也要区分是改期删还是退票删。改期删除预定人用到的是原预订单的Id(由于火车只能改一次,所以就是预订单),退票删除用的是当次操作单(退票单)关联的票(取第一张,也和火车票一次只能退一张也有关),关联的预定或者改期单(票一定是从预定或者改期来的)。但是这里有个判断,如果原操作单所有票都退掉了,这时才删除预定人日历。删除乘客的日历相对来说较简单,如果是改期,用原票的Id删除事件,如果是退票,用当前票号删除事件
预定时会选择是否是抢票以或者预售,目前仅支持一个火车班次预售,即火车班次+出发日期+坐席列表组合,生成这么多需求单,其中第一个为首选的需求单,有个字段标记true
预售和抢票定时任务
查找操作但类型是预售以及抢票的,并且状态是等待处理、处理中、已创建之后以操作单维度逐个处理,过滤掉需求单在处理中的操作单;操作单非目标状态不处理,查询处理到处理前已经有其他任务处理了设置操作单状态(PROCESSING)
如果是抢票且任一需求单尝试过预售了,直接发起抢票如果是预售 或 抢票没有尝试下单过,则开始预售过程
data:image/jpeg;base64,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
抢票:直接向网关发起抢票请求如果请求成功了,就回写订单的SupplierOrderId,把操作单状态设置为PROCESSING如果失败了,1.先设置需求车次状态(查找操作单),如果等待处理的需求单还有并且是抢票,就WAIT_PROCESS->PROCESS_FAILED, 所有车次都设置为失败了;否则获取处理中的需求单,PROCESSING->PROCESS_FAILED, 抢票预售PROCESSING->WAIT_PROCESS(需求单如果是抢票,就设置成WAIT_PROCESS,否则预售是PROCESS_FAILED)2.看是不是需要继续处理,如果是预售并且有已创建状态的需求单,就继续处理,如果是抢票并且需求单里有等待处理的,也是需要继续处理,否则不需要继续处理3.2不满足的话就是表示失败,通知出票失败(修改操作单状态,写入供应商返回的失败信息,释放TR);刷新客票状态;创建退款单,发起退款(支付中心)
抢票开始了重点来了,看看你的票抢到了吗?
§§ 重中之重之定时任务触发目前的定时任务触发是由任务调度中心统一触发的,触发时间点如下:0,1,2,3,4,5,10,20,30,40,50 0,1,2,30,31,32 * ?你看的懂吗?看下反向解析的结果吧,每小时的第0、1、2、30、31、32分的0、1、2、3、4、5、10、20、30、40、50秒的时候触发,因为开售时间都是整点或者半点,所以定时任务集中在整点和半点的前几分钟,这前几分钟的前几秒更为重要。
不可避免的先后问题当需要抢的订单数大于1时,肯定就会存在顺序的问题,目前配置是30个线程同时开始抢票拿前5秒的定时任务来看下0秒的定时任务到达机器1,机器1捞到60个待抢票单,然后用30个线程开始抢票(每一个开始前会判断一下是不是被其他机器或线程处理了)1秒的定时任务到达机器2,机器2捞到60个待抢票单,(这些单可能会和上一个的存在重复)然后用30个线程开始抢票
哪些场景可能会慢?一次捞出60个,虽然是第0秒触发的,但是你排在第60位,所以可能不如后面的定时任务触发的快第二个定时任务虽然也捞出来60个订单,但是会存在和第一个定时任务重复的订单,虽然有并发控制,但是这个定时任务可能实际只能处理30个订单,其他的都是重复的,存在浪费的可能就是上面提到的,目前使用任务调度中心存在一个问题就是一次只能调度一台机器,存在其余三台(生产环境目前是4台机器的集群)闲着的情况
抢票不是一个需求单一个需求单分别抢的,而是把所有信息一次提供给高铁管家
预售 或 抢票没有尝试下单过先检查余票,如果有余票的话先发起占位,否则发起抢票,同上如果是预售,并且没有CREATED的需求单了,就通知没有余票(出票失败流程)
检查余票,需求单按车次分组,每个车次都检查下余票,如果所有坐席都没票,记录所有该车次需求单状态,PROCESS_FAILED(纯预售,抢票是改成WAIT_PROCESS)
如果有余票,遍历该车次的需求单,检查对应座位有没有票,没有同上,只针对哪个需求单,有的话:1.先更新需求单信息,主要是保存TrainSecrets和票价2.更新客票和车次信息,用先匹配的需求单里的座位更新到订单里(航段、票价,座等)随后发起占位
如果已经预售失败了, 直接抢票
预售且没有其他需求车次(没有CREATED需求单),通知失败
预售抢票定时任务,一个操作单会关联多个需求单,按车次分组(引用map,这样遍历的时候trainNoMap.values()可以遍历不同车次),每个车次校验余票(不考虑日期),遍历这个车次所有的需求单,检查每个坐席的余票,如果找到有满足的余票的坐席,就校验有余票成功,不看其他的了,之后更新这个需求单,用setTrainSecrets和票价,用需求单更新票(座等和票价)和TrainSegmentDo(车次信息)如果该需求单坐席无余票,就更新为WAIT_PROCESS(QP),PROCESS_FAILED(预售)如果该车次都无余票,更新多有该车次的需求单(这里没更新操作单或者订单)。之后发起占位,这个和非预售就大体相同了,
如果最外层的检查余票失败,会看是不是预售,并且是否所有操作订单关联的需求单都没有已创建的了,是的话正式通知余票不足出票失败
检查车次停售的预售单定时任务获取可售期内预售单,查到后调用车次校验接口,如果查不到代表车次停售了,发短信告诉乘客(仅仅发短信,不做其他操作)
预售和抢票核验乘客定时任务"查找预售操作单,取出乘客信息,逐个发送到网关核验
车站预售时间的变更分为两种,预售期的修改,车站预售时间的修改
火车票标签:运行最短、曾经买过、最多预订曾经买过
用户上一次购买该条线路的车次数据,记录为曾经买过标签。上一次的时间控制在3个月之内。超过3个月之后该标签失效最多预订
规则举例:
用户搜索在预售期外的、某条线路的车次,则不返回该标记
key是出发+到达站,分组为map,之后选出每个对的前7个车次,然后把最终的数据保存到数据表里,这些当月数据都是true状态
库存查询时会把表里所有状态为true的数据都查走
最多预定,库存查到后会转为set,key是车次+出发+到达,每天查询一次匹配标签时,遍历车次,有满足的就都打上标签曾经预定的key也是这个
火车票如何保证预售抢票拿到可用的车次密钥:余票校验
火车票:搜索+余票校验
下单:进入下单页面,选择乘客会触发乘客校验(网关),提交订单(订单)后会触发余票校验(库存),校验通过会提交占位(网关),占位是异步的,之后网关会通知订单占位的结果,并修改操作单,此时前端会轮询操作单状态,占位成功后会跳转支付,支付页会查询支付产品信息并展示用户支付后会发起提交支付请求到支付中心,支付中心会查询订单支付金额及信息(订单),然后向支付中心提交支付,支付中心之后会通知订单结果,订单收到结果之后会发起出票(网关),网关出票之后会通知订单结果,订单获取结果之后会发短信给用户
火车票的车站下钻(下钻+按城市查询)火车票的标签抢票+预售
火车票:发车前25分钟,不提供线上购票,这个在前端有判断,另外也是常规逻辑。
紧急代购标签:取消限制,搜索到车次后,如果供应商能返回25分钟以内的车次,直接展示(过滤8分钟以内的,检票出票5分钟,缓冲3分钟),8-25分钟的车次座位会打标签,预定需要单独收费,不同意的话就只能去车站购票。
供应商不返回的话可以靠主动被动缓存
如果无法返回25分钟内车次或者需要多个供应商组合,则进行组合查询,这个按后期的接入供应商策略再定内容: 标题:紧急代购服务 文案:距离发车前25分钟内,只能选择紧急代购服务或者您可自行前往车站购票。请确认能够按时赶到检票口,过期不退。是否成功以最终短信通知为准。{ 线上购票费用为 ¥X/人 } 操作:前往车站购票 | 继续紧急代购服务 规则:针对自付费的场景,选择露出括号中内容。
参考携程
称呼
Email
网站
内容
提交评论
Enterprise Architect
画图
ABBYY_Screenshot_Reader_11_Trial
OCR识别
在线二维码识别:
https://uutool.cn/qrcode-decode/
excel->markd
https://tableconvert.com/own
华为体检套餐:南京华为454套餐A(男性≤35岁)
https://www.hackerrank.com/tests/fq3qhfkt1qd/login?b=eyJ1c2VybmFtZSI6ImFpdGhvc2FAb3V0bG9vay5jb20iLCJwYXNzd29yZCI6ImE0NTZjMTk2IiwiaGlkZSI6dHJ1ZSwiYWNjb21tb2RhdGlvbnMiOnsiYWRkaXRpb25hbF90aW1lX3BlcmNlbnQiOjUwfX0=
https://bsurl.cn/J9VCgVqItxwv2
https://bsurl.cn/v2/KTZuVavv
16岁以下和70岁以上没法预定机票协议价,会转公布运价
16-18算成人票,但是又不能享受协议价
18岁就可以带儿童,16-18是成人票但是不能带儿童
儿童本身是半价(公布运价/全价的半价,成人儿童同舱)
乘机当天的年龄,不是购票的年龄
日历推送:
每个日历事件需要一个ID,后续需要通过这个Id进行删除操作
对于预定:乘客每个人用的都是票号,预定人用的是操作单号,每个人独立发送即可
对于改期:是先增加新的日历事件,再删除老的时间
1.增加:这个方法和预定日历是一样的,改签预定人用的是改签操作单的Id
2.删除:这也是个公用方法,和退票一样。由于预定和改期都可以生成事件,所以删的时候也要区分是改期删还是退票删。改期删除预定人用到的是原预订单的Id(由于火车只能改一次,所以就是预订单),退票删除用的是当次操作单(退票单)关联的票(取第一张,也和火车票一次只能退一张也有关),关联的预定或者改期单(票一定是从预定或者改期来的)。
但是这里有个判断,如果原操作单所有票都退掉了,这时才删除预定人日历。
删除乘客的日历相对来说较简单,如果是改期,用原票的Id删除事件,如果是退票,用当前票号删除事件
预定时会选择是否是抢票以或者预售,
目前仅支持一个火车班次预售,即火车班次+出发日期+坐席列表组合,生成这么多需求单,其中第一个为首选的需求单,有个字段标记true
预售和抢票定时任务
* 对每个预售或抢票订单: * 抢票单, 先看是否预售失败一次,是,则直接去抢票。 * 预售单,或没有没有预售购买失败的抢票单: * 查询余票,有余票,则去占位, 出票。无余票,则直接预订失败。 * 将结果刷新到车次需求表t_train_require_segment; * 如果预售失败,则检查需求单中是否还有其他车次待购买车次, 如果有则将信息刷新到预订单中, 同时将状态刷新为“待出票” * 如果没有其他待购买车次, 则将预订单状态设置为失败, 发起退款。 * 购买成功后, 按真实价格来比较一下用户的支付的票款,多了要退掉。查找操作但类型是预售以及抢票的,并且状态是等待处理、处理中、已创建
之后以操作单维度逐个处理,
过滤掉需求单在处理中的操作单;操作单非目标状态不处理,查询处理到处理前已经有其他任务处理了
设置操作单状态(PROCESSING)
如果是抢票且任一需求单尝试过预售了,直接发起抢票
如果是预售 或 抢票没有尝试下单过,则开始预售过程
data:image/jpeg;base64,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
抢票:
直接向网关发起抢票请求
如果请求成功了,就回写订单的SupplierOrderId,把操作单状态设置为PROCESSING
如果失败了,
1.先设置需求车次状态(查找操作单),如果等待处理的需求单还有并且是抢票,就WAIT_PROCESS->PROCESS_FAILED, 所有车次都设置为失败了;否则获取处理中的需求单,PROCESSING->PROCESS_FAILED, 抢票预售PROCESSING->WAIT_PROCESS(需求单如果是抢票,就设置成WAIT_PROCESS,否则预售是PROCESS_FAILED)
2.看是不是需要继续处理,如果是预售并且有已创建状态的需求单,就继续处理,如果是抢票并且需求单里有等待处理的,也是需要继续处理,否则不需要继续处理
3.2不满足的话就是表示失败,通知出票失败(修改操作单状态,写入供应商返回的失败信息,释放TR);刷新客票状态;创建退款单,发起退款(支付中心)
抢票开始了
重点来了,看看你的票抢到了吗?
§§ 重中之重之定时任务触发
目前的定时任务触发是由任务调度中心统一触发的,触发时间点如下:
0,1,2,3,4,5,10,20,30,40,50 0,1,2,30,31,32 * ?
你看的懂吗?
看下反向解析的结果吧,每小时的第0、1、2、30、31、32分的0、1、2、3、4、5、10、20、30、40、50秒的时候触发,因为开售时间都是整点或者半点,所以定时任务集中在整点和半点的前几分钟,这前几分钟的前几秒更为重要。
不可避免的先后问题
当需要抢的订单数大于1时,肯定就会存在顺序的问题,
目前配置是30个线程同时开始抢票
拿前5秒的定时任务来看下
0秒的定时任务到达机器1,
机器1捞到60个待抢票单,
然后用30个线程开始抢票(每一个开始前会判断一下是不是被其他机器或线程处理了)
1秒的定时任务到达机器2,
机器2捞到60个待抢票单,(这些单可能会和上一个的存在重复)
然后用30个线程开始抢票
哪些场景可能会慢?
一次捞出60个,虽然是第0秒触发的,但是你排在第60位,所以可能不如后面的定时任务触发的快
第二个定时任务虽然也捞出来60个订单,但是会存在和第一个定时任务重复的订单,虽然有并发控制,但是这个定时任务可能实际只能处理30个订单,其他的都是重复的,存在浪费的可能
就是上面提到的,目前使用任务调度中心存在一个问题就是一次只能调度一台机器,存在其余三台(生产环境目前是4台机器的集群)闲着的情况
抢票不是一个需求单一个需求单分别抢的,而是把所有信息一次提供给高铁管家
预售 或 抢票没有尝试下单过
先检查余票,如果有余票的话先发起占位,
否则发起抢票,同上
如果是预售,并且没有CREATED的需求单了,就通知没有余票(出票失败流程)
检查余票,需求单按车次分组,每个车次都检查下余票,
如果所有坐席都没票,记录所有该车次需求单状态,PROCESS_FAILED(纯预售,抢票是改成WAIT_PROCESS)
如果有余票,遍历该车次的需求单,检查对应座位有没有票,没有同上,只针对哪个需求单,有的话:
1.先更新需求单信息,主要是保存TrainSecrets和票价
2.更新客票和车次信息,用先匹配的需求单里的座位更新到订单里(航段、票价,座等)
随后发起占位
如果已经预售失败了, 直接抢票
预售且没有其他需求车次(没有CREATED需求单),通知失败
预售抢票定时任务,一个操作单会关联多个需求单,按车次分组(引用map,这样遍历的时候trainNoMap.values()可以遍历不同车次),每个车次校验余票(不考虑日期),遍历这个车次所有的需求单,检查每个坐席的余票,如果找到有满足的余票的坐席,就校验有余票成功,不看其他的了,之后更新这个需求单,用setTrainSecrets和票价,用需求单更新票(座等和票价)和TrainSegmentDo(车次信息)
如果该需求单坐席无余票,就更新为WAIT_PROCESS(QP),PROCESS_FAILED(预售)
如果该车次都无余票,更新多有该车次的需求单(这里没更新操作单或者订单)。
之后发起占位,这个和非预售就大体相同了,
如果最外层的检查余票失败,会看是不是预售,并且是否所有操作订单关联的需求单都没有已创建的了,是的话正式通知余票不足出票失败
检查车次停售的预售单定时任务
获取可售期内预售单,查到后调用车次校验接口,如果查不到代表车次停售了,发短信告诉乘客(仅仅发短信,不做其他操作)
预售和抢票核验乘客定时任务"
查找预售操作单,取出乘客信息,逐个发送到网关核验
车站预售时间的变更分为两种,预售期的修改,车站预售时间的修改
预售期(实际是可售期)的修改(从Apollo读取,搜索车次时会写入redis,检测到redis数据变更会通知订单),预售日期的配置修改,不分车站,全修改RequireSegmentDo,拆分为日期+时间,时间不变,但是日期根据预售期做调整,组合起来之后就是新的开售时间,其中日期是用实际车次的出发日期减去可售期-1,获得开售的日期,时间用原开售时间。
2.车站预售时间变更
日期不变,RequireSegmentDo里的开售时间直接换成车站新的开售时间即可。
火车票标签:运行最短、曾经买过、最多预订
曾经买过
用户上一次购买该条线路的车次数据,记录为曾经买过标签。上一次的时间控制在3个月之内。超过3个月之后该标签失效
获取一段时间内用户预订量最多的车次 按照车次的维度进行统计,一段时间是指当前时间的上个月。可预先跑好车次的数据,进行缓存最多预订
规则举例:
每月的1号统计上个月的预订订单车次的热门进行车次排序,记录出发车站,抵达,月份和车次,并且缓存打上标记,记录TOP7(注:并非所有车次每天都有。暂先记录TOP7)按照不同的出发车站进行统计,例如北京到上海,可能会有多个出发站,则会统计出来TOP7*N该车次失效的时间为下一次该线路的热门车次跑出来为止,如果该线路热门车次没有跑出来,继续沿用之前的缓存。保证一定有最多预订车次用户当月搜索在预售期内、某条线路的的车次,均按照该线路缓存车次,返回最多预订的标记。匹配规则按照TOP3降序用户搜索在预售期外的、某条线路的车次,则不返回该标记
如果某条线路从未有过预订,那么用户搜索的时候,默认将优先出发时间在10-16点之间,再次按照列车类型G/D/T/其他,打上标记展示给客户key是出发+到达站,分组为map,之后选出每个对的前7个车次,然后把最终的数据保存到数据表里,这些当月数据都是true状态
库存查询时会把表里所有状态为true的数据都查走
最多预定,库存查到后会转为set,key是车次+出发+到达,每天查询一次
匹配标签时,遍历车次,有满足的就都打上标签
曾经预定的key也是这个
火车票如何保证预售抢票拿到可用的车次密钥:余票校验
火车票:
搜索+余票校验
下单:
进入下单页面,选择乘客会触发乘客校验(网关),
提交订单(订单)后会触发余票校验(库存),校验通过会提交占位(网关),占位是异步的,之后网关会通知订单占位的结果,并修改操作单,此时前端会轮询操作单状态,
占位成功后会跳转支付,支付页会查询支付产品信息并展示
用户支付后会发起提交支付请求到支付中心,支付中心会查询订单支付金额及信息(订单),然后向支付中心提交支付,
支付中心之后会通知订单结果,订单收到结果之后会发起出票(网关),网关出票之后会通知订单结果,订单获取结果之后会发短信给用户
火车票的车站下钻(下钻+按城市查询)
火车票的标签
抢票+预售
火车票:
发车前25分钟,不提供线上购票,这个在前端有判断,另外也是常规逻辑。
紧急代购标签:
取消限制,搜索到车次后,如果供应商能返回25分钟以内的车次,直接展示(过滤8分钟以内的,检票出票5分钟,缓冲3分钟),8-25分钟的车次座位会打标签,预定需要单独收费,不同意的话就只能去车站购票。
供应商不返回的话可以靠主动被动缓存
如果供应商能够返回25分钟内车次,则过滤8分钟以内的(检票和出票的时间5分钟,缓冲3分钟);8分钟可配置,后续可全面放开,依靠供应商如果无法返回25分钟内车次或者需要多个供应商组合,则进行组合查询,这个按后期的接入供应商策略再定
接口对接:待后期与供应商接口进行对接内容:
标题:紧急代购服务
文案:距离发车前25分钟内,只能选择紧急代购服务或者您可自行前往车站购票。请确认能够按时赶到检票口,过期不退。是否成功以最终短信通知为准。{ 线上购票费用为 ¥X/人 }
操作:前往车站购票 | 继续紧急代购服务
规则:针对自付费的场景,选择露出括号中内容。
参考携程