技术开发 频道

架构设计:一种远程调用服务的设计构思

        【IT168 技术】在深入学习zookeeper之前,我想先给大家介绍一个和zookeeper相关的应用实例,我把这个实例命名为远程调用服务。通过对这种应用实例的描述,我们会对zookeeper应用场景会有深入的了解。

  远程调用是系统与系统之间的通信机制,它的另一种理解就是进程间的通信。做分布式系统的开发,远程调用技术是其核心技术。远程调用技术可以将一组计算机系统形成一个网络系统,对外提供整体服务,那么这一群的计算机系统就构成了一个更大型,性能更高的计算机系统。

  我在前面的博客里介绍了一种分布式网站的架构设计,其中就有一个使用netty技术编写的组件作为前端系统和服务端系统通信的媒介。在一个大型的互联网公司里会有很多这样的网站系统,如果每一个网站都像我博客里所论述的进行开发,那么对于系统通信维护和管理,以及每个系统网络资源的分配管理就会造成一定的问题,对于这样的问题,我举个例子可能大家会更明白些,比如一个互联网公司有数个对外提供服务的网站,有的网站访问量很大,有的相对较小,但是公司的宽带资源是有限的,那么我们就希望动态的管理和分配这些资源,如果我们网站的通信功能和网站都是紧耦合的,那么调配这些资源的工作就会比较复杂和繁琐,也很容易出问题。这样的问题还会还有很多,我这里不做细致分析了。做软件开发时候,有个原则,如果某个功能是可以通用的,该功能很需要统一管理时候,我们就应该把这个功能抽取成一个独立的系统或组件,并且这个系统或组件赋予一些增强级的功能特性,这样必定对整个系统的健壮性、可用性以及效率上有所提升。

  而我在分布式网站里所描述的通信技术,就是远程调用技术的一种,远程调用技术就是客户端和服务端的通信技术,它可以当做cs架构技术的一种,在java里有很多优秀的框架实现远程调用,例如java自带的RMI,spring自带的Httpinvoker,webservice技术等等。但是现有的这些技术满足不了互联网公司的远程调用需求,今天我将讲述一套我自己构思的一套远程调用技术,这个是借鉴了一些我们公司的类似软件的做法。

  该框架主要是针对java的,其他语言目前不能支持。首先我要总结远程调用技术要包括那些技术,它们分别是

  通信技术:远程调用就是通过网络技术将不同系统构成一个整体,因此通信技术是其重点,通信技术我这里选择的是netty技术,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。Netty会让我们开发通信程序变得简单,高效,其效率也是非常好的,同时它还支持多种不同的网络协议。

  序列化和反序列化技术:java的序列化技术是指将对象转换为byte数据,这些数据可以被还原为java对象,这种还原的过程就是反序列化了,该机制可以自动处理不同操作系统之间的差异,例如window下序列化的对象,可以在linux上进行重新构建。Java的jdk里自带了一个序列化和反序列化机制,熟悉hadoop的人知道hadoop设计了一套序列化和反序列化机制,为什么hadoop作者不选择使用java自带的序列化机制,这是因为java序列化机制非常复杂,复杂带来效率低下,java的序列化机制还有一个重要的缺点就是它序列化的二进制数据会非常大,因为java序列化时候会附带太多该对象的相关信息,过大的数据量就会影响网络传输的效率,因此hadoop自己设计了一套序列化和反序列化机制,hadoop不同节点之间的通信也是一种远程调用机制,因此我们发现好的序列化和反序列化技术对于远程调用是相当重要的。我们公司的远程调用框架序列化技术有两种一种就是java自带的序列化和反序列化机制,一种是hessian技术,它是一种更加高效的序列化和反序列化技术。

  压缩技术:做网络编程,最稀缺的资源就是宽带资源,如果传输数据过大,那么对数据的压缩就会显得十分重要,这里我推荐一个压缩技术snappy,它是一种高效的压缩和解压缩包,google公司内部广泛使用的一种压缩技术。

  高并发的技术:远程调用技术一定会是多线程,只有这样才能满足多个并发的处理请求,java在1.5的版本里提供了一个Executor框架,它在线程开发里引入了任务的概念,使得多线程的程序开发会更加合理和可控,关于executor的技术大家可以看看一本经典的书籍《java并发编程实践》。想让线程更加有效率,池技术也是并不可少的,apache的common-pool是一个非常好的池技术,我们可以将线程都预先创建好,然后放入到common-pool池里进行管理。

0
相关文章