跳至內容

事件 (計算)

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

事件計算領域,是指系統設計用來監視的可檢測到的發生或狀態變化,例如用戶輸入、硬件中斷、系統通知,或數據或條件的變化。當與事件處理程序關聯時,事件會觸發一個響應。處理程序可以同步運行,此時執行線程被阻塞直到事件處理程序完成其處理;也可以異步運行,此時事件可能稍後再處理。即使同步處理看似阻塞執行,許多系統的底層機制仍然是異步的,由事件循環管理。[1][2]

事件可以通過多種機制實現,例如回調、消息對象、信號或中斷,且事件本身與所用的實現機制是不同的。事件傳播模型,例如冒泡英語Event bubbling、捕獲和發布/訂閱,定義了事件在系統中如何分發和處理。其他關鍵方面包括事件循環、事件排隊與優先級、事件溯源和複雜事件處理模式。這些機制促成了事件驅動程式的靈活性和可擴展性。[3][4]

事件與消息

[編輯]

分布式系統中,事件表示一個事實或狀態變化(例如「OrderPlaced」),通常以異步方式廣播到多個消費者,從而促進鬆耦合和可擴展性。雖然事件通常不期望立即響應,但確認機制常在基礎設施層面實現(例如Kafka的提交偏移量、SNS的交付狀態),而不是作為事件模式本身的固有部分。[5][6]

相比之下,訊息承擔更廣泛的角色,包含命令(例如「ProcessPayment」)、事件(例如「PaymentProcessed」)和文檔(例如「DataPayload」)。事件和消息都可以支持多種交付保證,包括至少一次、至多一次和恰好一次,這取決於技術棧和實現。然而,恰好一次交付通常通過冪等性機制實現,而非真正的基礎設施級別的恰好一次語義。[7][8]

事件和消息的傳遞模式包括發布/訂閱(一對多)和點對點(一對一)。儘管請求/應答在技術上是可能的,但它更常與消息模式相關聯,而不是純事件驅動系統。事件擅長狀態傳播和解耦通知,而消息更適合命令執行、工作流編排和顯式協調。[7][8]

現代架構通常將兩者結合,利用事件進行分布式狀態變化通知,利用消息執行針對性的命令和基於特定時序、順序與交付需求的結構化工作流。[7][8]

事件演化策略

[編輯]

分布式系統中,事件演化帶來挑戰,例如管理跨服務不一致的事件模式以及在漸進式系統更新中確保兼容性。事件驅動架構(EDA)中的事件演化策略可以確保系統在不中斷的情況下處理事件的變更。這些策略可以包括對事件進行版本化,例如語義版本或模式演化,以維持向下兼容向前兼容。適配器可以在舊格式和新格式之間轉換事件,確保組件間的一致處理。這些技術使複雜分布式環境中的系統在保持兼容和可靠的同時得以演進。[3]

事件信號量

[編輯]

計算機科學中,事件(也稱為事件信號量)是一類同步機制,用於在特定條件變為真時通知等待的進程。

事件是具有布爾狀態的抽象資料型別,提供以下操作:

  • wait(等待)—— 執行時導致執行進程掛起,直到事件的狀態被置為真。如果在調用wait之前狀態已經為真,wait不起作用。[需要澄清]
  • set(設置)—— 將事件的狀態置為真,釋放所有等待的進程。
  • clear(清除)—— 將事件的狀態置為假。

不同的事件實現可能提供上述操作的不同子集;例如,Microsoft Windows提供的實現包含操作 wait(WaitForObject 及相關函數)、set(SetEvent)和 clear(ResetEvent)。在創建事件對象時可指定的一個選項會改變SetEvent的行為,使得僅釋放單個線程且在該線程被釋放後狀態自動返回為假。

沒有reset功能的事件,也就是那些只可完成一次的事件,被稱為futures(期望)。[9]另一方面,監視器更為通用,因為它們將完成信號與互斥鎖結合,並且不允許生產者和消費者在監視器中同時執行,使其成為事件加臨界區的組合。

相關

[編輯]

參考

[編輯]
  1. ^ Stopford, Ben. Designing Event-Driven Systems. O'Reilly Media. May 2018. ISBN 9781492038245. 
  2. ^ Fowler, Martin. Patterns of Enterprise Application Architecture. Addison-Wesley Professional. 5 November 2002. ISBN 978-0321127426. 
  3. ^ 3.0 3.1 Stopford, Ben. Designing Event-Driven Systems. O'Reilly Media. May 2018. ISBN 9781492038245. Stopford, Ben (May 2018). Designing Event-Driven Systems. O'Reilly Media. ISBN 9781492038245.
  4. ^ Fowler, Martin. Patterns of Enterprise Application Architecture. Addison-Wesley Professional. 5 November 2002. ISBN 978-0321127426. Fowler, Martin (5 November 2002). Patterns of Enterprise Application Architecture. Addison-Wesley Professional. ISBN 978-0321127426.
  5. ^ Kleppmann, Martin. Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems. O'Reilly Media. 2017. ISBN 978-1449373320. 
  6. ^ Building Event-Driven Microservices: Leveraging Organizational Data at Scale. ISBN 978-1492057895. 
  7. ^ 7.0 7.1 7.2 Kleppmann, Martin. Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems. O'Reilly Media. 2017. ISBN 978-1449373320. Kleppmann, Martin (2017). Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems. O'Reilly Media. ISBN 978-1449373320.
  8. ^ 8.0 8.1 8.2 Building Event-Driven Microservices: Leveraging Organizational Data at Scale. ISBN 978-1492057895. Building Event-Driven Microservices: Leveraging Organizational Data at Scale. ISBN 978-1492057895.
  9. ^ 500 lines or less, "A Web Crawler With asyncio Coroutines" by A. Jesse Jiryu Davis and Guido van Rossum says "implementation uses an asyncio.Event in place of the Future shown here. The difference is an Event can be reset, whereas a Future cannot transition from resolved back to pending."