设计一个分布式系统并不是那么简单和直接。为了得到理想的系统,需要克服许多挑战。分布式系统面临的主要挑战如下:
1. 异构性:
因特网使用户能够在异构的计算机和网络集合上访问服务和运行应用程序。异质性(即多样性和差异性)适用于以下所有情况:
- 硬件设备:电脑、平板电脑、移动电话、嵌入式设备等
- 操作系统:Ms Windows, Linux, Mac, Unix等
- 网络:局域网、因特网、无线网络、卫星链路等。
- 编程语言:Java, C/ c++, Python, PHP等
- 软件开发人员、设计人员、系统管理人员的不同角色
不同的编程语言对字符和数据结构(如数组和记录)使用不同的表示。如果要使用不同语言编写的程序能够相互通信,就必须解决这些差异。由不同的开发人员编写的程序不能相互通信,除非它们使用共同的标准,例如,用于网络通信和
消息中基本数据项和数据结构的表示。为了实现这一点,标准需要得到认可和采用——正如互联网协议一样。
中间件:术语中间件适用于软件层,该层提供了编程抽象,同时掩盖了底层网络、硬件、操作系统和编程语言的异构性。大多数中间件都是通过Internet协议实现的,Internet协议本身掩盖了底层网络的差异,但是所有中间件都处理操作系统和硬件的差异
异构性和移动代码:术语移动代码是指可以从一台计算机转移到另一台计算机并在目的地运行的程序代码——Java applet就是一个例子。适合在一台计算机上运行的代码不一定适合在另一台计算机上运行,因为可执行程序通常都是特定于指令集和主机操作系统的。
2. 透明度:
透明性被定义为对用户和应用程序程序员隐藏分布式系统中的组件分离,这样系统就被视为一个整体,而不是独立组件的集合。换句话说,分布式系统设计者必须尽可能地隐藏系统的复杂性。分布式系统透明度的一些术语是:
- Access隐藏了数据表示和资源访问方式的差异
- Location隐藏资源所在的位置
- 迁移隐藏了资源可能移动到另一个位置
- 重定位隐藏资源在使用时可能移动到另一个位置
- 复制隐藏可能在多个地方复制的资源
- 并发性隐藏了一个资源可能被几个竞争性用户共享的情况
- Failure隐藏资源的失败和恢复
- 持久性隐藏(软件)资源是在内存中还是在磁盘中
3.开放
计算机系统的开放性是决定该系统能否以各种方式扩展和重新实现的特征。分布式系统的开放性主要取决于添加新资源共享服务的程度,以及各种客户机程序可以使用的程度。如果发布了系统定义良好的接口,开发人员将来就更容易添加新特性或替换子系统。例如:Twitter和Facebook都有API,允许开发者交互式地开发他们自己的软件。
4. 并发性
服务和应用程序都提供了分布式系统中客户机可以共享的资源。因此,可能会有多个客户机同时尝试访问共享资源。例如,记录拍卖出价的数据结构在接近截止时间时可能会被频繁访问。为了使对象在并发环境中是安全的,必须以使其数据保持一致的方式对其操作进行同步。这可以通过在大多数操作系统中使用的信号量等标准技术来实现。
5. 安全
分布式系统中提供和维护的许多信息资源对其用户具有很高的内在价值。因此,他们的安全相当重要。信息资源的安全包括三个部分:
保密(防止泄露给未经授权的个人)
完整性(防止变更或腐败),
被授权的可用性(防止对访问资源的方式的干扰的保护)。
6. 可伸缩性
随着用户数量的增加,分布式系统必须是可伸缩的。可伸缩性由B. Clifford Neuman定义为
如果一个系统能够处理用户和资源的增加,而不会造成明显的性能损失或管理复杂性的增加,那么这个系统就是可伸缩的
可伸缩性有3个维度:
- 大小需要处理的用户和资源数。相关的问题是重载
- 地理位置用户与资源之间的距离。相关的问题是通信的可靠性
- 管理随着分布式系统规模的增加,许多系统需要被控制。相关的问题是管理混乱
7. 故障处理
电脑系统有时会失灵。当硬件或软件发生故障时,程序可能产生不正确的结果,或可能在完成预期的计算之前停止。处理失败尤其困难。