在陈述之前,还是要先了解一下分布式的概念:
1. 分布式简介
分布式应用程序是已细分为子系统的应用程序,这些子系统可以部署在单独的计算机上,但仍可以协作以实现应用程序的目的。 当子系统是自治的并且提供导出灵活的API时,它们通常称为服务。
与大型单片系统相比,分布式应用程序有着更小,更集中的过程处理,这些过程更易于扩展,重用,维护和测试,尤其是在使用非常适合子系统范围的编程语言时。
1.1 可扩展性
可扩展性描述了系统增加或扩展其工作负载的能力。可扩展系统有两种常见的扩展方式:垂直和水平。
简单来说,垂直扩展涉及购买一台速度更快的计算机。垂直缩放对应用程序几乎没有负担,这是增加容量的传统方法。现代CPU的性能不再以以前的速度提高,从而变得昂贵,于是在许多情况下无法垂直扩展。
水平扩展涉及将更多计算机添加到共同运行应用程序的系统池或系统群集中。水平扩展的应用程序利用多个CPU和/或多个系统来提高性能。要利用水平扩展的优势,必须将应用程序设计为可在多台计算机上分发,水平扩展的极端示例允许应用程序利用数千个CPU在非常短的时间内执行苛刻的任务。
Apache Thrift是一种非常适合构建水平缩放的分布式应用程序的工具。
1.2 分布式应用的通信方式
分布式应用程序通常使用三种关键类型的进程间通信:
- 流传输。从服务器到一个或多个客户端使用连续字节流的方式通信。
- 示例:互联网广播,其中客户端随时间接收由服务器发出的以连续的小数据包序列传输的字节。
- 消息传递。消息传递涉及一种异步通信(通常为队列通信的形式),从而产生松散耦合的系统。
- 示例:向您发送一封电子邮件,您可能会收到回复,也可能没有收到回复,在收到回复之前,您不知道何时会收到回复。
- RPC 。远程过程调用系统允许在不同计算机上的进程之间进行函数调用。
- 示例:手机应用程序在Internet上调用服务,该服务返回天气预报。
这三种通信范例可用于处理几乎所有进程间通信任务。 接下来让我们看一下Apache Thrift如何适合每个通信模型。
2. 流传输的方式
流系统处理连续的字节流。流服务器可以将流传输到一个或多个客户端。 一些流具有时间要求,例如流电影,其要求帧至少与观看时一样快地到达。 一些流更面向批处理,例如后台文件传输。流系统通常被设计用于通信,其中数据传输沿一个方向流动并且具有大的或不确定的大小。
流系统本质上通常开销很低。他们往往是大带宽消费者,因此在易用性上追求效率。在许多情况下,使用多播来允许服务器将单个消息发送到多个客户端。流系统也可以使用数据压缩机制来减少网络影响。
Apache Thrift通常不在流数据服务中起作用。 主要用于订阅流并执行其他设置和配置任务的控制,以及通过序列化支持跨语言的流解决方案。
3. 消息传递
消息传递是一种纯异步通信模型,允许队列的通信独立于生产者或消费者的速度进行。全方位服务消息传递系统通过诸如存储和转发,事务,多播和发布/订阅之类的功能,支持通过不可靠链接进行的可靠通信。WebsphereMQ,ActiveMQ,RabbitMQ和JMS等系统属于此类。
轻量级消息传递系统更适合于以最小的延迟将高数据速率的消息传递作为设计的必要条件。诸如MIT的LCM和ZeroMQ之类的系统以及诸如TIBCO Rendezvous之类的商业系统都实现了轻量级框架,以性能为首要设计目标来支持许多标准消息传递功能。这样的高速消息传递系统在流系统的性能和较重的消息传递系统的功能之间取得平衡。
Apache Thrift不是消息队列平台,但可以满足与跨语言序列化相关的消息传递。例如,使用RabbitMQ在C ++和Java应用程序之间发送消息感兴趣,可能需要通用的序列化格式。如下图所示:
因此,可以在消息传递系统之上实现RPC系统。例如,Apache Thrift提供了一种实验性传输,该传输在ZeroMQ之上分层,从而允许Apache Thrift RPC在ZeroMQ消息传递平台上运行。
4. RPC
下面是一个统一的调用样式:
与消息传递系统不同,RPC交换中的客户端和服务器必须同时启动并运行。
客户端在许多RPC环境中等待服务器的响应,就像客户端正在调用本地函数一样。与消息传递系统相比,这将客户端与服务器的耦合更为紧密。但是,Apache Thrift之类的SOA平台提供了多种方式灵活的处理客户端和服务器的关系。
某些Apache Thrift语言支持异步客户端接口。这样,客户端可以呼叫服务器,然后再处理其他事务,稍后再回来查看是否可用。这类似于客户端和服务器通过消息传递平台。
Apache Thrift还支持一种方式的消息。客户端使用适当的参数调用单向函数,然后开始其业务。服务器收到该消息,但不回复。这类似于在没有队列的情况下在消息传递环境中发送单向消息的方式。适用于可靠性要求不高的场景。
选择正确的通信平台通常需要结合RPC,消息传递和流式解决方案。Thrift非常适合此类混合环境,可以比较方便的适应各种语言和通信平台。
今天就到这里,欢迎关注交流~