对于许多关键应用程序功能,包括流媒体和电子商务,单体架构已不再足够。随着实时事件数据和云服务使用的需求增加,许多现代应用程序,如Netflix和Lyft,已经转向了事件驱动的微服务方法。分离的微服务可以独立运行,增强代码库的适应性和可扩展性。
但是,什么是事件驱动的微服务架构,为什么应该使用它?
使用事件驱动的微服务
事件驱动的微服务结合了两种现代架构模式:微服务架构和事件驱动架构。虽然微服务可以与请求驱动的REST架构配对,但随着大数据和云平台环境的兴起,事件驱动架构变得越来越重要。
定义
事件驱动架构,英文名Event Driven Architeture,是一种基于发布/订阅模式的消息异步通信的架构,你可以把它理解为架构层
面的观察者模式。
事件驱动的特点
1.解耦
生产者和消费者彼此不用知道对方是谁,这就会使得服务非常松耦合,非常易于修改,测试和部署.
2.基于推送通知的消息传输机制
事件驱动的体系结构中,客户端无需轮询就可以接收更新,事件在到达事件存储后就会通知给客户端,客户端可以随时接收更
新,这对于动态数据转换、分析和数据科学处理非常有用。
3.可追溯与审计
事件流是事实的不变流,其中每个事实由流中的事件表示,每当实体状态发生变化时,都会发出一个新事件。
事件驱动的体系结构可以通过实现事件追溯Event Sourcing等模式,来提供不可变事件的日志,这是审计的关键
4.加速机器学习与数据科学的模型选择
事件驱动架构,为加速机器学习模型从开发到生产提供了一种有效的方法,模型可以使用业务事件,实时地将结果广播给另一个服务,该服务可以根据一些关于速度、预测精度等的业务标准选择服务哪个模型。
因为模型可以不断地测试和改进,所以该体系结构允许更快的、迭代的开发,可以快速地部署到生产环境中。
事件驱动的实现原理
1.架构组件
1)事件队列 (event queue)
负责:接收事件的入口。
2)分发器(event mediator)
负责:将不同的事件分发到不同的业务逻辑单元。是一个事件中枢处理单元,知道事件的处理流程,但不执行具体的事件业务处理逻辑,根据事件的特征对初始事件进行拆分编排为处理事件并进行分发。
3)事件通道(event channel)
负责:分发器与处理器之间的联系渠道。是一组各自独立的组件,彼此之间没有依赖,自包含,不依赖于其他 Processor 的处理结果
4)事件处理器 (event processor)
负责:实现业务逻辑,处理完成后会发出事件,触发下一步操作。
2.架构流程
第一步:客户端发送一个事件到事件队列event queues中,它用来将事件传送给event mediator;
第二步:Event mediator收到初始的事件后,会发送额外的一些异步事件给event channels来执行处理的每个步骤:
第=步:Event channels 既可以是消息队列,也可以是消息topic,大部分是消息topic,这样可以由多个消息处理器(eventprocesson)处理同一个消息。
第四步:Event processors监听event channels,接收事件并处理一些业务逻辑.
架构应用
什么是微服务架构?
微服务架构是一种软件开发技术,将应用程序的进程组织为松散耦合的服务。它是一种面向服务的架构(SOA)类型。
在传统的单体结构中,所有应用程序进程本质上都是相互连接的;如果其中一部分失败,系统就会崩溃。微服务架构将应用程序进程分组为单独的服务,使用轻量级协议进行交互,提供了改进的模块化和更好的应用程序可维护性和弹性。
虽然单体应用程序可能更容易开发、调试、测试和部署,但大多数企业级应用程序都将微服务作为标准,这使得开发人员可以独立拥有组件。成功的微服务应该尽可能简单,并使用生成并发送到事件流或从事件流中消耗的消息(事件)进行通信。JSON、Apache Avro和Google Protocol Buffers是常见的数据序列化选择。
什么是事件驱动架构?
事件驱动架构是一种设计模式,它结构化软件,使事件驱动应用程序的行为。事件是由actor(即人类用户、外部应用程序或其他服务)生成的有意义的数据。
我们的示例项目采用了这种架构;其核心是一个事件流平台,以两种方式管理通信:
•从编写它们的actor(通常称为发布者或生产者)接收消息•向其他actor(通常称为订阅者或消费者)发送消息更具技术性地说,我们的事件流平台是一种软件,作为服务之间的通信层,允许它们交换消息。它可以实现各种消息模式,例如发布/订阅或点对点消息,以及消息队列。
使用事件驱动架构和事件流平台与微服务结合使用可以提供丰富的好处:
•异步通信:独立多任务的能力使服务能够在准备好时对事件做出反应,而不是在完成上一个任务之前等待。异步通信促进实时数据处理,使应用程序更具响应性和可维护性。
•完全解耦和灵活性:生产者和消费者组件的分离意味着服务只需要与事件流平台和它们可以生成或消费的数据格式进行交互。服务可以遵循单一职责原则并独立扩展。它们甚至可以由使用独特技术堆栈的不同开发团队实现。
•可靠性和可扩展性:事件驱动架构的异步、解耦特性进一步增强了应用程序的可靠性和可扩展性(这已经是微服务架构设计的优势)。
使用事件驱动架构,可以轻松创建对任何系统事件做出反应的服务。您还可以创建包括一些手动操作的半自动管道。 (例如,自动用户支付的管道可能包括由异常大的支付值触发的手动安全检查,然后再转移资金。)
示例代码
以下是一个使用Spring Cloud Stream实现的事件驱动的微服务架构示例代码:
// 生产者
@Service
@EnableBinding(Source.class)
public class MyProducer {
private final Source source;
public MyProducer(Source source) {
this.source = source;
}
public void sendMessage(String message) {
source.output().send(MessageBuilder.withPayload(message).build());
}
}
// 消费者
@Service
@EnableBinding(Sink.class)
public class MyConsumer {
@StreamListener(Sink.INPUT)
public void handleMessage(String message) {
System.out.println("Received message: " + message);
}
}
这里使用了Spring Cloud Stream框架,它提供了一种简单的方式来实现事件驱动的微服务架构。在生产者中,我们使用@EnableBinding(Source.class)注解来绑定输出通道,然后使用source.output().send()方法来发送消息。在消费者中,我们使用@EnableBinding(Sink.class)注解来绑定输入通道,然后使用@StreamListener(Sink.INPUT)注解来监听消息。
发展趋势
随着云计算和大数据的普及,事件驱动的微服务架构将成为未来应用程序开发的主流。它可以提供更好的可扩展性、可维护性和可靠性,使开发人员能够更快地构建和部署应用程序。此外,随着人工智能和机器学习的发展,事件驱动的微服务架构还可以用于实时数据分析和预测。
总结
事件驱动的微服务架构是一种现代架构模式,它将微服务架构和事件驱动架构结合在一起,提供了异步通信、完全解耦和灵活性、可靠性和可扩展性等优势。使用事件驱动的微服务架构,可以轻松创建对任何系统事件做出反应的服务,并创建包括一些手动操作的半自动管道。随着云计算和大数据的普及,事件驱动的微服务架构将成为未来应用程序开发的主流。