以資源為中心的計算機和現(xiàn)實分析

計算機的哲學都與現(xiàn)實相通切黔,但是大數(shù)據(jù)+AI讓一切有了新的可能暮的。

  1. y=f(x). 一切的任務(wù)都能抽象為對輸入進行處理漩勤,然后輸出感挥。對輸入的任務(wù)使用一定的資源進行處理,然后輸出越败;可以類比工作中對工作任務(wù)的分工和資源協(xié)調(diào)触幼。

  2. Resource. 資源。計算機中的資源眉尸,包括單機中計算(CPU)域蜗、存儲(內(nèi)存,硬盤)噪猾、網(wǎng)絡(luò)霉祸,分布式計算、存儲袱蜡、網(wǎng)絡(luò)等丝蹭,而存儲一般可以視為數(shù)據(jù);現(xiàn)實中如時間坪蚁、人力奔穿、資金镜沽;

  3. Worker. 工作者。按照業(yè)務(wù)角度贱田,計算機處理的都是一個個任務(wù)的集合缅茉,任務(wù)在計算機中的抽象模型可以分為進程/線程/協(xié)程,進程又可以分為本實例內(nèi)的進程和跨實例的不同進程男摧;現(xiàn)實中對應(yīng)任務(wù)的粒度:任務(wù)拆分蔬墩,子任務(wù)等等;

  4. ResourceType. 資源依賴的類型包括:不共享的耗拓,一人一份拇颅,沒有沖突,誰也別搶乔询,共產(chǎn)主義樟插;共享的(只讀督弓,不會沖突手报;讀寫:會有沖突,需要保證互斥)碉哑;現(xiàn)實中對應(yīng):比如一個團隊并行做兩個項目们妥。

  5. Manager. 由誰來協(xié)調(diào)和分配資源猜扮?單機上是操作系統(tǒng),分布式的話有類似NamingServer的統(tǒng)一調(diào)度角色监婶,或者像peer2peer每個節(jié)點都是對等節(jié)點旅赢,協(xié)調(diào)分配的工作由節(jié)點自己來承擔;現(xiàn)實:管理層如項目經(jīng)理等惑惶;

  6. LoadBalance. 負載均衡煮盼。分配資源的規(guī)則/算法?負載均衡無所不在带污,操作系統(tǒng)層僵控,網(wǎng)絡(luò)層,分布式層鱼冀,數(shù)據(jù)sharding層报破;可以定義為choose1fromN,即從N個元素中選出一個千绪;抽象模型為:

    1. Metadata:元數(shù)據(jù)充易,包含所有的N(node或數(shù)據(jù))的集合;

    2. Proxy:代理荸型,接口人盹靴,處理負載均衡的對象,可能在client里,也可能是一個單獨的節(jié)點稿静;上文的Manager就是一種梭冠。

    3. Workers:處理目標任務(wù)的物理實例集合N;

    4. Rule:負載均衡算法改备,如何choose1fromN控漠;

    • 平均分配,輪詢悬钳,或者哈希润脸,為保證擴展時遷移數(shù)據(jù)量盡可能小,一般用一致性哈希他去,缺點是無法范圍;

    • Range倒堕,按照數(shù)據(jù)屬性和區(qū)間進行分配灾测;

    • 按能力,根據(jù)不同節(jié)點的工作量和忙閑程度動態(tài)監(jiān)測垦巴,然后分配(活多的少分配媳搪,比如dubbo的最少活躍數(shù))

    • 加權(quán),分優(yōu)先級骤宣,比如高工VS初級程序員秦爆。

    1. Trigger:負載均衡的動作何時觸發(fā)或者配置,比如消息隊列數(shù)據(jù)的rebalance在consumer和隊列變動時觸發(fā)憔披,另外也有定時任務(wù)觸發(fā)等限,一般網(wǎng)絡(luò)訪問是請求到達時觸發(fā);
  7. Fair vs Unfair. 分配是否公平芬膝?現(xiàn)實:任務(wù)分配是否合理望门,存在閑的閑死,忙的忙死的情況锰霜,影響整體效率筹误。

  8. Lock. 資源沖突。如果資源是互斥的癣缅,一方占用了資源厨剪,沒拿到資源的怎么辦?

    • FailFast友存。報錯祷膳,異常,現(xiàn)實:沒資源爬立,處理不了了钾唬,向上反饋;還有其他的FailXXX等策略;
    • Block抡秆。阻塞了奕巍,任務(wù)執(zhí)行不了了,死等儒士;
    • Queue的止。排隊,按照先來后到排隊着撩,是否公平==允不允許插隊(不同任務(wù)的優(yōu)先級不同)诅福;
    • CAS。這次不行拖叙,下次再來試試氓润,自旋;
    • 死鎖薯鳍,你等我咖气,我等你,然后卡淄诼恕崩溪;
    • 活鎖。你讓我斩松,我讓你伶唯,然后卡住。
  9. Concurrency. 并發(fā)惧盹。如果有多個任務(wù)一塊并發(fā)到來乳幸,如何應(yīng)對?架構(gòu)钧椰,軟件工程也是工程反惕,工程的本質(zhì)遵循經(jīng)濟學,即對稀缺資源進行高效率的分配演侯,降本增效姿染。聯(lián)想生活中,假如一家餐廳有大量顧客涌入怎么處理秒际?一般情況悬赏,進行排隊,開分店娄徊,或者提前打包好套餐直接賣闽颇,對應(yīng)到軟件中,策略為:

    • 異步寄锐,使用MQ排隊下單兵多,下單后給顧客單號尖啡,訂單號了異步通知用戶;

    • 分片剩膘,sharding衅斩,一個實例處理不了,就加其他實例怠褐,然后對用戶進行分流畏梆;

    • Cache。局部性原理奈懒,即提前準備好套餐奠涌,用戶來之后不用再制作,直接就是現(xiàn)成的磷杏。

    高可用溜畅。另外,高并發(fā)/高性能的前提是高可用极祸,不能存在單點故障达皿,因此對于所有節(jié)點不能存在單點故障,需要有冗余備份贿肩,即至少每個員工,至少關(guān)鍵員工需要有backup龄寞。

    如果關(guān)鍵節(jié)點故障汰规,實在處理不了呢,只能采取兜底策略物邑,進行限流溜哮,按照能消化的流量處理

    如果還是不行,只能降級色解,有些訂單做不了茂嗓,如果還不行,只能熔斷科阎,打烊關(guān)門了述吸;

  10. Cache. 緩存。緩存無處不在锣笨。單機中:CPU中的L1/L2/L3蝌矛,內(nèi)存中的PageCache;分布式中的分布式存儲错英。抽象模型就是高一層的組件中冗余低一層組件中的數(shù)據(jù)入撒,原理是局部性原理,即2/8法則椭岩,這次訪問的數(shù)據(jù)下次還可能訪問到(當然還有其他算法)茅逮,因此需要處理:哪些數(shù)據(jù)是2璃赡,把他們放到高一層的組件;什么時候刪除數(shù)據(jù)献雅?高一層數(shù)據(jù)和低一層的數(shù)據(jù)不是同一個組件碉考,數(shù)據(jù)變化時如何保證一致性?

  11. Transaction. 事務(wù)惩琉。從業(yè)務(wù)角度上講豆励,是把低維度的原子操作從邏輯上綁定集合到一起形成的更高維的原子操作。AllorNothing瞒渠,要么全做良蒸,要么全不做。全做就是commit伍玖,全不做就是rollcack嫩痰。從邏輯上是原子,但是從物理上可能不是窍箍。在分布式場景下串纺,有各種的中間件,多個服務(wù)是跨進程的不同實例椰棘,為了保證從邏輯上是原子操作纺棺,需要底層基礎(chǔ)設(shè)施做底層的處理來保證分布式事務(wù),要使不同的進程能夠協(xié)調(diào)邪狞,需要引入第三個協(xié)調(diào)節(jié)點(TC祷蝌,MQ等),因為當前層次產(chǎn)生的問題不能由當前層解決帆卓,只能由更高一級來解決巨朦。

    舉個生活中的例子,結(jié)婚就是一個分布式事務(wù)剑令,男女雙方是兩個不同的進程糊啡,如果要保證一致性,需要協(xié)調(diào)節(jié)點吁津,即神父棚蓄。

    • XX先生,你愿意XXXX嗎碍脏?Yes癣疟,Ido。>Phase1 prepare潮酒;
    • XX女士睛挚,你愿意XXXX嗎?Yes急黎,Ido扎狱。>Phase1 prepare侧到;
    • 現(xiàn)在我宣布,XX和XX結(jié)為夫妻淤击。>Phase2 commit匠抗。
    • If不愿意,rollback污抬,回滾汞贸;離婚>回滾。

    以上就是原始版本的兩階段提交(2PC)實現(xiàn)分布式事務(wù)印机。

    另外矢腻,在達成共識前,還要雙方親朋好友使用Paxos或Raft算法(leader家長同意才是硬道理)達成共識射赛,并通過婚禮進行消息廣播多柑。

  12. Leaderless vs StrongLeader. 民主VS集權(quán)。以第9條最后為例楣责,需要分布式系統(tǒng)達成共識(這倆人到底能不能在一起)竣灌,有兩種方式,

    • Leaderless.即人人平等秆麸,一條消息要同步給所有人初嘹,沒有人是領(lǐng)導,絕對的公平民主沮趣,但是相對地低效屯烦。比如redis使用的gossip協(xié)議。

    • StrongLeader.強leader:選出leader節(jié)點兔毒,leader節(jié)點說了算,然后把消息同步給其他人甸箱。那么問題來了育叁?誰是leader?誰當皇上芍殖?leader掛了怎么辦(選誰當太子豪嗽?),這個問題在兩個人結(jié)婚找父母商量的場景可以抽象為:你看你岳父和岳母誰說話好使豌骏?這個例子不是很合適(其實也合適龟梦,兩個人私底下應(yīng)該都商量好了或者默許了誰當家~,沒意見就是默許窃躲,合理的邏輯)计贰,因為家庭的行為不夠普世。

      Election.普世的例子是領(lǐng)導選舉蒂窒,選舉的模型一般都基于Quorum模型躁倒,即大多數(shù)人同意的節(jié)點才是領(lǐng)導荞怒,領(lǐng)導擁有話語權(quán),Quorum=N/2+1秧秉,即人大代表投票褐桌,超過50%的人支持就算選舉成功。算法包括:Paxos或Raft算法象迎,zookeeper的zab荧嵌。這些算法擴展起來話題就大了,收!

      對于強leader系統(tǒng)砾淌,主要的核心工作有三種:選舉啦撮,廣播,恢復(fù)拇舀。即:選皇上逻族,登基昭告天下,選太子骄崩。

      解決的問題都是共識問題聘鳞,我們說的最多的是一致性(consistency),這也是一個大課題要拂,后續(xù)再說抠璃。

  13. Index. 逐漸增長的資源(數(shù)據(jù))需要進行檢索,那么問題來了脱惰,怎樣檢索才能更高效搏嗡?

    哲學是通過對原始數(shù)據(jù)進行關(guān)鍵信息的抽取和壓縮(信息降維),形成更高效的衍生數(shù)據(jù)拉一,先檢索衍生數(shù)據(jù)采盒,再檢索原始數(shù)據(jù)。因為需要創(chuàng)建另外一份數(shù)據(jù)蔚润,因此寫有一定損耗磅氨,需要權(quán)衡利弊進行折衷考慮(Trade-Off)。

    從低層次來說嫡纠,就是數(shù)據(jù)結(jié)構(gòu)和算法的時空復(fù)雜度烦租,從高層次來說,不同的數(shù)據(jù)結(jié)構(gòu)可以在單機中除盏,也可以成為獨立的中間件叉橱,成為一類數(shù)據(jù)結(jié)構(gòu)的中間件(數(shù)據(jù)結(jié)構(gòu)對中間件多對1),來解決不同類型數(shù)據(jù)的增刪查改需求者蠕。

    增刪查改需求進一步分析窃祝,分為讀操作,即查踱侣,檢索锌杀;寫操作甩栈,增加,刪除糕再,更改量没,但這類操作第一步需要定位到目標數(shù)據(jù),即也需要先進行檢索突想,因此檢索性能的快慢就決定了整個資源的訪問速度殴蹄。

    再極端一點說,分析不同中間件的數(shù)據(jù)模型使用的何種索引猾担,可以從數(shù)據(jù)角度了解到核心的訪問邏輯袭灯。

    比如,關(guān)系數(shù)據(jù)庫中的B+樹索引绑嘹,主要場景為范圍查詢稽荧,讀多寫少,支持排序工腋;

    Hash索引姨丈,關(guān)系數(shù)據(jù)庫有,但是我們一般不用擅腰,用的最多的是redis蟋恬,redis本身就是KV數(shù)據(jù)庫,因此用的最多的是hash結(jié)構(gòu)索引趁冈,場景自然是鍵值對查詢歼争,但對于排序的結(jié)構(gòu),用了跳表渗勘,跳表和關(guān)系數(shù)據(jù)庫的B+樹有類似之處沐绒。

    LSMTree。大部分NoSQL數(shù)據(jù)庫或者列式存儲底層的結(jié)構(gòu)都是基于LSM(Log-StructuredMerged-Tree)旺坠,主要思想是追加寫(SSTable排序字符串)乔遮,以及數(shù)據(jù)分層壓縮合并。場景是大數(shù)據(jù)量的高效率寫入价淌,而針對讀不命中申眼,使用BloomFilter進行處理瞒津。

  14. Software Match Hardare. 軟件匹配硬件蝉衣。按照12中所講,數(shù)據(jù)結(jié)構(gòu)決定了效率巷蚪,在同一種介質(zhì)中的速度差距是由算法的數(shù)學證明決定的病毡,但是在計算機中,很多情況是由于硬件結(jié)構(gòu)決定的屁柏,一切的根源在于馮諾依曼體系啦膜。比如中間件的很多底層日志是基于狀態(tài)機復(fù)制有送,WAL,WAL是基于追加寫日志僧家,對于硬盤而言雀摘,磁頭的順序?qū)懪c隨機寫速度有幾個數(shù)量級的差距,因此使用追加寫是提高硬盤寫效率的有效策略八拱,同樣CPU->總線->Memory->Disk的不同訪問速度差距也是由于物理學的限制阵赠。

    因此提高性能的一條策略就是:軟件匹配硬件(softwarematchhardware)。

  15. Struct Limit.結(jié)構(gòu)限制肌稻。 結(jié)構(gòu)限制決定系統(tǒng)上限清蚀。這就是數(shù)據(jù)結(jié)構(gòu)的底層本質(zhì),即不同的結(jié)構(gòu)能處理的數(shù)據(jù)量的上限或者速度上限是一定的爹谭。系統(tǒng)由各種元素組成枷邪,不同元素由不同的結(jié)構(gòu)組成,具有不同的屬性與限制和優(yōu)缺點诺凡,需要根據(jù)實際場景進行選擇和取舍东揣。

    最熟悉的,就是javahashmap處理hash沖突绑洛,初始使用鏈表救斑,達到一定數(shù)據(jù)量轉(zhuǎn)為紅黑樹。

    在現(xiàn)實中就是真屯,管理10個人脸候,100個人,1000個人绑蔫,10000個人乃至國家級別億級的結(jié)構(gòu)是組織結(jié)構(gòu)是不一樣的运沦。

    說俗氣一點,認知決定一個人的高度配深。而要想突破上限携添,必須有認知上的突圍和升維,才能降維打擊篓叶。

  16. Gene. 基因烈掠。一切都是系統(tǒng),計算機系統(tǒng)缸托,生物系統(tǒng)也是系統(tǒng)左敌,一個人是一個系統(tǒng),而系統(tǒng)所有的組件的最小單位-->細胞中的基因包含了一個人所有的信息俐镐,或者說元信息矫限。說明白點就是一個系統(tǒng)的原理方面的信息體現(xiàn)在一個系統(tǒng)的每個元素中。

    對于計算機而言,就是分布式系統(tǒng)的哲學在單機的操作系統(tǒng)中有同樣的體現(xiàn)叼风。分布式系統(tǒng)=操作系統(tǒng)list+網(wǎng)絡(luò)取董。

    比如操作系統(tǒng)的并發(fā)模型的進程,分布式中是跨進程通信无宿,互斥茵汰,鎖的原理類似;操作系統(tǒng)的緩存與分布式緩存的一致性孽鸡;操作系統(tǒng)的多線程處理與分布式的無狀態(tài)微服務(wù)橫向擴展都是基于分治和并行的思想经窖;

    冗余,緩存梭灿,異步画侣,批量的思想都是相通的。

    如果更往底層抽象堡妒,不管是分布式系統(tǒng)=操作系統(tǒng)list+網(wǎng)絡(luò)=數(shù)據(jù)結(jié)構(gòu)list+算法list配乱。

    從一個HashMap的初始化,擴容縮容皮迟,解決hash沖突搬泥,能體會到分布式數(shù)據(jù)分片的sharding(分庫分表,消息隊列rebalance)同樣的原理伏尼。了解了相同忿檩,再思考不同,對其掌握會更深刻爆阶。

    見微知著燥透,大道相通。

    關(guān)鍵看你怎么想辨图。怎么行班套。

  17. Business vs Tech. 業(yè)務(wù) vs 技術(shù)」屎樱回到起點思考吱韭,資源(數(shù)據(jù))從0到1,從1到N鱼的,從N到海量理盆,整個過程采取的措施和問題的解決可以作為分析軟件架構(gòu)發(fā)展的脈絡(luò),這是一條主線凑阶;

    而另外一條主線就是現(xiàn)實生活如何掛靠到技術(shù)架構(gòu)上猿规,即業(yè)務(wù)如何轉(zhuǎn)化為數(shù)據(jù),業(yè)務(wù)+數(shù)據(jù)如何轉(zhuǎn)化為價值晌砾,DomainArchitecture->TechArchitecture->ValueArchitecture坎拐。

    思考->業(yè)務(wù)設(shè)計烦磁,技術(shù)設(shè)計养匈,組織設(shè)計->得到資源-->處理資源-->挖掘價值哼勇。

  18. Trade Off. 取舍。計算機中(不止計算機)解決問題都是解決一個問題呕乎,帶來一個問題积担,然后摁下葫蘆浮起瓢。最后都是折衷猬仁。

    比如帝璧,單機為了提高效率,引入多線程湿刽,導致上下文切換和原子問題的烁;為了提高效率,引入緩存诈闺,導致緩存一致性問題渴庆。到了分布式中:為了保證分布式集群的可用性,做了多副本冗余雅镊,影響了一致性襟雷。為了保證一致性,影響了高性能仁烹。同步寫能保證不丟數(shù)據(jù)耸弄,但是性能低;異步寫性能高卓缰,但是有可能丟數(shù)據(jù)计呈。

    諸如 CAP 的原理都是“魚,我所欲也征唬,熊掌亦我所欲也震叮;二者不可得兼,舍魚而取熊掌者也鳍鸵。 ”

  19. Human vs Machine. 人 vs 機器苇瓣。根據(jù)14所述,系統(tǒng)=元素的集合偿乖,元素有不同的屬性击罪,由人來根據(jù)場景組合元素,構(gòu)成系統(tǒng)贪薪。數(shù)據(jù)增長時媳禁,升級或切換元素,而元素如果想自己突破結(jié)構(gòu)限制画切,成為更高維度的結(jié)構(gòu)突破上限竣稽,目前來看是不可能的。比如,MySQL的B+樹不會因為數(shù)據(jù)寫入量大了就會自己切換到LSMTree毫别。HashMap的鏈表轉(zhuǎn)換為紅黑樹娃弓,但是代碼也是人編寫的。Node就是Node岛宦,Manager就是Manager台丛,Manager能鏈接更多的節(jié)點,因此具有更大的價值砾肺,但是Node無能為力挽霉。大數(shù)據(jù)+AI能做到智能升級嗎?

    但是一個人变汪,一開始可以是小兵侠坎,后來也可以升為Manager(管理層),甚至成為Leader裙盾,人能突破系統(tǒng)的結(jié)構(gòu)限制硅蹦,自我進化。

    怎么突破結(jié)構(gòu)限制闷煤。原則是提升認知童芹。方法是至少有一次突破底層結(jié)構(gòu)的限制。比如高考鲤拿,比如就業(yè)假褪。

    接下來呢?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末近顷,一起剝皮案震驚了整個濱河市生音,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窒升,老刑警劉巖缀遍,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異饱须,居然都是意外死亡域醇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門蓉媳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來譬挚,“玉大人,你說我怎么就攤上這事酪呻〖跣” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵玩荠,是天一觀的道長漆腌。 經(jīng)常有香客問我贼邓,道長,這世上最難降的妖魔是什么闷尿? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任塑径,我火速辦了婚禮,結(jié)果婚禮上悠砚,老公的妹妹穿的比我還像新娘。我一直安慰自己堂飞,他們只是感情好灌旧,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绰筛,像睡著了一般枢泰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铝噩,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天衡蚂,我揣著相機與錄音,去河邊找鬼骏庸。 笑死毛甲,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的具被。 我是一名探鬼主播玻募,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼一姿!你這毒婦竟也來了七咧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叮叹,失蹤者是張志新(化名)和其女友劉穎艾栋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛉顽,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蝗砾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了携冤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遥诉。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖噪叙,靈堂內(nèi)的尸體忽然破棺而出矮锈,到底是詐尸還是另有隱情,我是刑警寧澤睁蕾,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布苞笨,位于F島的核電站债朵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瀑凝。R本人自食惡果不足惜序芦,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粤咪。 院中可真熱鬧谚中,春花似錦、人聲如沸寥枝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囊拜。三九已至某筐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冠跷,已是汗流浹背南誊。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜜托,地道東北人抄囚。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像橄务,于是被迫代替她去往敵國和親怠苔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容