这篇文章讲了伸缩性
和可用性方面的反模式,也按照自己的理解翻译了一下,欢迎各位探讨。
1 单点失败(Single Point of Failure)
大部分的人都坚持在单一的设备上部署我们的应用,因为这样部署的费用会比较低,但是我们要清楚任何的硬件设备都会有失败的风险的,这种单点失败会严重的影响用户体验甚至是拖垮你的应用,因此除非你的应用能容忍失败带来的损失,否则得话应该尽量的避免单点风险,比如做冗余,热备等。
2 同步调用
同步调用在任何软件系统中都是不可避免的,但是我们软件工程师必须明白同步调用给软件系统带来的问题。如果我们将应用程序串接起来,那么系统的可用性就会低于任何一个单一组件的可用性。比如组件A同步调用了组件B,组件A的可用性为99.9%,组件B的可用性为99.9%,那么组件A同步调用组件B的可用性就是99.9% * 99.9%=99.8%。同步调用使得系统的可用性受到了所有串接组件可用性的影响,因此我们在系统设计的时候应该清楚哪些地方应该同步调用,在不需要同步调用的时候尽量的进行异步
的调用(而我这里所说的异步
是一种基于应用的异步
,是一种设计上的异步
,因为J2EE目前的底层系统出了JMS是异步
API以外,其它的API都是同步调用的,所以我们也就不能依赖于底层J2EE平台给我们提供异步
性,我们必须从应用和设计的角度引入异步
性)
3 不具备回滚能力
虽然对应用的每个版本进行回滚能力测试是非常耗时和昂贵的,但是我们应该清楚任何的业务操作都有可能失败,那么我们必须为这种失败作好准备,需要对系统的用户负责,这就要求系统一定要具有回滚的能力,当失败的时候能进行及时的回滚。(说到回滚大家可能第一时间想到的是事务
的回滚,其实这里的回滚应该是一种更宽泛意义的回滚,比如我们记录每一次的失败的业务操作,这样在出现错误的时候就不是依靠于事务
这种技术的手段,而是通过系统本身的回滚能力来进行回滚失败业务操作)。
4 不记录日志
日志记录对于一个成熟稳定的系统是非常重要的,如果我们不进行日志记录,那么我就很难统计系统的行为。
5 产品质量依赖于测试
测试固然重要,但是软件系统的质量应该从设计支持就融入进来,而不是靠以后测试出问题,然后再修复。测试验证系统的行为和预期的一致,并且要保证在引入新的功能特性以后不会影响到系统的其它部门。因此希望在测试中发现性能,伸缩性和可怕用户体验的问题,然后再修复它是一种没有效果并且浪费时间和精力的不佳实践。因此我们需要在设计之初就关注系统的伸缩性
和可用性,而不是依赖于测试。
6 无切分的数据库
随着系统规模的慢慢变大,我们就需要打破单一数据的限制,需要对其进行切分。
7 无切分的应用
系统在规模小的时候,也许感觉不出无切分的应用带来的问题,但是在目前互联网高速发展的时代,谁能保证一个小应用在一夜或者是几夜以后还是小应用呢?说不定哪天,我们就发现应用在突如其来的访问量打击的支离破碎。因此我们就需要让我们的系统和我们一样具有生命力,要想让系统具有应付大负载的能力,这就要求我们的应用具有很好的伸缩性
,这也就要求应用需要被良好的切分,只有进行了切分,我们才能对单一的部门进行伸缩,如果应用是一块死板的话,我们是没有办法进行伸缩的。就好比火车一样,如果火车设计之初就把他们设计为一体的,那么我们还怎么对火车的车厢进行裁剪?因此一个没有切分的应用是一个没有伸缩性
和没有可用性的应用。
8 将伸缩性
依赖于第三方厂商
如果我们的应用系统的伸缩性
依赖于第三方的厂商,比如依赖于数据库集群
,那么我们就为系统的伸缩性
埋下了一个定时炸-弹。因为只有我们自己最清楚我们自己的应用,我们应该从应用和设计的角度出发去伸缩我们的应用,而不是依赖于第三方厂商的特性。
9 没有卓越文化
如果我们没有一种对待错误的优秀的文化,那么我很难保证同一个失败不发生第二次。因此我们需要一种确保同样的失败不发生第二次,这需要通过我们认真的对待每一次系统的失败,从中找出问题,而不是每次修修补补,能解决问题就行,如果这样,我们会发现,最终系统会变得遍体鳞伤,体无完肤。
原文:
http://www.jdon.com/jivejdon/thread/37794
分享到:
相关推荐
根据最终的用户使用方式, 发布模式可以分为 嵌入发布模式, 中心服务器发布模式 和 REST 发布模式 嵌入发布模式: 只适用于 Java 客户端, 提供一个本地的 Jar 包, Jar 包是嵌入式的原生服务, 需要提前配置本地机器的 ...
最后,书中可能会介绍一些评估和改进架构的方法,比如架构评审、反模式识别以及架构演化。通过持续的评估和调整,可以确保软件架构随着业务和技术的发展而持续优化。 总而言之,《软件架构设计的思想与模式》这本书...
对交易转账等重要操作根据交易模式和交易信息进行风险控制 Sina微博的应用 大型网站架构要素 性能 可用性 伸缩性 扩展性 安全性 瞬时响应:网站的高性能架构 网站的性能测试 不同的视角 用户的视角 ...
因此,在实现云计算反垃圾邮件系统的过程中,需要严格的安全措施和高可用性的设计来确保系统的可靠性和用户数据的安全。 总而言之,云计算在反垃圾邮件系统中的应用,不仅为处理海量邮件数据提供了有效的技术手段,...
例如,通过使用分区、复制和负载均衡策略,可以提高数据库的可伸缩性和可用性。同时,采用合适的数据模型(如范式化或反范式化)有助于优化存储和查询效率。 在云数据库的设计中,安全性是不可忽视的重要环节。这...
1. CAP定理:一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)是分布式系统的三个基本属性。在分布式环境中,通常无法同时满足这三个属性,必须做出权衡。 2. 最终一致性:在CAP...
6. **质量属性**:软件体系结构设计必须考虑非功能性需求,如安全性、可用性、性能、可伸缩性、可测试性等。 7. **反模式与最佳实践**:学习常见的体系结构反模式,如“意大利面条代码”和“大泥球”,以及如何避免...
在大数据架构设计方法论中,分布式系统的ID生成系统需要考虑全局唯一性和低延迟,CAP理论解释了在网络分区发生时,系统不能同时保证一致性(C)、可用性(A)和分区容错性(P)。在用户行为数据处理方面,埋点数据的...
这种技术极大地扩展了软件的可伸缩性和可用性,尤其是在大型企业级应用和云计算环境中。在本篇讨论中,我们将深入探讨远程调用的基本概念、工作原理以及其在实际开发中的应用。 远程调用的核心在于解耦客户端和...
主要设计目标是提高系统的性能、可用性和可伸缩性。 分布式系统透明性主要包括网络透明性、位置透明性、复制透明性、并发控制透明性、故障恢复透明性等。网络透明性使得用户无需关心数据在网络中的传输细节;位置...
可用性设计 可靠性设计 一致性设计 负载均衡设计 过载保护设计 协议设计 二进制协议 文本协议 接入层架构设计 DNS轮询 动静态分离 静态化 反向代理 LVS F5 CDN 逻辑层架构设计 连接池 串行化技术...
11. **云原生(Cloud-Native)**:设计应用程序以充分利用云的优势,如弹性、可扩展性和高可用性。Azure和AWS等云提供商提供了多种服务来支持云原生应用的开发。 12. **异常处理**:正确处理和报告异常是确保软件...
微服务设计的目标是提高访问性、敏捷性和伸缩性,但这并不意味着所有应用都适合采用微服务,需要根据业务需求和当前架构的局限性来判断是否采用。 在决定采用微服务时,需要评估业务驱动力、整体组织架构和技术环境...
- **无状态性**:服务应避免保持会话状态,以便提高可伸缩性和可用性。 - **明确接口**:服务接口需要清晰明确,以便其他服务能够正确调用。 - **松耦合**:服务之间应尽量减少相互依赖。 - **最佳实践**:为了...
以虚拟机为中心的政策,单一管理面板,单一厂商支持,高度自动化简单性,虚拟机管理随集群而扩展,与“按增长付费”模式互补伸缩性,Web-scale 技术,管理随集群而扩展,全分布式,专用架构内置可用性。 企业级虚拟...
这种方式增强了系统的可伸缩性和可维护性,使银行能够更快地推出新的金融服务并进行迭代更新。 4. **容器化技术**:Docker等容器技术使得应用及其依赖环境可以被标准化和轻量化,便于跨环境部署和管理。在银行主机...
Erlang的分布式特性还包括分布式进程和分布式数据库Mnesia,后者是一个事务型数据库,特别适合实时和高可用性系统。 Erlang的 OTP(Open Telecom Platform)框架进一步简化了并发和分布式系统的开发。OTP提供了一...