
系统架构设计
文章平均质量分 70
zhangzeyuaaa
这个作者很懒,什么都没留下…
展开
-
利特尔法则在计算机系统中的应用
在引出今天的主角Little's Law之前,有必要先统一一下我们描述“性能”的“基本语言”,毕竟语言不通是没法交流的不是。稳定的系统中同时被服务的用户数量等于用户到达系统的速度乘以每个用户在系统中驻留的时间,适用于所有需要排队的场景。N = X * R,其中N 表示系统中同时活动的用户,X 表示用户相继到达系统的速率,在稳定(这个词非常重要!!!)状态(用户到达系统的速度等于用户离开系统的速度)时即为系统吞吐量,R 表示每个用户在系统中平均的驻留时间。转载 2025-03-12 15:19:28 · 52 阅读 · 0 评论 -
利特尔法则(Little‘s Law)
利特尔法则(Little’s Law)是排队论中的一个基本定理,由约翰·利特尔(John Little)于1954年提出并于1961年证明。它描述了一个稳定的系统中,、**平均到达率(λ)原创 2025-03-12 15:02:00 · 372 阅读 · 0 评论 -
分布式事务解决方案之本地消息表
描述分布式事务之前,先了解下事务是什么。事务就是一组操作构成的可靠的独立的工作单元,要么全部执行成功,要么全部执行失败。分布式就是一个业务由多个操作完成,这些操作又分布在不同的服务器上。简单来说,分布式事务就是分布式系统中的事务。本文描述了本地消息表如何解决分布式事务的关键流程,在具体业务操作时候,可能还有会一些问题,比如消息发送失败、下游业务处理失败等问题,这些都需要具体问题具体分析。在遇到分布式一致性问题的时候,结合实际的业务情况选择最适合的分布式事务解决方案。转载 2022-09-27 10:51:25 · 4573 阅读 · 0 评论 -
Scalable IO in Java(Reactor模式)
原文链接:https://gee.cs.oswego.edu/dl/cpjslides/nio.pdf原创 2022-09-02 14:10:47 · 211 阅读 · 0 评论 -
几种常见的负载均衡
1)http重定向HTTP重定向服务器就是一个普通的服务器,当用户访问时,其会根据一定的算法得到服务器集群的一个真实服务器的IP地址,将其放在HTTP响应头中,响应状态码为(302),当用户浏览器接收到这个响应时,会将得到的真实服务器的IP地址提出并重新访问。如上图所示,当用户访问域名时通过DNS解析得到114.100.20.200,然后访问114.100.20.200,也就是HTTP重定向服务器,响应重定向至114.100.20.203,用户浏览器再重新访问。缺点:1. 这种..转载 2021-10-17 15:07:55 · 549 阅读 · 0 评论 -
负载均衡方案的三种实现策略
早期的互联网应用,由于用户流量比较小,业务逻辑也比较简单,往往一个单服务器就能满足负载需求。随着现在互联网的流量越来越大,稍微好一点的系统,访问量就非常大了,并且系统功能也越来越复杂,那么单台服务器就算将性能优化得再好,也不能支撑这么大用户量的访问压力了,这个时候就需要使用多台机器,设计高性能的集群来应对。接下来就由新网小编来和大家讲一讲负载均衡方案的三种实现策略: 一、多台服务器是如何去均衡流量、如何组成高性能的集群的呢? 负载均衡(Load Balancer)是指把用户访问的流量,通过「负载.转载 2021-10-17 14:37:58 · 5545 阅读 · 0 评论 -
数据库分库分表后”跨库分页“查询方案
分库需求(数据库分库分表解决方案)高并发大流量的互联网架构,一般通过服务层来访问数据库,随着数据量的增大,数据库需要进行水平切分,分库后将数据分布到不同的数据库实例(甚至物理机器)上,以达到降低数据量,增加实例数的扩容目的。分页需求互联网很多业务都有分页拉取数据的需求,例如:(1)微信消息过多时,拉取第N页消息(2)京东下单过多时,拉取第N页订单(3)浏览58同城,查看第N页帖子这些业务场景对应的消息表,订单表,帖子表分页拉取需求有这样一些特点:(1)有一个业务主键id, 例..转载 2021-10-16 16:48:47 · 5435 阅读 · 5 评论 -
分库后如何解决不能JOIN的问题
在拆分之前,系统中很多列表和详情页所需的数据是可以通过sql join来完成的。而拆分后,数据库可能是分布式在不同实例和不同的主机上,join将变得非常麻烦。而且基于架构规范,性能,安全性等方面考虑,一般是禁止跨库join的。那该怎么办呢?有以下几种解决方案:1.全局表所谓全局表,就是有可能系统中所有模块都可能会依赖到的一些表。比较类似我们理解的“数据字典”。为了避免跨库join查询,我们可以将这类表在其他每个数据库中均保存一份。同时,这类数据通常也很少发生修改(甚至几乎不会),所以也不用太担心“一原创 2021-09-24 15:21:54 · 1851 阅读 · 0 评论 -
浅谈分库分表那些事儿
本文主要阐述在分库分表改造过程中需要考虑的因素以及对应的解法,还有踩过的那些坑。一 前言我们既然要做分库分表,那总要有个做事的动机。那么,在动手之前,首先就要弄明白下面两个问题。1 什么是分库分表?其实就是字面意思,很好理解: 分库:从单个数据库拆分成多个数据库的过程,将数据散落在多个数据库中。 分表:从单张表拆分成多张表的过程,将数据散落在多张表内。 2 为什么要分库分表?关键字:提升性能、增加可用性。从性能上看随着单库中的数据量越来越大、数据库的查询...转载 2021-09-24 14:09:32 · 315 阅读 · 0 评论 -
关于数据库冗余字段的几点思考
创建冗余字段的目的有两个:1.避免连表查询;2.保存历史快照。保存历史快照(比如订单表的单价)不存在数据一致性问题,所以无需过多讨论。因避免连表查询而创建的冗余字段,如果冗余字段可能会修改,则存在数据一致性问题,需要同步数据。同步方案可参考:数据库冗余字段的同步策略和管理实际上为了避免连表查询,也不一定非要创建冗余字段。如果要冗余的字段只作为显示,而不作为查询条件,则可以不创建冗余字段,可以通过缓存解决。...原创 2021-09-24 13:22:50 · 1614 阅读 · 0 评论 -
数据库冗余字段的同步策略和管理
冗余字段的使用在多表联合查询都是大数据量的表的情况下,确实是个不错的选择,有效的减少了IO操作。但结合已有的项目产品来看,冗余字段确实是双刃剑。尤其是大项目的开发,如果忽略某个表的冗余字段的更新,那么后果是灾难性的。如何有效的管理冗余字段是开发组内必须解决的问题。我的解决方案是:使用专门的表来管理冗余字段。例如article表有以下冗余字段fromUserName,toUserName如何管理这两个字段呢?通过建立一个表,表结构如下id,objTable,objName,sourceTable,转载 2021-09-24 13:20:20 · 2442 阅读 · 0 评论 -
Quartz框架多个trigger任务执行出现漏执行的问题分析
一、问题描述使用Quartz配置定时任务,配置了超过10个定时任务,这些定时任务配置的触发时间都是5分钟执行一次,实际运行时,发现总有几个定时任务不能执行到。二、示例程序1、简单介绍采用spring+quartz整合方案实现定时任务,Quartz的SchedulerFactoryBean配置参数中不注入taskExecutor属性,使用默认自带的线程池。准备了15个定时任务,全部设置为每隔10秒触发一次,定时任务的实现逻辑是使用休眠8秒的方式模拟执行定时任务的时间耗费。2、配置文件信息如下(节转载 2021-05-27 10:54:30 · 3990 阅读 · 1 评论 -
以交易系统为例,看分布式事务架构的五大演进
一、概述在支付、交易、订单等强一致性系统中,我们需要使用分布式事务来保证各个数据库或各个系统之间的数据一致性。举个简单的例子来描述一下这里数据一致性的含义。程序员小张向女友小丽转账100人民币,转账过程是:先扣除小张100元,再为小丽的账户添加100元。如果在转帐过程中,扣款操作和打款操作要么同时执行,要么同时都不执行,我们就认为转帐过程保证了数据一致性。上面的例子中,如果我们不使用分布式来保证转账过程中数据的一致性,就有可能出现小张账户上的钱被扣除,而小丽...转载 2021-04-11 18:20:40 · 311 阅读 · 0 评论 -
贫血模型与充血模型
什么是MVC架构?MVC 三层架构中的 M 表示 Model,V 表示 View,C 表示 Controller。它将整个项目分为三层:数据层、展示层、逻辑层。模型:负责存储系统的中心数据 视图:将信息显示给用户 控制器:处理用户输入的信息,负责从视图读取数据,控制用户输入,并向模型发送数据,是应用程序中处理用户交互的部分。MVC 三层开发架构是一个比较笼统的分层方式,落实到具体的开发层面,很多项目也并不会 100% 遵从 MVC 固定的分层方式,而是会根据具体的项目需求,做适当的调整。比转载 2021-01-27 10:35:51 · 3965 阅读 · 3 评论 -
避免参数定义不当引起接口频繁变动
接口在java中是个很好的东西,使用接口能够使设计变得灵活,运用得好能够很大程度减少代码之间的耦合度,提高系统的扩展性。一个好的接口,不应该是经常变动的,接口的定义体现着设计者对业务的理解和计者设计的功底。实际中,接口的设计往往不可能面面俱到,但是应该尽量避免变动。这里发现一条经验,就是接口传递参数时,尽量用一个参数封装多个参数,比如说接口中有个方法:public void ...原创 2018-07-22 22:02:44 · 1233 阅读 · 0 评论 -
远程过程调用(RPC)详解(发展历史)
原文同步至 http://waylau.com/remote-procedure-calls/本文介绍了什么是远程过程调用(RPC),RPC 有哪些常用的方法,RPC 经历了哪些发展阶段,以及比较了各种 RPC 技术的优劣。什么是 RPCRPC 是远程过程调用(Remote Procedure Call)的缩写形式,Birrell 和 Nelson 在 1984 发表于 A转载 2017-09-09 22:59:23 · 4422 阅读 · 3 评论 -
对软件架构设计的一些总结和理解
1. 软件架构设计的What & Why● 啥是软件架构(Software Architecture)?软件架构是指在一定的设计原则基础上,从不同角度对组成系统的各部分进行搭配和安排,形成系统的多个结构而组成架构,它包括该系统的各个组件,组件的外部可见属性及组件之间的相互关系。组件的外部可见属性是指其他组件对该组件所做的假设。软件架构设计就是从宏观上说明一套软件系统的组成与特性。软转载 2017-03-18 19:29:16 · 1504 阅读 · 0 评论 -
生成Excel树形表头
源数据格式:String[] targetNames = { "指标名称", "单位", "xx_yy1", "xx_yy2_zz1", "xx_yy2_zz2", "2017年5月_主营业务收入_累计", "2017年5月_主营业务收入_同比", "2017年5月_主营业务收入_本月", "2017年5月_主营原创 2017-07-09 22:30:41 · 1120 阅读 · 2 评论 -
统一处理与分而治之
有一个Excel数据上报系统,有不同的模板。有两种解决方案:1.让用户针对不同的模板建表,并且用元数据对这些表进行管理(我们公司叫编目);2.系统针对每个模板建一个表。第一种方案代码量少,但是不够灵活,要求模板比较规范,比如不能有合并单元格的情况(如果有,则必须有简单、明确的合并规则)。如果某个模板有特定的业务要求,则可能需要修改整个设计,违背了开闭原则,破坏了系统的正交性。第二种方案原创 2017-06-14 22:59:41 · 479 阅读 · 0 评论 -
需求边界蔓延
良好的需求定义应该包括对系统边界的描述。系统边界是系统包含的功能与系统不包含的功能之间的界限。也就是说,需求定义需要指出系统内部和系统外部的分界线。这一界定过程一般会在需求分析时完成,我认为,这个边界描述应该成为需求规格说明书的必要组成部分。它可以描述为系统“做”什么,也可以更清晰和明了的指出系统“不做”什么。这个边界,应该像孙悟空用金箍棒画的圈圈,被圈起来的需求,必须是只能出不能进;否则,需求边转载 2017-06-23 14:16:23 · 2315 阅读 · 0 评论 -
论权限管理
一、 权限管理1.1 什么是权限管理基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。1.2转载 2017-07-04 23:12:30 · 1071 阅读 · 0 评论 -
JMS基本概念
摘要:The Java Message Service (JMS) API is a messaging standard that allows application components based on the java Platform Enterprise Edition (Java EE) to create, send, receive, and read messages转载 2017-07-16 20:43:03 · 322 阅读 · 0 评论 -
软件的熵(entropy) 总结
大千世界,无奇不有,但大都逃不出规律、哲学的范畴。最近终于又长见识了!尽管软件开发几乎不受任何物理定律的约束,熵(entropy)对我们的影响却很大!熵是一个来自物理学的概念,指的是某个系统中的“无序”的总量。遗憾的是,热力学定律保证了宇宙中的熵倾向于最大化!比如说:宇宙中的任何温度高的物质,总会一直慢慢的趋向于绝对零度,这是不可逆的,它普遍存在于很多领域!再比如说转载 2017-08-16 11:22:13 · 792 阅读 · 0 评论 -
成为Java软件架构师必看的东西
一、 Java编程入门类对于没有Java编程经验的程序员要入门,随便读什么入门书籍都一样,这个阶段需要你快速的掌握Java基础语法和基本用法,宗旨就是“囫囵吞枣不求甚解”,先对Java熟悉起来再说。用很短的时间快速过一遍Java语法,连懵带猜多写写代码,要“知其然”。现在很多IT职业培训机构为使学员学得扎实,不畏难易接受,如北大青鸟从零基础开始教学,让学员从最基础的开始学起,慢慢深化。转载 2013-01-30 11:04:29 · 4732 阅读 · 0 评论 -
软件生命周期
概括地说,软件生命周期由软件定义、软件开发和运行维护3个时期组成,每个时期又可进一步划分成若干个阶段。软件定义时期的任务是确定软件开发工程必须完成的总目标;确定工程的可行性;导出实现工程目标应该采用的策略及系统必须完成的功能;估计完成该项工程需要的资源和成本,并且制订工程进度表。这个时期的工作通常又称为系统分析,由系统分析员负责完成。软件定义时期通常进一步划分为3个阶段,即问题定义、可行性研究原创 2017-07-26 23:24:10 · 1956 阅读 · 0 评论 -
将RMI的提供者和客户端部署到不同的机器上
服务接口:package com.zzj.jndi.service;import java.rmi.Remote;import java.rmi.RemoteException;public interface JndiService extends Remote { public int getNext() throws RemoteException;}接口实现类:pac原创 2017-09-24 14:58:28 · 1042 阅读 · 0 评论 -
RMI不支持远程注册(绑定)
两台机器:1.Linux(192.168.80.129)2.Windows(192.168.80.1)Linux作为服务注册机,Windows作为服务提供者。服务接口:package com.zzj.jndi.service;import java.rmi.Remote;import java.rmi.RemoteException;public interface Jn原创 2017-09-24 18:46:59 · 3523 阅读 · 0 评论 -
dubbo入门
服务注册中心使用zookeeper,部署在Linux(192.168.80.129)上。Maven pom.xml文件:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mave原创 2017-09-24 20:06:29 · 890 阅读 · 0 评论 -
正排索引和倒排索引
正排索引(正向索引)正排表是以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档。正排表结构如图1所示,这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于维护;因为索引是基于文档建立的,若是有新的文档加入,直接为该文档建立一个新的索引块,挂接在原来索引文件的后面。若是有文档删除,则直接找到该文档号文档对应的索引信息转载 2015-09-23 10:50:29 · 34178 阅读 · 5 评论