邏輯時間和Lamport時鐘(第1部分)

在本系列的整個過程中,我們看到了許多實例,說明事情可能比看起來複雜得多。我們看到了失敗,然後看到了複製。最近,我們發現甚至時間的概念也比我們原本想的要複雜。

但是,當您認為自己知道的事情比以往更令人費解時,有時答案就是保持簡單。換句話說,我們可以通過剝離容易混淆的部分並將其修整到最重要的部分來簡化問題。實際上,這種方法正是70年代末一位計算機科學家(就像我們一樣)試圖弄清楚如何在分散式系統中理解時間的方式。

時鐘的前兩篇文章以及分散式系統中事件的順序都已經建立,我們終於可以發現這個話題:邏輯時間和Lamport時鐘有很多要討論的內容,因此我們將在兩篇文章中進行介紹。讓我們直接進入第一部分

因果關係和「之前發生的事情」

邏輯時鐘的故事始於1978年,當時在ACM通訊雜誌上發表了一篇文章,該文章將載入史冊。馬薩諸塞州計算機協會的計算機科學家萊斯利·蘭普特(Leslie Lamport)撰寫了有關分散式系統中訂購事件的研究。這篇題為「分散式系統中的時間,時鐘和事件的排序」的論文將繼續成為計算機科學中被引用最多的論文之一,並且還將獲得「分散式計算原理性論文獎」 20年之後。

Lamport的因果排序論文於1978年發表

在論文中,Lamport概述了我們如何以人類的方式思考時間,以及為什麼在涉及分散式系統時我們需要改變我們的範式,以及部分排序的思想。他解釋說:「在分散式系統中,有時不可能說兩個事件之一先發生」。

為什麼我們關心訂購事件?這樣我們就可以追蹤因果關係

正如蘭莫特(Lamport)在他的論文中所引用的,我們之所以在意時間,是因為我們可以弄清事情發生的順序。雖然在分散式系統中這樣做確實比較困難(有時甚至是不可能),但我們想知道系統中某些事件的順序的原因都源於相同的願望:我們關心事件的排序,因此我們可以確定如何這些事件是關聯的。在任何系統中處理事件時,我們實際上要對其進行排序的原因是為了使我們能夠看到系統中的事件鏈。特別是在分散式系統中,這意味著我們經常嘗試確定一個節點上的事件是否影響或導致另一節點上的事件。

但是,正如我們在對分散式系統的研究中看到的那樣,這項任務並非易事。當分散式系統時,沒有全局時鐘,這意味著我們不能依賴任何中央時間源。這也意味著我們系統中的事件未完全排序,這意味著我們無法確定系統中每個事件的確切發生時間。 Lamport的論文承認了所有這些限制,並同情這個問題的實際棘手性

Lamport的解決方案是改變我們的思維方式。他提出了一個新穎的想法:實際上,我們不需要在開始整體訂購的情況下考慮因果關係。相反,他說,我們可以從事件的部分排序開始,然後再處理找出哪些事件在其他事件之前發生。一旦確定了部分排序,就可以將其轉變為一致的全部排序。

Lamport的邏輯時鐘使我們能夠從發生的「時間」轉變為「發生的時間」。

那麼我們該怎麼做呢?好吧,首先,我們需要從思考事件何時發生轉變為事件發生之前的思考。

從「何時」轉換為「之前」

一件事比另一件事先發生的想法是蘭莫特論文的中心。他使用→速記符號表示發生在關係之前的事件,或者一個事件發生在另一事件之前的事實。例如,如果我們知道一個事件a在另一個事件b之前發生,那麼我們可以說a→b或a在b之前發生。

關係也可以過渡應用之前發生的事情。換句話說,我們可以創建一個事件鏈,其中一個事件先於另一個事件發生。如果我們說a→b和b→c,那麼通過使用傳遞性,我們可以說a→c或a發生在c之前。正如我們可以想像的,我們可以很容易地將一系列事件串在一起,其中一個事件發生在另一個事件之前,另一個事件發生在另一個事件之前,依此類推。

了解「之前發生」的符號。

但是請稍等……我們一直在談論系統中的不同事件,但是我們還沒有真正弄清一個事件可能是什麼事實證明,分散式系統中的事件可以採用不同的形式。眾所周知,分散式系統中可以有許多不同的節點。每個節點都有自己的本地系統時鐘,並且能夠處理自己的任務。但是,節點之間也可以相互通信,來回發送消息。

事件涵蓋了系統中節點之間以及節點之間可能發生的所有不同事件。事件可能是在單個進程或節點上發生的事件。事件還包括任何發送事件,其中節點將消息發送到另一個節點或進程。相反,當節點從系統其他位置接收到傳入消息時,我們還必須考慮接收事件。

