复杂系统设计 企业开发的困境
复杂系统设计源自我多年对企业复杂系统的设计的一些思考,类似日记吧,不断完善。
为什么从一个大公司的引入架构师甚至架构师组还是很难架构企业开发中的很多问题?
这些问题表现出架构上的复杂性,和业务上的复杂性。
有时候架构和业务的界限不清晰,非常的模糊。
也可以说是架构设计不合理,也可以说是业务理解不清。
业务实际上是在不断发育的,自己的理解也是在不断深化的,所以这个理解过程是动态的。
复杂源自微观
宏观架构+微观架构
宏观架构:大架构,通用架构
微观架构:小架构。
架构的复杂性首先是多实现,不同实现必然有优劣。
一些解决复杂性问题的手段:微服务化以小博大,服务拆分,流程引擎,规则编排,依赖注入,控制反转,分层方向。
需要不断的抽象业务本质背后的架构,而不是一直写重复的代码。
宏观通用架构手段:
数据:数据库持久,缓存提速,队列缓存。
数据拆分:数据分片
流量拆分:服务器集群
一个假设:服务器一定会挂,所以还要主从或者主备,或者双机
为什么学会很多架构设计理论,一到具体项目就感觉写代码还是很盲目?
例如:软件设计的开闭原则,依赖倒置原则,里氏替换原则,单一职责原则,接口隔离原则
例如单一职责来说,一个看似单一职责的接口实际上由于参数的多变组合实际上是暗含2个职责。
例如依赖倒置原则,注入和new只是形式上的变化,本质上并没有理解注入的益处,当然这种益处是客观存在的,如果面试你去问为什么要IOC,80%的人不知道,潜意识里是大家都这样用,公司要求都这样用。
高内聚,松耦合
业务不断的复杂,并不是微服务简单拆分就可以解决。
微服务的拆分解决了一部分问题,但是依然会引入新问题。
单体的复杂交互如何合理划分领域,领域即使划分了并不是没有耦合,失去耦合本身是一个伪命题。
如果领域划分不好必然是高内聚,强耦合。因为本身上不应该做这种拆分。
设计模式是否可以解决问题?
答案是不能,首先且不说设计模式是否已经包含所有的模式,更主要的是模式是否真正的被理解?
DDD领域驱动是否可以解决问题?
回答是不能,因为没有真正理解业务做出的领域划分只是一个看似完美的划分,实际上用处不大,道理具体的开发的时候发现头重脚轻,处处渗透。
为什么从外面挖个大牛也不是马上就可以让之前设计不好的复杂系统马上设计好?
第一,很难短时间理解所有业务;
第二 之前大牛所在公司的业务并不完全匹配现有业务,可以说完全匹配的业务很少,但是也不是没有。但是也不是非要如此,要时间。
所以,架构师如果并没有真正理解复杂系统设计,而只是被动接收公司的架构,那么他去新公司必然没有太大作用。
简单
能简单就不要复杂。
能不引入中间件就不要引入中间件,比如消息系统,数据量不大没问题,数据量大,业务复杂到一定程度就会出现一些难搞的问题:消息不消费,消息丢失,重复,消费慢,治理能力弱。
CPU和内存的不可控增长,消息不隔离,其实redis缓存也存在这个问题,只看到他的性能和简单没有考虑到失控。
所以有些公司自己自研了MQ来解决这些问题。
一个完整的业务线一定要有一个人懂全部的业务,每一次需求分析,架构设计他一定要参与其中。
并不用去做完整的事情,但是需要对此进行review,特别是领域划分一定要全局业务专家。
千万不要因为政治原因回避这样的人,也不要个人英雄主义,用自己片面的业务理解去做全局的设计。
全局设计必然需要全局业务专家。
对称
世界本身是对称的,明暗,进出...
在计算机也是一样的。
处理无序 需要用有序,本质上就是对称。
序列化:反序列化 编码:解码 进:出 动态代理:反射
不对称就会继续无序下去。
主从复制本质上产生了不对称,最终是对称也就是最终一致性。
那么需要解决这个不对称,除了最终一致性以外就是需要读写对称!也就是读还是写服务器才可以。
配置 与 实际的效果 也是一种对称,无处不在的对称
关于高并发例如秒杀引入队列机制,实际上还是对称的应用。三 -> ||| 时间上的旋转。
同步变异步,更新数据库之后更新缓存引入队列异步 ||| ->三 时间上的旋转。
分布式本质上是对称的时间,集群:服务器之间是对称的。
所以也就出现对称现象,或者对称问题。
高并发的必然也会有高流量,解决的问题是需要不对称,前端系统高流量,到后端需要流量减少。倒三角或者漏洞。
缓存和数据库之间实际上也是对称的,只是一致性是完全对称,否则是不对称。
数据库,远程缓存,本地缓存。
本地缓存性能最好,但是不能超过内存,最大是和内存对称。
分布式完全数据对称是不存在的,因为存在时间,就会有延迟,这是无法消除的。
缓存key 数据库不存在的值 这就是 缓存和数据库不对称,不对称就必然引发不对称问题,解决办法是对称,让这种不存在的值缓存为null。
不过,如果数据库又更新了,那么需要同步双写或者刷新缓存为数据库值,否则引起新的不对称。
不对称也是动态变化的。
分布式MQ下顺序消息实现,下单 生产3个消息 ABC ,要求按照 A-> B ->C顺序消费。
问题 还是 三 -> ||| 镜面折射 到一个点 也就是分区,然后 消费者加锁拿队列锁
后面需要对称的获取 ||| <-三 ,也就是需要锁。
这里发送和接受分别出现对称,产生2面镜子 也就是 同一分区和队列锁。
二维空间 -> 一维空间 <- 二维空间
服务注册:镜像射入
域名负载均衡 ->反射到 注册中心拿到IP 客户端负载均衡 ribbon
反射点从服务端转移到客户端而已
ELK logstash->ES->Kibana
logstash: input->filter->output
镜面射入数据,层层镜面过滤,最后输出
延迟分配:对称 先镜像 再实像
减少内存分配:对称 单例,减小实例尺寸,常量化,静态化(枚举) 对称到一个点
hadoop namenode datanode:对称 映像到不同的实例
未完 。
相关文章:

