重庆公路客运联网售票网的一起"事故"

来源:互联网 发布:软件流程 编辑:程序博客网 时间:2024/06/10 03:29

事情的起因

起因是这样的:
2017年1月28日我高高兴兴地在重庆公路客运联网售票网 订好了2017年2月4日的车票,付款收到.
短信
万事具备,就等出发了, 发车时间是8:30. 我8:10到达车站取票, 在自助取票机上却没有取出来,于是找到售票窗口的美女给我看看能不能打印车票. 查了我的身份证, 要了订单号.却还是打印不出来. 于是被告知我的情况被登记,车票没有成功购买,需要自己再重新买票,之前买票的钱核实后会退回…

感觉这个玩笑开得有点大了,后来几经周折才没有耽搁行程. 先不讨论这个事情的责任在何方, 我在此仅从技术的角度分析导致问题的原因.

分析问题

在与客运司机沟通后我得到了一个比较重要的信息:类似的问题出现过不止一次.
所以我认为该系统可能存在以下几个方面的问题。
1、系统订单不可靠,会有无效的支付成功的订单产生
表现:订单支付不可靠,订单支付成功后,用户却无法找到对应的班车信息
可能原因:
A. 未作锁定处理,同一个座位被多个订单同时争夺,最终成功售出的座位却只有一个。
B. 数据库数据写入失败,写入失败后未做相应的回溯处理,座位还是未售出的状态,但订单付款已成功
2、数据丢失后系统未通知用户
表现:直到旅客取票时才得知订单无效,需要重新购票.
可能原因:
A. 订单未锁定的情况.系统本身是无法得知问题已经出现的,所以更不可能通知用户。
B. 数据库回溯不彻底.比如成功支付订单与座位成功售出作为一个原子操作。很可能先支付成功写入,却在座位售出的数据库写出出错。程序没有正确对售出数据库出错的处理,也就是说程序知道出了错,但就是不处理。
C. 数据丢失. 数据库重要数据被恶意(入侵者)或无意(运维人员)删除.

确定问题

通过以上的分析,开发或运维人员可以从系统相关日志以及系统单元测试或流程文档或者对应代码直接确定问题原因。

解决方案

1.如果确定是锁定上出了稳定,唯有加锁,也许加锁会导致系统效率降低,如果效率对用户体验影响很大,这也需要从系统设计上优化了.
2.如果确定是数据库写入出了问题,一定要做好容错。不过容错也只是治标不治本,还需要测试下失败的几率是否在可接受范围。数据库出差几率高的话,可能要从数据库软件、硬盘、操作系统等方面查找.
3.如果真是数据库丢失, 那么必须考虑数据库备份机制是否完善.

最后我想说:任何系统都不可能保证没有漏洞,但是如此大的一个公共系统,涉及众多经济利益,实在不应该出现这样的问题。

1 0
原创粉丝点击