在上面的示例中,我們可以看到所有這三個事件的示例。我們有兩個進程,P和Q。有一個事件Q3,它發生在進程Q上,與發送或接收任何消息都不相關。這是我們的基本事件,表明進程Q的節點上發生了某些事情。但是,我們還有一些發送事件:P1,Q1,Q4。這些都是表明我們正在將消息從節點發送到系統中其他位置的事件。另一方面,P2,P3和Q2分別是接收事件,表明我們已經從系統中的另一個節點接收到一些消息。

現在我們了解了系統中的事件可能是什麼,我們可以回到關係發生之前的事件。當我們說事件a→b時,我們斷言該事件a在b之前發生,因為a在b之前發生。我們可以說這兩個事件是有因果關係的,其中事件的順序取決於一個事件導致另一個事件的發生。

跨兩個過程的因果事件和並發事件。

有一些因果排序規則對我們來說很重要。為了對a→b進行因果排序,必須滿足以下三種情況之一:

  1. 事件a和b必須在同一進程上發生,並且a必須在b在進程上發生之前發生。
  2. 只要a是與b對應的發送事件(必須是其接收事件),這些事件就可以在不同的進程中發生。
  3. 這些事件與系統中的另一個事件可傳遞地鏈接在一起,但是在b之前仍然發生。例如,如果a發生在c之前,而c發生在b之前,那麼我們知道a→b。

隨著消息從一個過程到另一個過程在時間和空間上傳播,我們可以開始構建因果事件鏈(也稱為因果路徑),並查看跨過程的不同事件如何彼此關聯。例如,在進程P和Q中,Q1_→_ P3(通過事件P2),以及P1→Q4(通過事件Q2和Q3)。

最後,值得一提的是,如果兩個事件a和b沒有先後發生,那麼我們可以說a≠> b和b≠> a,並且這兩個事件是並發的。我們將在本文的第二部分中更深入地討論這一點,但就目前而言,我們應該注意,並發事件沒有從一個事件到另一個事件的因果關係。

邏輯時鐘到達舞台

除了「之前發生」的概念外,蘭莫特在論文中引入的另一個核心概念是邏輯時鐘。眾所周知,分散式系統中的每個節點或進程都有自己的時間概念或本地時鐘。但是,蘭莫特採用本地時鐘的方式與我們以前看到的有所不同。

時鐘如何計算?

Lamport建議使用與我們都想到的典型物理時鐘不同的東西。我們可以使用計數器來代替使用每個進程的物理時鐘來跟蹤事件的順序。計數器可以以初始時間(例如0)開始,並且我們可以將該計數器視為進程自己的本地時鐘。

Lamport繼續提出這一想法,提出不僅在分散式系統中的每個進程都將擁有自己的計數器時鐘,而且記錄在進程中的每個事件也應在該進程的本地時鐘上具有一個值。此外,時鐘上每個事件的值必須反映關係發生之前的任何事件。例如,如果事件a→b,則事件a發生時的時鐘時間必須小於事件b發生時的時鐘時間;換句話說,clock(a)

通過使用基本計數器而不是物理時鐘,Lamport將時鐘簡化為更易於處理的內容。這些計數器時鐘稱為邏輯時鐘。邏輯時鐘與物理時鐘完全不同,因為沒有中央時間概念,並且時鐘只是一個計數器,它會根據系統中的事件進行遞增。

邏輯時鐘:定義。

分散式系統中的每個進程都可以使用邏輯時鐘對與之相關的所有事件進行因果排序。當事件發生在某個進程中時(無論是發送還是接收事件),該進程的時鐘計數器將增加任意數量。我們將在本文的第二部分中詳細了解該方法的工作原理。我們還將向我們介紹Lamport的遞增計數器演算法,以及如何遵循流程之間的因果關係。有很多有趣的東西要學習;值得慶幸的是,我們有更多時間和另一篇文章來介紹這一切

資源資源

蘭珀特在邏輯時鐘和因果排序方面的工作很容易掌握和編寫。有很多很棒的資源介紹這些主題,但複雜性各不相同。如果您想進一步閱讀,請查看下面列出的一些我喜歡的資源

  1. Leslie Lamport在分散式系統中的時間,時鐘和事件排序

  2. 區域中事件的時間,時鐘和順序。系統,Dan Rubenstein

  3. 時間和順序:Lamport時間戳記,Indranil Gupta

  4. Lamport的邏輯時鐘,Michael Whittaker

  5. 邏輯時鐘,Paul Krzyzanowski教授

資訊來源:由0x資訊編譯自DEV,原文:https://dev.to/vaidehijoshi/logical-time-and-lamport-clocks-part-1-9e0 ,版權歸作者所有,未經許可,不得轉載
你可能還喜歡