架构 技术优势 技术挑战 团队优势 团队挑战
单体

低延时

开发简单

没有重复的模型/验证

伸缩

由于代码库过大引起的复杂度

特性内沟通的开销低

失败的恐惧

特性间沟通的开销大

前端+后端

能够单独扩展前端和后端

将业务逻辑与表示分离

能够复用后端并构建多个前端

由于网络调用引起的复杂度

专业性

能够更快地迭代前端

通往面向服务架构的阶梯

沟通开销

知识壁垒

前后端开发互相阻塞

面向服务架构(SOA)

细粒度的伸缩性

隔离

封装

运维开销

延时

服务发现

跟踪/调试/日志记录

热点服务

API文档,客户端

集成测试

数据碎片

自治

自治程度的困境

重复工作的风险

微服务 与面向服务架构一样,只会更多

与面向服务架构一样,只会更多

隐性耦合的风险

由于有界上下文会产生更多的自治

意味着需要DevOps

需要一个平台团队

需要思维方式的重要切换

一、单体

好处:

  1. 如果数据库查询已经进行了不错的优化,网站应该相当快。
  2. 开发相对简单,因为开发人员无需担心与调用远程API相关的各种挑战。

缺点:

  1. 只能通过部署整个应用程序的多个副本来扩展应用程序处理负载的能力

二、前后端分离

好处:

  1. 通过将业务逻辑(应用程序的内核)与表示层分离,代码应该更容易理解,应用程序更易于变更。这两个服务在概念上(和物理上)通过API隔离了,因此只要接口不变,任何一方都可以自由地进行内部更改。
  2. 用后端暴露API的另一个好处是它可以供多个前端使用。
  3. 独立地开发前后端意味着每个服务的开发都可以按照自己的步调进行。

缺点:

  1. 团队之间的某些阻塞几乎是不可避免的。

三、面向服务

优点:

  1. 强调独立性的面向服务架构,服务必须解耦,以便可以随时部署新的版本,而不会影响任何其他服务。

特点:

  1. 运维开销:一个面向服务架构可能包括数十个甚至数百个服务,以及各种数据存储和消息队列,所有这些都需要进行配置、部署、监控和维护。
  2. 延迟:在面向服务架构中,一个用户请求可能导致数十个服务间API调用。这可能包括链式调用,即服务A调用服务B,服务B调用服务C,等等。如果没有仔细的应用程序设计,这些请求的延迟会快速叠加,最终导致很延迟的用户体验。
  3. 服务发现:有几十种不同的服务,每种服务都有多个实例运行,因此需要一种容易的方法来找到它们想要通信的那个服务。
  4. 跟踪,调试,日志记录:当应用程序出现问题时,想要弄清楚问题所在是相当困难的。
  5. 热点服务:可能存在一些服务,几乎所有其他服务都依赖于它们。用户认证/身份服务是常见的例子。服务A被传递一个用户ID,使用认证服务来查找用户,执行一些处理,然后将用户ID传递给服务B,服务B也与认证服务联系,等等。这些热点服务最终可能接收大量的流量,因此可能成为单点故障和扩展的瓶颈。
  6. API文档和客户端:通过这么多的服务将API彼此暴露,团队将花费大量时间为这些API编写文档和客户端。它们需要保持最新,以保证有用。
  7. 集成测试:检查所有服务之间能否正确交互,以及应用程序能否作为一个整体运行,可能非常困难。
  8. 数据碎片:面向服务架构可能有许多小的数据库,这会使报表和数据分析变得很困难,因为你需要从多个数据库获取数据,将其压缩为通用格式,并将它们连接在一起。
  9. 平台团队应为所有团队编写一个通用库以供所有团队使用。

参考文献:人民邮电出版社《遗留系统重建实战》