数据库服务器跟网站服务器间传输慢的问题
数据库服务器和网站服务器是分开的,现在从网站服务器这边查数据比较慢,什么原因??? 一、首先确定服务器之间的网络有没有问题 可以简单的在网站服务器上ping数据库服务器(反过来也可以)…
【Python】百度贴吧图片的爬虫实现(努力努力再努力)
学会爬取图片以后,第一时间去了张艺兴吧,哈哈哈哈哈哈 一定要放上一张爬取的照片,哼唧 import reimport requestsimport urllibclass Baidutieba():def __init__(self):self.url "http://tieba.baidu.com/p/4876047826?pn{}"#u…

cin、cout的重载
一、cin重载 1.cin为ostream类的成员 2.cin重载应为全局函数(毕竟ostream是别人写好的) 3.代码 a.核心代码 ostream & operator<<(ostream &os,const A &a)//const A &a是为了避免复制函数的调用 ;ostream &o 相当…

第二次冲刺第十天
第二次冲刺今天就结束了,这十天来学会了不少的东西。 简单说一下昨天做的:整合各个部件的功能。 今天:小组进行总结,加强性能。 这十天来遇到的问题: 一,对于网络云端,之前都是其他小组成员在使…

说透泛型类和泛型方法以及Class<T>和Class<?>的差异
泛型类和泛型方法看起来似乎可以实现类似的功能,但是很多人并未真正掌握泛型方法,网上很多文章说了很多还是似是而非,特别是初学者还是搞不明白。 一.关于泛型方法 1.泛型方法可以独立于泛型类 2.泛型方法等效于泛型类里泛型参数方法&…
win10 +python 3.6.4安装scrapy
第一步: 首先,我们先在电脑上安装好python3.6并且配置好环境变量,以可以直接在命令行界面输入python命令可以出现如图的界面为主。 第二步: 升级pip ,在cmd窗口中会有提示,没有提示的话就已经是最新版本了…

