`
gaojingsong
  • 浏览: 1182977 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【RPC框架之Finagle】

阅读更多

1、Finagle介绍

Finagle是Twitter基于Netty开发的支持容错的、协议无关的RPC框架,该框架支撑了Twitter的核心服务。

 

 

Twitter面向服务的架构是由一个庞大的Ruby on Rails应用转化而来的。为了适应这种架构的变化,需要有一个高性能的、支持容错的、协议无关且异步的RPC框架。在面向服务的架构之中,服务会将大多数的时间花费在等待上游服务的响应上,因此使用异步的库能够让服务并发地处理请求,从而充分发挥硬件的潜能。Finagle构建在Netty之上,并不是直接在原生NIO之上构建的,这是因为Netty已经解决了许多Twitter所遇到的问题并提供了干净整洁的API。

Twitter构建在多个开源协议之上,包括HTTP、Thrift、Memcached、MySQL以及Redis。因此,网络栈需要足够灵活,以保证能与这些协议进行交流并且还要具有足够的可扩展性以支持添加新的协议。Netty本身没有与任何特定的协议绑定,对其添加协议支持非常简单,只需创建对应的事件处理器(event handler)即可。这种可扩展性产生了众多社区驱动的协议实现,包括SPDY、PostrgreSQL、WebSockets、IRC以及AWS。

Netty的连接管理以及协议无关性为Finagle奠定了很好的基础,不过Twitter的有些需求是Netty没有原生支持的,因为这些需求都是“较高层次的”。比如,客户端需要连接到服务器集群并且要进行负载均衡。所有的服务均需要导出指标信息(如请求率、延迟等),这些指标为调试服务的行为提供了有价值的内部信息。在面向服务架构中,一个请求可能会经过数十个服务,所以如果没有跟踪框架的话,调试性能问题几乎是不可能的。为了解决这些问题,Twitter构建了Finagle。简而言之,Finagle依赖于Netty的IO多路复用技术(multiplexing),并在Netty面向连接的模型之上提供了面向事务(transaction-oriented)的框架。

 

 

2、Finagle的工作原理

Finagle强调模块化的理念,它会将独立的组件组合在一起。每个组件可以根据配置进行替换。比如,所有的跟踪器(tracer)都实现了相同的接口,这样的话,就可以创建跟踪器将追踪数据存储到本地文件、保持在内存中并暴露为读取端点或者将其写入到网络之中。

在Finagle栈的底部是Transport,它代表了对象的流,这种流可以异步地读取和写入。Transport实现为Netty的ChannelHandler,并插入到ChannelPipeline的最后。当Finagle识别到服务已经准备好读取数据时,Netty会从线路中读取数据并使其穿过ChannelPipeline,这些数据会被codec解析,然后发送到Finagle的Transport。从这里开始,Finagle将数据发送到自己的栈之中。

对于客户端的连接,Finagle维持了一个Transport的池,通过它来平衡负载。根据所提供的连接池语义,Finagle可以向Netty请求一个新的连接,也可以重用空闲的连接。当请求新的连接时,会基于客户端的codec创建一个Netty ChannelPipeline。一些额外的ChannelHandler会添加到ChannelPipeline之中,以完成统计(stats)、日志以及SSL的功能。如果所有的连接都处于忙碌的状态,那么请求将会按照所配置的排队策略进行排队等候。

在服务端,Netty通过所提供的ChannelPipelineFactory来管理codec、统计、超时以及日志等功能。在服务端ChannelPipeline中,最后一个ChannelHandler是Finagle桥(bridge)。这个桥会等待新进入的连接并为每个连接创建新的Transport。Transport在传递给服务器实现之前会包装一个新的channel。然后,会从ChannelPipeline之中读取信息,并发送到所实现的服务器实例中。



 

 

3、桥接Netty与Finagle

Finagle客户端使用ChannelConnector来桥接Finagle与Netty。ChannelConnector是一个函数,接受SocketAddress并返回Future Transport。当请求新的Netty连接时,Finagle使用ChannelConnector来请求一个新的Channel,并使用该Channel创建Transport。连接会异步建立,如果连接成功的话,会使用新建立的Transport来填充Future,如果无法建立连接的话,就会产生失败。Finagle客户端会基于这个Transport分发请求。

Finagle服务器会通过Listener绑定一个接口和端口。当新的连接创建时,Listener创建一个Transport并将其传入一个给定的函数。这样,Transport会传给Dispatcher,它会根据指定的策略将来自Transport的请求分发给Service。

 

 

 

 

4、对请求失败的管理

在扩展性的架构中,失败是常见的事情,硬件故障、网络阻塞以及网络连接失败都会导致问题的产生。对于支持高吞吐量和低延迟的库来说,如果它不能处理失败的话,那这样库是没有什么意义的。为了获取更好的失败管理功能,Finagle在吞吐量和延迟上做了一定的牺牲。

Finagle可以使用主机集群实现负载的平衡,客户端在本地会跟踪它所知道的每个主机。它是通过计数发送到某个主机上的未完成请求做到这一点的。这样的话,Finagle就能将新的请求发送给最低负载的主机,同时也就能获得最低的延迟。

如果发生了失败的请求,Finagle会关闭到失败主机的连接,并将其从负载均衡器中移除。在后台,Finagle会不断地尝试重新连接,如果Finagle能够重新建立连接的话,就会再次将其添加到负载均衡器之中。

 

 

Client Features

Connection Pooling

Load Balancing

Failure Detection

Failover/Retry

Distributed Tracing (à la Dapper)

Service Discovery (e.g., via Zookeeper)

Rich Statistics

Native OpenSSL Bindings

 

Server Features

Backpressure (to defend against abusive clients)

Service Registration (e.g., via Zookeeper)

Distributed Tracing

Native OpenSSL bindings

 

Supported Protocols

HTTP

HTTP streaming (Comet)

Thrift

Memcached/Kestrel

More to come!

 

  • 大小: 26.8 KB
0
0
分享到:
评论

相关推荐

    finagledemo

    Finagle是Twitter基于Netty开发的支持容错的、协议无关的RPC框架,该框架支撑了Twitter的核心服务。来自Twitter的软件工程师Jeff Smick撰文详细描述了该框架的工作原理和使用方式。

    go-rpc-programming-guide.pdf

    本书《go-rpc-programming-guide.pdf》首先介绍了使用Go语言官方库进行RPC服务开发的方法,然后介绍了流行的gRPC库以及其他一些Go语言可用的RPC框架,重点介绍了一个高性能的分布式全功能RPC框架——rpcx。...

    finagle-metrics:将Finagle指标发送到Codahale Metrics库的简便方法

    这个库使得Finagle,一个强大的、可扩展的网络服务框架,能够更好地与其他依赖于Codahale Metrics的系统集成,如Graphite、InfluxDB或Elasticsearch,用于收集和可视化服务性能数据。 Finagle,由Twitter开发并开源...

    finagle-serversets_2.10-6.16.0.zip

    Finagle是Twitter开源的一个分布式服务框架,它提供了一种声明式的RPC系统,使得开发可扩展、高性能的服务变得更加简单。此版本号2.10-6.16.0表明它是针对Scala 2.10版本和Finagle 6.16.0版本设计的。 在Finagle中...

    藏经阁-新浪广告系统服务化优化.pdf

    新浪广告系统中采用了 Twitter 开源的 Finagle RPC 框架,该框架提供了高性能、可扩展性强的 RPC 功能。 知识点3:服务注册与发现 服务注册与发现是微服务架构中的关键技术,用于管理和发现服务的可用性。在新浪...

    auto-common-0.7.zip

    - **模块化**:Finagle的组件设计使得开发者可以自由组合和扩展功能,构建个性化的服务框架。 3. **使用Finagle构建服务**: - **服务客户端和服务服务器**:Finagle提供了创建服务客户端和服务服务器的简单API,...

    finagle-irc:Finagle IRC客户端和服务器

    3. **协议库**:Finagle提供了一套丰富的协议库,可以方便地实现各种网络协议,而Finagle IRC就是其中之一,它实现了IRC协议。 4. **容错**:Finagle内置了故障检测和恢复策略,例如超时、重试和失败切换,以确保...

    PHP高性能服务框架架构与实践.pdf

    阿里巴巴的HSF和dubbo、Facebook的thrift、Google的gRPC以及Twitter的finagle都是业界知名的RPC框架。然而,PHP社区在swoole等现有框架之外,选择了自建PSF框架,原因在于它能够提供更简单的控制、更高的性能以及...

    finagle-prometheus:在Finagle和Prometheus指标之间架起一座桥梁

    Finagle是Twitter开源的一个高性能、可扩展的RPC框架,而Prometheus则是流行的开源监控系统和时间序列数据库。这篇文章将深入探讨Finagle-Prometheus如何帮助开发者在Finagle服务中实现Prometheus兼容的度量收集,...

    PHP高性能服务化框架介绍.pptx

    尽管存在多种成熟的RPC框架,但PSF选择自主研发的原因在于其希望保持简单可控且自成体系。PSF使用标准的数据格式URL + JSON,同时追求高性能,认为仅依赖RPC还不足以满足这些需求。 **PSF系统架构** PSF的架构包括...

    海量并发微服务框架设计.pptx

    Go-zero 是一个用于构建Web和RPC微服务的框架,其设计原则强调简洁、弹性、工具化和对业务开发的友好性。它提供的代码生成工具goctl和通用API定义规范,可以帮助开发者快速构建和维护微服务。 总之,海量并发微服务...

    spring-halbuilder-page-1.0.0.RELEASE.zip

    - Finagle是一个跨语言的客户端和服务端RPC框架,最初由Twitter开发并开源。 - 它基于Netty,提供高效的网络I/O处理,并支持多种协议,如HTTP、Thrift、gRPC等。 - Finagle强调服务发现和负载均衡,允许动态添加...

    广告系统服务化优化架构.pptx

    - **RPC框架选择**:在比较thrift、gRPC、dubbo和Finagle等RPC框架后,选择了Twitter开源的Finagle框架,因为它具有良好的生态系统支持。 - **实时监控与跟踪**:实现系统状态的实时监控和业务数据的实时分析,以...

    雪球在股市风暴下的高可用架构改造分享.pdf

    服务化拆分中,雪球采用了Twitter的Finagle RPC框架,并进行二次开发,增强了访问日志、故障快速失败、故障切换策略和降级开关等功能。服务大致分为三类:社区服务(类似新浪财经+微博)、组合及推荐服务(类似Motif...

    BlogService:用finagle,spring,mybatis,junit,log4j等搭建thrift服务接口项目

    1. **Finagle**:Finagle是Twitter开源的一个高性能、可扩展的RPC系统,用于构建异步服务。它提供了丰富的协议库,如HTTP、Thrift等,支持服务发现和服务等级协议(SLA)。 2. **Spring**:Spring是Java企业级应用...

    Scala面向对象编程课件.rar

    这里会介绍如何在Scala中实现和使用RPC框架,如Akka HTTP或Finagle,它们在分布式服务间通信中扮演着重要角色。学习者将了解RPC的基本原理,以及如何定义和调用远程服务,同时学习如何处理异步调用和错误处理。这...

    geotrellis-raster_2.10-0.10.2.zip

    Finagle是Twitter开源的一个高性能、可扩展的RPC(远程过程调用)系统,而Finch是构建在Finagle之上的Web服务定义框架,它允许开发者使用Scala的函数式编程风格来定义RESTful API。Argonaut则是JSON处理库,为Scala...

    第6章 分布式服务调用中间件.docx

    5. **Finagle**:Twitter开源的库,提供了一个服务构建框架,强调可扩展性和高性能。 6. **JSF**:京东的分布式服务框架,虽非开源,但设计理念与Dubbo相似。 以Dubbo为例,它不仅实现了RPC功能,还提供了丰富的...

Global site tag (gtag.js) - Google Analytics