但是爲了最大限度地提高寫入性能,我想最好允許 多個寫入同時進行。但是如何在這樣的系統中處理一致性和共識?
在事件源系統中,寫入側的一致性總是很強。這通過使用樂觀鎖定由聚合和Event store
強制執行:在併發寫入的情況下(實際上事件僅附加到商店),則重試孔命令。這是可能的,因爲聚合命令方法是純粹的(無副作用)方法。只要事件沒有持續下去,命令就可以重試。
當兩臺或多臺計算機在同一時間更新狀態( 一個選擇和堅持它?)
兩個。第一個(總是有第一個)命令生成持久存儲到該商店的事件。 secons命令由於低級別的conception異常而失敗。然後通過加載+應用所有以前的事件重試,包括由第一個命令生成的事件。然後,第二個命令會生成也會持續存在的事件事件,如果新狀態不允許處理第二個命令,則會引發異常。
您必須注意,第二個命令至少執行兩次,但每次前面的事件(因此狀態)都不相同。
基礎架構將聚合版本附加到每個聚合流。每個事件附加增加此版本。聚合ID和版本有一個唯一的約束。這可能是所有活動商店的實施方式。
當一臺機器行爲不端(不知不覺,或故意),並傳播 故障事件給網絡的其餘部分(如何檢測呢?)
我不明白這是怎麼發生,但如果它正在發生,那麼它真的取決於你對故障事件的理解。您可以讓一些Sagas/Process經理分析事件並觸發一些發送給某種監督員的電子郵件。
感謝您的回答。我看到如何使用樂觀鎖定,當有一個單一的寫入端。但是如果在不同的機器上有多個寫方(沒有一個公共數據庫),他們會以某種方式必須同意要處理的命令。樂觀鎖定可以在一臺機器上併發寫入,但是如何處理擴展系統中的併發寫入? –
@AndreasZita沒有一個共同的數據庫,我不認爲這是可能的。但是,使用通用數據庫,您可以使用「Aggregate ID」進行分片。通過這種方式,您可以最小化共同寫入的概率。 –