Web应用程序架构的比较的更多相关文章

  1. 利用memcached构建高性能的Web应用程序(转载)

    面临的问题 对于高并发高访问的Web应用程序来说,数据库存取瓶颈一直是个令人头疼的问题.特别当你的程序架构还是建立在单数据库模式,而一个数据池连接数峰 值已经达到500的时候,那你的程序运行离崩溃的边 ...

  2. B/S架构 Web打印程序(Argox)

    B/S架构 Web打印程序 对于B/S架构下的管理软件系统,在客户端浏览器页面中如何透过本地打印机或网络打印机打印条码标签,Argox提供最常用的2种类型打印机集成方案. ●  PPLA 打印机IE游 ...

  3. 黑客攻防技术宝典web实战篇:攻击应用程序架构习题

    猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. 假设受攻击的应用程序使用两台不同的服务器:一台应用程序服务器和一台数据库服务器.已经发现一 ...

  4. 使用MVC 5、Web API 2、KnockoutJS、Ninject和NUnit开发、架构和测试Web应用程序

    做一名微软软件开发人员就像在国际煎饼屋订早餐一样.每道菜都有一堆煎饼,你必须从各种各样的煎饼和糖浆口味中选择.对于web应用程序,解决方案堆栈是一组软件子系统或组件,用于交付功能完整的解决方案(无论是 ...

  5. vs2012 发布web应用程序

    Visual Studio 2012 Visual Studio Express 2012 for Web 与 的Visual Studio 2010  Visual Studio Web发布更新 与 ...

  6. 转: GUI应用程序架构的十年变迁:MVC,MVP,MVVM,Unidirectional,Clean

    十年前,Martin Fowler撰写了 GUI Architectures 一文,至今被奉为经典.本文所谈的所谓架构二字,核心即是对于对于富客户端的 代码组织/职责划分 .纵览这十年内的架构模式变迁 ...

  7. 基于EasyUI的Web应用程序及过去一年的总结

    前言 在这家公司服务了一年时间,一个多月之前已经提交了离职申请,好在领导都已经批准了,过几天就办理手续了,在此感谢领导的栽培与挽留,感谢各位同事在工作中的给我的帮助,感谢师傅(在我心中当他是我师傅,跟 ...

  8. 目前在做的一个web应用程序的前端选型

    最近进入了一个新的项目组,要新起一个项目.这个Web项目是一个企业内部使用的系统,主要用来记录.追踪.管理潜在客户的数据.该系统有以下特点: 需要支持IE10及以上版本: 后端采用micro serv ...

  9. fir.im Weekly - iOS/Android 应用程序架构解析

    假如问你一个iOS or Android app的架构,你会从哪些方面来说呢? 本期 fir.im Weekly 收集了关于  iOS/Android 开发资源,也加入了一些关于 Web 前端方面的分 ...

随机推荐

  1. [再寄小读者之数学篇](2014-04-18 from 352558840@qq.com [南开大学 2014 年高等代数考研试题]反对称矩阵的组合)

    (2014-04-18 from 352558840@qq.com [南开大学 2014 年高等代数考研试题]反对称矩阵的组合) 设 ${\bf A},{\bf B}$ 都是反对称矩阵, 且 ${\b ...

  2. HTTP中application/x-www-form-urlencoded字符说明

    一.概述 在学习ajax的时候,如果用post请求,需要设置如下代码. ajax.setRequestHeader("content-type","application ...

  3. redis/memcache监控管理工具——treeNMS

    TreeNMS可以帮助您搭建起一套用于redis的监控管理系统,也支持Memcached,让您可以通过web的方式对数据库进行管理,有了它您就可以展示NOSQL数据库.编辑修改内容,另外还配备了sql ...

  4. Python-Django-BBS

    一个项目从无到有 1 需求分析 -登录ajax,图形验证码 -注册forms和ajax,上传头像,头像预览 -博客首页 -个人站点 -点赞,点踩 -评论 -根评论 -子评论 -后台展示 -添加文章 - ...

  5. 两个c语言结构体复制的问题

    以前一直以为结构体要通过memcpy来复制,现在才明白可直接用“=”复制 C语言中,结构体是一篇连续的内存空间,使用=赋值操作,底层用到的就是memcpy:如果结构体中有指针变量:操作后.两个指针指向 ...

  6. Ubuntu-linux云服务器下安装开启虚拟环境失败解决办法

    为什么要安装虚拟环境? 1.某些项目需要安装旧的包,开发相应功能 2.项目开发时,安装部分环境不希望影响整机环境 如何安装? 首先安装python 安装pip工具 sudo apt-get insta ...

  7. MySQL入门命令

    SQL(Structured Query Language) SQL是结构化查询语言,是一种用来操作RDBMS的数据库语言,当前关系型数据库都支持使用SQL语言进行操作,也就是说可以通过 SQL 操作 ...

  8. python---单向循环链表实现

    这个判断比较多了. 一次审准,注释作好, 以后就可以照搬这些功能代码了. # coding = utf-8 # 单向循环链表 class Node: def __init__(self, new_da ...

  9. 向量 dot cross product 点积叉积 几何意义

    向量 dot cross product 点积叉积 几何意义 有向量 a b 点积 a * b = |a| * |b| * cosθ 几何意义: 1. a * b == 0,则 a ⊥ b 2. a ...

  10. Codeforces 730 J.Bottles (01背包)

    <题目链接> 题目大意: 有n个瓶子,各有水量和容量.现在要将这写瓶子里的水存入最少的瓶子里.问你最少需要的瓶子数?在保证瓶子数最少的情况下,要求转移的水量最少. 解题分析:首先,最少的瓶 ...