go reactive宣言

banq 13-10-13
                   

这段时间,软件领域暗流涌动:

中间件江湖新来了一批悍将,在互联网领域把EE打得节节败退。Finagle(Twitter)异步化RPC,Akka(TypeSafe)融入管理思路的Actor模型,RxJava(Netflix)观察模式推送多个结果,Vertx(Eclipse)吸取Nodejs精华。它们身着黑衣,上书大大的"Reactive"。并且结党签署投名状: http://www.reactivemanifesto.org/ ---@寻找一个苹果

为什么需要go reactive?
近年来,应用需求已经发生了巨大的变化,仅在几年前,一个大的应用程序就有数万台服务器,秒级响应时间,小时级别离线维护和千兆字节级别的数据。今天的应用程序部署从移动设备到基于云计算的运行在数千个多核处理器上的集群。用户期望毫秒甚至微秒的响应时间和100%的正常运行时间。数据量打到PB级的需求日益增加。

创新的互联网公司如谷歌或Twitter的应用架构设计已经开始推广在很多行业,金融和电信是率先采取新技术来满足新需求的行业。

新的需求要求新的技术。以前的解决方案都强调了服务器或容器的可管理性。可伸缩性性能提升是通过购买较大的服务器以及多线程并发处理来实现。增加新的服务器也同时引入了新的复杂性,这是低效且昂贵的专有解决方案。

但现在已经有一种新的架构让开发商能满足当今的需求构建新的应用程序,。我们称这些应用是reactive应用(反应的应用)。这种结构允许开发人员构建事件驱动(event-driven),可扩展性,弹性的反应系统:提供高度敏感的实时的用户体验感觉,可伸缩性和弹性的应用程序栈的支持,随时可以部署在多核和云计算架构。

什么是reactive
Merriam-Webster 定义reactive是“随时响应刺激”的反应,也就是说,它的组件是“活跃”,随时准备接收事件。这个定义抓住了reactive本质的用。

聚焦在系统上有如下定义:

1. react to events 对事件立即反应
事件驱动的自然特性使的反应能够立即加载实施,通过避免对共享资源的争用实现可扩展性。

2.react to failure 对失败立即反应
在任何级别都可以建立一个能够实现失败恢复的弹性系统。

3.react to users 对用户立即反应
无论任何负载,值得荣耀的响应时间。

这些特征跨越了标准的分层应用程序体系结构,并不局限于某个分层之中,而是适用于在整个技术堆栈。


                   

8
banq
2013-10-13 08:38

事件驱动:Event-driven

基于异步通信的应用程序实现了松耦合的设计,好过于纯粹基于同步的方法调用。发件人和收件人可以实现调用,不要关心事件是如何传播的细节,通过接口实现通信。这就易于延伸,发展和维护,带来更多的灵活性,并降低了维护成本。

由于异步通信的收件人可以在事件发生时或收到一条消息之前保持休眠状态,事件驱动event-driven的方法可以有效地利用现有资源,让多个收件人可以共享一个硬件线程。相比基于同步的传统应用程序,一个非阻塞的应用程序在重负载下可以拥有更低的延迟和更高的吞吐量,这将导致更低的运营成本,提高了资源利用率以及良好的终端用户体验。

banq
2013-10-13 08:54

在一个事件驱动的应用程序中,组件彼此交互是通过离散事件的生产者和消费者( production/consumption )。这些事件是以异步和非阻塞的方式发送和接收的。事件驱动的系统往往依靠推而不是拉或投票表决,即他们是在有消息时才推送数据给消费者,而不是通过一种浪费资源方式:让消费者不断地轮询或等待数据。

异步发送事件:也被称为消息传递意味着应用程序设计于高并发,能够无需改动利用多核硬件。任何一个CPU内核都是能够处理任何消息事件,这导致并行的机会急剧增加。

非阻塞:意味着应用程序在故障等突发情况下任何时候都能实现响应。而对于这一切所需的资源响应,例如CPU,内存和网络都不会发生垄断。因此,它可以同时兼具更低的延迟,更高的吞吐量和更好的可扩展性。

传统的服务器端架构是依赖于在一个单独的线程中共享可变状态和实现阻塞操作。这样的系统在满足不断变化的需求时难以扩展伸缩,共享可变状态需要同步,它引入了附带的复杂性和不确定性,使得程序代码很难理解和维护。把一个线程通过阻断方式使用实际是限制了资源,并带来高昂的唤醒成本。

事件的产生和处理的解耦,能够让运行平台更关注同步细节以及事件是如何跨线程分发的,当程序抽象抬升到业务流程级别,你考虑的是事件如何传播以及如何通过系统组件之间进行交互,而不是摆弄周围的低级初始设备如线程和锁。

事件驱动的系统使组件和子系统之间的松耦合。这是可扩展性和弹性的先决条件之一。通过消除复杂和强大的组件之间的依赖,事件驱动的应用可以通过影响最小的方式扩展现有的应用程序。

banq
2013-10-13 09:29

当应用程序遭遇高性能和可扩展性的要求时,这时很难预测会出现瓶颈的地方。因此,重要的是,将整个解决方案都设计为异步和非阻塞(整个系统都是)。

比如在一个典型应用案例中,用户界面中的用户请求(在浏览器中,REST客户端或其他地方)发送到web层进行解析,然后分发到中间件服务组件,通过它的高速缓存然后下推到数据库。如果这些层中任何一个层都不参与以下操作:阻塞调用数据库,依靠共享的易变状态,使用昂贵的同步操作进行调用,那么整个请求处理响应的流水线就不会停顿,用户就不会将遭受延迟通过增加和减少的可扩展性。

An application must be reactive from top to bottom
一个应用必须从顶层到底部都是reactive的。

Amdahl’s Law:
一个程序中使用多个处理器并行计算的加速比是有限的,每个程序都分为串行与并行部分,降低串行的比重,可提高程序的效率:





[该贴被admin于2013-11-22 20:27修改过]


banq
2013-10-13 09:38

Merriam-Webster 定义Scalable的含义是:能够轻松扩展或升级需求。

一个可扩展的应用程序能够根据其用途扩展。这需要通过向应用程序添加弹性实现,能够扩展是指可以扩展出去也能收缩回来(scale out or in比如添加或删除节点)。此外,该架构使得很容易向上或向下扩展(scale up or down比如部署更多或更少的CPU的节点) ,这些扩展都无需重新设计或重写应用程序。弹性可以在云计算环境中让运行的应用程序成本降到最低,让您从pay-for-what-you-use获利。

可扩展性也有助于管理风险:硬件太少会跟不上用户负载进而导致客户的不满和损失,但是投入太多的硬件和操作人员,如果空转就造成不必要的损失。一个可扩展的解决方案也减轻了这种风险,在未来十年内将有成千上万的硬件线程,如何利用这些底层潜力,需要应用程序有一个非常细粒的可扩展性。

3Go 1 2 3 下一页