7 种 Javascript 常用设计模式学习笔记
7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用。 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的脉络: 设计与模式5 大设计原则 7 种常见的设计…

从难免的线上bug说起代码的思考
经常是某司线上又出bug了,然后是给公司造成多少损失,追根究底总是可以找到一些原因,诸如:写代码逻辑考虑不全面,或者代码有硬伤,也有测试不充分,甚至不测试都有,也有是运维的问题等等…

PHP-Fpm应用池配置
//php.net php-fpm配置简介http://php.net/manual/zh/install.fpm.configuration.php//Global Options//pool defined[www]user nobodygroup nobodylisten 127.0.0.1:9000pm dynamicpm.max_children 5pm.start_servers 2pm.min_spare_servers 1pm.max_spare_servers 3s…
【Python】百度首页GIF动画的爬虫
今天百度首页的GIF动画很可爱,就想着用才学的爬虫爬取一下,虽然直接点击“图片另存为”就可以了 import requestsimport urllibclass Gif():def __init__(self):self.url "https://www.baidu.com/"self.headers {"User-Agent": …

CSS题目系列(3)- 实现文字切割效果
描述 有一天逛 Codepen 的时候,看到这么一个效果:将文字上下切开两半。 点进去看了一下代码,发现原理很简单,大概就是通过伪类使用attr()函数获取内容,然后进行定位。 你可以点下方链接查看效果: gd4ark.gi…

Java开发字符串JSON处理
需求很简单就是数据库存json。 数据库字段 varchar 入参request 定义 List<String> 如果不定义这个 而是定义String那么需要加"/转义比较难看 这样就只要入参传这个就行了: "xxxIds": ["33","44"], 数据库也是…

1.JSONObject与JSONArray的使用
参考文献: http://blog.csdn.net/huangwuyi/article/details/5412500 1.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: commons-lang.jarcommons-beanutils.jarcommons-collections.jarcommons-logging.ja…
【Python】Scrapy爬虫实战(豆瓣电影 Top 250)
今天一天都在弄Scrapy,虽然爬虫起来真的很快,很有效率,但是......捣鼓了一天 豆瓣电影 Top 250:https://movie.douban.com/top250 安装好的scrapy 在你想要的文件夹的目录下输入命令: scrapy startproject douban_m…

vmrun 批量创建vmware虚拟机
1 准备模板机 具体步骤如下: 1. 下载镜像安装系统 https://mirrors.aliyun.com/centos/7.5.1804/isos/x86_64/2. 安装完成配置好IP ,关闭SELINUX ,关闭firewalld ,修改网卡名 3. 预设置好修改其他机器IP脚本 1.1 安装系统 略 1.2 模板机的设置 修改网卡名…

暗时间:开发效率为何如此低下
产品 开发 测试 三者都理解不一致。 产品怎么样表达出自己的诉求,是否写清文档就够了。 开发觉得自己沟通了,但是为什么测试一提测又许多问题。 测试的case看似都一起评审了。 而这样的结果必然是重新修修补补,怎么样事前把问题全部解…
【Python】Scrapy爬虫实战(传智播客老师简介)
在文件夹里创建一个爬虫项目 scrapy startproject ITcast 在spiders目录下: scrapy genspider itcast ------------------------------------------------------------------------------------------------------------------------------------------------------…
坑系列 --- 高可用架构的银弹
呵呵,题图是一队困在坑中的鸭子:)作为一个搬砖的,我经常被困着。今天高考,想起15年前的今天(哦,那时候是七月高考),恩,考完了,还不错,…

