热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微观架构和宏观架构论

http:blog.csdn.netjdream314articledetails18041391微观架构和宏观架构论以下内容纯属自己YY,纯属自己更加自己经历有感而

http://blog.csdn.net/jdream314/article/details/18041391



微观架构和宏观架构论


     以下内容纯属自己YY,纯属自己更加自己经历有感而发。希望大家不要较真,如有误导,欢迎拍砖。以下想法和理解仅供参考,还望不要误导。

    一般都知道架构师们总是将问题进行抽象,从而将整个系统搭建在一个抽象基础之上,他们往往会定义一些接口或者实现一些默认机制,然后具体内容交给下面的我们这些码农们。一个好的架构,不是越抽象越好,也不是使用的模式或者规则越多越好,而是简单易懂、结构清晰,不是为了让我们下面一群码农们像雾里看花一样看待他们的架构,这样的架构只能说是为了架构而架构。架构师们很NB,工资高,写的代码少,会议多,整天是各种架构会议、管理会议、组织会议……他们对下面码农们说的最多的就是:我是站在全局看的。这句话听上去感觉是宏观的,但是里面包含两个方面。

    一、微观,站在业务的角度来认识系统的架构,他是一个微观的概念,比如说:一个系统应该包含哪些模块,模块之间的关联关系,系统运用哪些模式或者规则来设计。这些东西都是基于业务来进行设计的。他可以不考虑外部的网络部署,服务器搭建以及外部依赖等因素。这些都只是站在对业务的实现来进行考虑,如何更好的实现对应的业务,从而使得对该业务系统能够更好的支持其扩展性,容错性以及可维护性等等,这就是微观的架构,为何是微观,原因是由于他关注的是业务内部的规则,这种架构依赖了他对应的业务,可能不同的业务那么其架构会有所不同。比如说:现在要实现一个CRM系统,那么架构师站在微观的角度去分析,需要知道CRM系统内部的业务规则,以及各个子业务之间的关联关系,从而可以设计出复合CRM系统所具备的功能。这里所需要首选就是需要了解CRM的业务规则,而不是考虑CRM的其他外部因素。微观之所以微观,是因为它是站在业务内部的细节,而不考虑其外部的环境。

   二、宏观,通过上面微观的分析,应该知道宏观应该是什么内容。宏观的架构,则是站在系统所部署的环境以及外部依赖条件等因素。为何需要考虑这些内容呢?这些不是运维可以搞定的嘛?任何业务的系统都需要一个部署的环境,可以是甲方拟定或者是软件生产商规定,都必须规定一个系统的部署环境。比如说:系统A和系统B之间存在依赖关系,或者可以理解为A需要从B获取信息。AB获取信息可以是被动也可以是主动,这个设计需要考虑AB的部署环境,比如,A是部署在内网而B是部署在外网,那么需要A主动去请求B获取信息,因为A是在内网,没有对外的IPB根本不知道A的存在。所以这个时候在系统架构的时候,没有考虑这个因素,而恰好是设计成为B主动推送给A那么,这个A系统基本上属于瘫痪状态,或者说A系统和B对接模块需要重新设计。这种架构则是站在整个业务范围之外来对整个系统进行考虑,这种架构收到网络架构,外部依赖以及服务器架构等因素的限制。从严格意义上来将,系统应该不要过分依赖于外部因素,特别是服务器。比如:一个系统在设计的时候就对tomcat的管理比较紧密,那么可能在初期发现不了问题,如果当运维升级或者tomcat不是免费了(这个或许不可能),那么当前这个系统就会被绑架式的进行了约束。那么这个时候,需要架构师站在更加宏观的角度去审视整个系统,从系统以后所要生存的环境来看待这个系统而不是简单的实现某个业务逻辑。

    此处例举一个本人经历过的例子来归纳一下上面所描述的宏观和微观架构。Session共享是作为互联网应用应该具备的功能。前段时间,由于项目比较多,每次升级都需要通知客户暂停操作,然后进行重新部署升级,导致运维发布很纠结,用户体验也很蛋疼。于是运维建议做一个session共享的组件,后端进行集群部署,都进行升级的时候,用户将会自动跳转到另一个服务器上进行操作,而无需再次登录。这样可以在用户不停止操作的情况下进行后台升级。于是本人就试着动手做做。已经上面宏观和微观的概念,现在站在微观的角度来进行分析,考虑session共享的具体业务规则,session共享是将用登录的会话信息进行共享,从而在进群部署的环境下面用户可以无缝的跳转与各个后端服务之间。那么这里唯一要做的就是将用户的会换信息进行共享,也就是将会换信息存储在一个公共的存储介质上,本人采用了Redis缓存服务进行存储用户会话信息,则在用第一次登录成功后,将用户的会话信息存储到Redis缓存中,在每个应用中都有一个Filter,过滤用户所有的请求,该Filter做的第一步便是从Redis缓存中获取用户会话信息,如果没有表示之前没缓存过,进行登录操作,否则将缓存的会话信息复制到session中进行后续的操作。基于这种机制可以实现多太服务器的session共享。这个是站在微观的架构,为的是实现这一业务逻辑。

    那么站在宏观来考虑,基于tomcatsession共享有很多插件,这种插件对于部署在tomcat的应用来说可以不需要依赖任何组件和进行任何调整即可以拥有session共享,但是这里就限定了应用部署的环境,必须是tomcat,如果换了新的部署环境,是否有对应的session共享插件这个不可而知。所以基于tomcat来做session共享插件是一个不可取的方式。因为session共享是需要做成一个公共组件,既然是公共组件就不能要求应用在使用该组件时,规定应用部署环境,这就不是公共了。从没看过springstrutshibenate或者是ejb对应用使用的部署环境进行限定吧。

   上面是根据实际情况对宏观架构和微观架构进行了归纳以及演示。虽然真正要实现session共享是不依赖session来进行实现,但是由于当时所有系统确实对session的依赖比较紧密,所以暂时考虑采取上面那种方式进行比较牵强的实现。

以上是全部内容,欢迎拍砖………





推荐阅读
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
author-avatar
ah_落落_181
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有