分布式系统是互联网应用的基石,是底层的支撑平台。
本文讲的分布式系统指这个层面。
互联网应用的用户数是没有上限的(取决于其开放特性),这也是和传统应用的本质差别。
高并发指系统单位时间内收到的请求数量(取决于使用的用户数),没有上限。海量数据包含:海量数据的存储和海量数据的处理。
这两个project难题都能够使用分布式系统来解决。
协同工作须要解决两个问题:
任务分解
任务分成两部分,client和server。
client和server运行不同的任务,client须要调用server来实现自己的任务。
节点通信
在基于B/S架构的设计中,广泛採用HTTP作为通信协议。
三层架构(多层架构。3-tier architecture, n-tier architecture)
peer-to-peer架构
peer-to-peer的分布式系统中,各个节点都是对等的,执行同种类型的任务。
各个节点协同工作。整个分布式系统对外看来,就像一台机器。仅仅只是性能更强。这样的p2p架构的分布式系统事实上就是集群。
分布式系统和集群的关系
从狭义上说还是能够做一些区分:
集群:全部节点一起工作,实现同一服务。一个节点挂掉,不会对集群有不论什么影响。
分布式系统:系统每个节点,都实现不同的服务,假设一个节点挂了,这个服务就不可訪问了。在实际部署中,分布式系统中的每个节点都能够是一个集群。这样能够提高服务的可用性,性能等。
关于集群的介绍。能够參考之前的博文《什么是集群》tier和layer的差别
这两个词的中文翻译都是层,并且在各种架构描写叙述中大量使用。他们之间有什么差别?
tier用来描写叙述系统的物理架构,或者说基础设施(infrastructure)设计。
不同的tier之间是互相独立的,能够单独部署、监控。
layer用来描写叙述系统的逻辑层次结构。针对每个tier。能够使用layer来描写叙述其设计实现架构。通常不同layer之间是有依赖关系的(上层依赖下层)。并且执行在同一个进程空间中,比方经典的TPC/IP分层(layer)设计。
分布式系统实例
openstack架构
openstack包括了若干个组件(component)。nova ,neturon,cinder,keystone等。
当中的每一个组件都是一个分布式系统。关于openstack的介绍能够看我的博文,有好多篇。
openstac中RPC基于消息队列实现,详细參考博文《openstack学习之RPC》
任务分解
任务分成3部分:
展现层(presentation tier, or web tier)
给用户提供操作界面GUI来使用该系统。通常是生成页面,使用HTTP协议訪问,在浏览器中展现。
随着移动端的流行。须要生成适合移动端訪问的页面。
Java EE中在这一层,提供了非常多的技术与规范。来支持应用开发。
Servlet:web tier的基石。
JSP
Unified Expression Language (EL)
JavaServer Pages Standard Tag Library (JSTL) 1.2 1.2
JavaServer Faces (JSF)
业务逻辑层(business tier, or application tier)
详细的业务代码实现。web层会调用这一层。系统中的一些通用服务(所谓的cross cutting)也能够放在这一层来实现,如安全。日志等,数据检索等服务。
Java EE在这一层的技术与规范
Java API for RESTful Web Services (JAX-RS) :开发基于rest的服务。rest是眼下的主流技术了。
Enterprise JavaBeans (EJB) :ejb的服务。早起的EJB过于复杂和笨重。不知ejb lite是否会好点。
Java Transaction API (JTA):事物处理API,支持XA协议。
Java Persistence API (JPA) :OR mapping API,源于Hibernate的API。
数据层
用来保存系统中的持久化数据。数据层的存储方式能够是:
关系数据库 + SAN storage
分布式文件系统(依据文本的描写。应叫文件系统集群)
NoSQL系统:NOSQL的数据模型,各不同样。产品也多种多样,依据业务特点选择。
Amazon的 S3
mongo
缓存
眼下的web系统都会使用缓存来提高系统性能。传统的三层架构中没有谈到缓存。
缓存能够分成
数据缓存:比方memcached
页面缓存:如CSN系统
节点通信
Web层广泛採用HTTP作为通信协议。
业务逻辑层使用web service(REST).
数据层,不同产品有不同的协议。针对关系数据库,Java提供了JDBC訪问接口。