極端繁忙情況下的票務分發系統

2021-06-27 07:41:31 字數 1269 閱讀 7088

在今年年初,我發表了高效能設計思路,兼談12306(2014.1.20)。有個問題只講了一部分,就是在極度繁忙的情況下如何出票。問題的**是有人說火車票派作為很複雜,是耶非耶?

前提條件:我們討論的是極度繁忙的情況,例如在秒級的時間,某趟列車的火車票全部銷售一空。

為了能在最短的時間內滿足使用者出票申請,也就是秒殺座位,使用者訂票可以分為訂座位和分配作為兩個步驟。

1、訂座位

這個在高效能設計思路,兼談12306已經提到了。例如列車a從廣州發往北京,中間停9個站,共有500個二等座位,100個一等座位。由於使用者買票的同時指定了買二等票還是一等票,這相當於兩個商品:

商品1、列車a從廣州發往北京,中間停9個站,500個二等座位

商品2、列車a從廣州發往北京,中間停9個站,100個一等座位

兩個商品分別處理便罷。我們就拿商品1來看。商品1實際可以按每站分為10個貨品,如下圖所示。使用者購買站2到站6的票,實際上是要求同時購買貨品3、4、5、6。如果當中有某個貨品,例如貨品4的存貨量為0,則購買失敗,否則成功地訂到票。

將乙個複雜的,不確定起點和終點的票,分割後,實現就很容易,簡單的減法就可以了。

2、如果最優地分配座位

使用者訂到票後就分配座位。能夠先訂後分配在於我們的前提條件,極度繁忙的秒殺座位。先提示使用者成功訂票,然後在顯示座位。由於使用者人工操作時間和人的感知時間,所以兩者之間的幾秒的等待時間是可以容忍的,例如可以讓使用者多操作一下,例如進入預定付款確認之類的。

當所有的票都訂光收,看如何最優分配作為。

2.1 我們希望同乙個使用者等分配到同乙個位置

即使用者購買的貨品3、4、5、6對應的同乙個位置。這很容易。假設火車是不指定座位的,而通過訂票,我們確保每個站路程所有使用者都有座位,那麼新上車的使用者就找空位坐就行了。

所以,我們從先上車的使用者開始分配。先分配從廣州上車的,再分配站1,然後分配站2……,每次都在當前空閒座位中分配,就可以很好解決這個問題。

2.2 我們希望結伴而行的使用者能分配到相鄰的位置

要完全滿足可能有困難,實現的演算法也會比較複雜,但是要盡可能滿足就比較容易。要盡可能分配到相鄰的位置,既要有相鄰的空位,所以在分配座位的使用,除了按起始站的先後順序給乘客分配座位,另乙個原則是相同終點站的乘客盡可能安排在一起,如盡快能安排在同一車廂。這樣每次到站,空座位就盡可能連在一起,方便分配相鄰座位。

DNA也會遭黑客攻擊?極端情況下將威脅生命

大西洋月刊 日前撰文介紹了乙個計算機安全團隊的實驗,稱隨著基因測序變得越來越普遍,研究人員也面臨著安全隱患。以下為原文內容 dna基本上就是一種儲存資訊的方式。它編寫指令,只不過這些指令是用來創造生命的 但是,dna也可以用於其他用途。已經有些科學家在使用dna來儲存書籍 gif,甚至是亞馬遜的禮品...

各種情況下的console

以一位良師益友 1.輸出到日誌 console.log x 2.顯示乙個物件所有的屬性和方法。console.dir obj 3.佔位符 只支援字元 s 整數 d或 i 浮點數 f 和物件 o 四種。如 console.log d年 d月 d日 2011,3,2 console.log 圓周率是 f...

受限情況下的程式除錯

平台不支援,例如 之前使用一款rk的晶元,晶元原廠告知不支援gdb除錯,原廠未移植成功。資源受限,例如 低端產品資源不足或者缺失關鍵資源 記憶體,儲存空間或者cpu效能不足,物理介面只有串列埠等 導致gdb無法執行。特殊時期,產品無法使用gdb除錯,例如 測試,生產,售後時期都無法再通過gdb除錯。...