消息服務(wù)架構(gòu)

數(shù)據(jù)存儲

數(shù)據(jù)例子

彈性伸縮
假如你手頭有一個計算量非常大的計算任務(wù),你想要加快任務(wù)的完成進度,你有兩種選擇
垂直縮放(Scaling up/Scaling down),升級手頭的計算機配置,加大內(nèi)存,換ssd,換更好的cpu,gpu等等。在Screeps中,可以理解為使用更大的Creep,更高效的執(zhí)行計劃(從單creep挖運,改成挖運分離)
水平縮放(Scaling out/Scaling in),多買幾臺計算機,一起參與計算。在Screeps中,可以理解為生更多的爬。
基于不同條件伸縮劃分的四種服務(wù)類型

基于消息水平縮放的服務(wù)
這類型的服務(wù),可以通過控制爬的數(shù)量來控制產(chǎn)出。
當(dāng)處理消息的速度低于消息增加的速度時,向孵化服務(wù)發(fā)送消息,請求更多的爬。
當(dāng)處理消息的速度高于消息增加的速度時,即消息存儲中經(jīng)常為空,則不請求爬,或者釋放一部分爬(回收,或者再分配)
基于配置水平縮放的服務(wù)
配置信息表示的是一種”理想狀態(tài)“,這類型的服務(wù)致力于縮小”理想“和”現(xiàn)實“的差距。以建造為例:配置中設(shè)定了A位置有Storage,建造服務(wù)就會檢查A位置上是否有Storage,如果沒有,就在該位置建造Storage。
基于環(huán)境水平縮放的服務(wù)
和上一類服務(wù)類似,區(qū)別在于,這類服務(wù)的理想狀況是”顯而易見“的,不需要配置。以維修服務(wù)為例:當(dāng)建筑的hits不滿時,維修這些建筑。
垂直縮放
每個服務(wù)內(nèi)部配置垂直縮放,例如:房間內(nèi)能量采集服務(wù),在RCL較低時,因為體型較小,可以多個Creep挖一個礦,且挖運一體;RCL提高后,替換單Creep挖,單Creep運;link建造之后,替換為單Creep挖,link運。
節(jié)流

實時優(yōu)先級
優(yōu)先級不存儲在消息中,而是在消息處理服務(wù)從消息存儲讀取消息時,結(jié)合配置信息/環(huán)境實時計算出優(yōu)先級,這樣做的好處是,當(dāng)緊急情況發(fā)生時,可以立刻做出反應(yīng),比如能量不足,爬死光了,或者突然遭遇了進攻,動態(tài)的優(yōu)先級可以把最迫切的消息提到最高的優(yōu)先級。
消息的優(yōu)先級,可以隨著等待時間的增加而增加,避免這些消息永遠(yuǎn)得不到處理。
全局過濾
水平縮放的前提是,總資源足夠。但是在一些情況下,例如CPU緊缺,能量緊缺,開戰(zhàn),需要人為限制處理一些消息,這種時候優(yōu)先級就不能解決問題了,因為如果消息存儲中只有這條消息,他仍然會被處理。因此需要一個全局過濾器,當(dāng)消息的處理服務(wù)從消息存儲中讀取消息時,過濾這部分消息。
可以通過兩個維度來聯(lián)合過濾消息:
房間
消息發(fā)布者
例如某房間開戰(zhàn)時,其他房間的維修,建造服務(wù)都可以暫停,但是戰(zhàn)斗房間的維修服務(wù)不能暫停,這里體現(xiàn)了房間維度過濾的必要性。采集服務(wù)可以全部暫停,這就體現(xiàn)了消息發(fā)布者維度過濾的必要性。兩者結(jié)合,可以靈活處理各種突發(fā)事件。