【TeeChart Pro ActiveX教程】(八):ADO数据库访问(上)
2019独角兽企业重金招聘Python工程师标准>>> 下载TeeChart Pro ActiveX最新版本 介绍 将TeeChart控件连接到ADO.NET数据库可以在设计时使用TeeChart编辑器完成,并在运行时使用几行代码完成。 任何Series都可以使用TeeChart Editor连接到ADO.NET表或查询。…

代码规范碎碎念
代码规范碎碎念 list条件多于2不要写命名上 controller (model-DTO) service (model) repository层 语义化构造 (entity->model) String转map 语义化数据结构 String转model 从数据库层增强语义 组装模型 DAO ( entity) mapper VO(admin) DTO(client) -------…

RRDTool原理简介
1.概述 RRDtool 代表 “Round Robin Database tool” ,作者同时也是 MRTG 软件的发明人。官方站点位于http://oss.oetiker.ch/rrdtool/ 。 所谓的“Round Robin” 其实是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最…
【Python】Scrapy爬虫实战(腾讯社会招聘职位检索)
爬虫网页:https://hr.tencent.com/position.php 应用Scrapy框架,具体步骤就不详细说明,前面几篇Scrapy有一定的介绍 因为要涉及到翻页,下面的代码使用拼接的方式获取url,应用在一些没办法提取下一页链接的情况下 直…

一对一直播app源码功能操详解方案分享
一:登录页面:1.快捷登录:可以利用第三方账号进行快捷登录2.手机登录:可以让用户通过输入手机号码和密码进行登录.3.注册:可以使用手机号获取验证码注册账号二:打开一对一直播APP首页打开APP,会显…

从一个需求看问题的无限复杂化和简单化
一个需求 如果你一开始的出发点就错了,那么后续的设计只会非常复杂,而且还会有漏洞,也很难发现,发现了也很难解决。 先看数据结构: A表 主键id 其他各种字段不重要 ,重要的就一个字段sort字段 aid1 …

使用自定义材质球,实现NGUI屏幕溶解和灰显
UITexture实现的溶解: 重设UITeture的材质球实现上述效果,把当前屏幕渲染的Texture2D丢给UITexture,即可实现UI屏幕特效,背景模糊等都可以。 难点主要是实时刷新问题 解决的比较粗暴,每次Update重设材质球,…
【Python】Tkinter 体验
import tkinter as tk root tk.Tk() root.title("work hard") #添加一个Label组件,Label组件是GUI程序中最常用的组件之一 #Label组件可以显示文本,图标或图片 #在这里我们让它显示指定文本 theLabel tk.Label(root,text"努力努力再努力…

debian手动安装java两种方法
2019独角兽企业重金招聘Python工程师标准>>> 方法一:下载后修改~/.bashrc文件 方法二:使用update-alternatives进行命令安装 相关配置记录 法一: 官网下载压缩包,解压,然后复制到/usr/lib/jvm目录下&#x…
【Python】Label组件 Button组件 Checkbutton组件
Label组件 Label组件是用于在界面上输出描述的标签。 #导入tkinter模块所有内容 from tkinter import *#创建一个主窗口,可以容纳整个GUI程序 root Tk() root.title("hhh")textLabel Label(root,text"努力努力再努力!\n努力努力再努力…

大厂线上案例复盘--代码漏洞
万无一失却实际上是形同虚设的代码逻辑漏洞 这是一则发生在某大厂的真实案例,出于脱敏名字这且不说。 这个系统因为第一次上线,流量非常的大。 所以需要灰度上线,所谓灰度方案很短,比如按照地理位置,先选择某个访问量…

使用Vue+Spring Boot实现Excel上传
写在最前 在上期教程中我们介绍了读写Excel与使用Selenium的入门方法,本期将介绍通过VueSpring Boot实现在WebApp中上传Excel导入测试脚本的功能。使用前后端分离的技术是因为这样便于后续功能的迭代,在本文中我们只涉及一个简单的前端界面及一个简单的后…