跳转到内容

事件 (计算)

本页使用了标题或全文手工转换
维基百科,自由的百科全书

事件计算领域,是指系统设计用来监视的可检测到的发生或状态变化,例如用户输入、硬件中断、系统通知,或数据或条件的变化。当与事件处理程序关联时,事件会触发一个响应。处理程序可以同步运行,此时执行线程被阻塞直到事件处理程序完成其处理;也可以异步运行,此时事件可能稍后再处理。即使同步处理看似阻塞执行,许多系统的底层机制仍然是异步的,由事件循环管理。[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."