Archive for System Design & Architecture

工作流系统的设计

工作流系统的设计

几年前曾经写过一点点对于缓存框架设计的体会,这大半年和工作流系统打交道颇为丰富,因此想总结一点关于工作流系统的设计。

首先,明确工作流(workflow)系统的定义。维基百科上有极其简单的介绍。我记得以前在文章里面说过,作为大公司里面的小team,为了做一些有趣的东西,从而更好的招人,通常有几个众人皆知的突破口:比如一个更符合业务需求的storage,再比如一个自定义的工作流系统。在Amaz

[......]阅读全文

分享到:

一种工作流心跳机制的设计

最近工作中一直和SWF(Amazon的Simple Work Flow)打交道,在一个基于SWF的工作流框架上面开发和修bug。SWF的activity超时时间是5分钟,在activity task开始执行以后,activity worker需要主动发送心跳请求告知service端:“我还活着,我还在干活”,如果出现超过5分钟(可以配置)没有心跳,SWF的service端就认为,你已经挂了,我需要

[......]阅读全文

分享到:

三次性能优化经历

三次性能优化经历

最近在做一些性能优化工作,回想起工作这些年来,参与过的三次集中性能优化,每次都得折腾少则一个月,多则半年。这些内容既是不同视角、不同思路的比较,也是挺有趣的工作经历。

Portal的性能优化

这已经是大概五年前了,搞了接近半年的Portal性能优化,后来某些内容总结在这篇文章里面。既然是Portal,性能优化上就有它的特点。比如说:

Portal的性能优化需要从前端和后端两个角度去思考问题,先考

[......]阅读全文

分享到:

系统设计的典型分层和涉及的知识点

作为系统设计学习的一部分,不久前在梳理面试中典型的系统设计问题,发现大部分都可谓有套路可寻。我把思路梳理了一下,简单整理到下面这张图表里面:

系统设计的典型分层和涉及的知识点

对于其中的内容,稍微补充几句:

  • 系统设计需要经验的积累,但也确确实实有章可循。问的问题考察的类型很集中,比如同步、异步,消息push和pull,根据实际问题设计存储的数据结构,对于scalability、availability的认识等等。最喜

[......]阅读全文

分享到:

读写模型整理笔记

读模型

1、主键读

最常见的读模型,说是主键,其实也包括其它索引键,或者联合主键。

常见实现:hash,时间复杂度可以接近O(1);B树或变种:时间复杂度接近O(log(n))。

关于B树和变种:

B树(B-树):本质上是二叉查找树的升级版,变成了平衡的N叉查找树,这个N的范围根据磁盘一次读取的块大小来调整,这样复杂度log n的底数就从2变成一个更大的数,减少了树的高度。除此以外,还有一些额外的

[......]阅读全文

分享到:

系统设计典型问题的思考

系统设计典型问题的思考系统设计方面的问题问题是非常考验经验和思维过程的,而且和常见的算法问题、语言基础问题不同,涉及的面很广,还没有比较一致的判别标准。但无论如何,还是可以归纳一些常见的思路和典型问题的线索。

首先,反复沟通和澄清系统需求。只有把需求澄清清楚了,才可以开始思考并落到纸面上。但是需求的沟通应该是持续和循序渐进的,问题很难从一开始就思考全面。最重要的条目包括:

  • use cases,通常问题只需要2~3个u

[......]阅读全文

分享到:

程序的库设计

程序的库设计 最近在Stack Exchange上面看到一个帖子,是问程序库设计的指导原则的,“What guidelines should I follow while designing a library?”,有趣的是,很多人都在谈论面向设计,各路API设计,还有程序语言设计,唯独搜索“程序库设计”,无论中文还是英文,Google还是百度都找不到太多内容。但是我想,没有程序员会否认库设计的重要性吧,我想

[......]阅读全文

分享到:

实际技术选型的考虑因素

实际技术选型的考虑因素

最近在工作中我需要把数据从公共的Data Warehouse(数据仓库)导出来,放到属于我们team自己账号的云端存储资源中去,然后再在我们的应用中查询这样的资源。需要导出数据是因为直接从Data Warehouse查询数据是一个缓慢而且异步的过程,而我们的应用数据查询需要实时性。现在要解决这个问题有一些AWS的服务可供我们可以选择,基本上分成了两大类:

第一类是存储和内容分发(Storage

[......]阅读全文

分享到:

留心那些潜在的系统设计问题

留心那些潜在的系统设计问题在系统设计阶段考虑全面很难,有许多人倾向于把整个设计分成若干阶段,在迭代中完成整个设计,这本身是非常好的,但是,就如同“先做出来,以后再优化”这样的经典谎言一样,本身并无错,只是许多程序员都不习惯于真正的迭代设计和迭代优化。举例来说,有一个日益复杂的类,每个人都修改一点点,一直到最后都没有人愿意去做重构,大家的心态都是一样的:“我只修改了一点点,为什么要我去动那么大的刀,于我没有任何好处”。我不在

[......]阅读全文

分享到:

用户积分功能的设计

用户积分功能的设计 有一个SNS应用,用户在使用的过程中积累积分,例如登陆+3点,个人空间每次浏览+1点,结交每个朋友+5点等等。同时,很重要的一点是,用户需要看到自己的积分累计有多少,能够根据积分划分用户等级,在自己的空间展示积分。

在用户量比较大的情况下(例如超过三千万),这是一个比较典型的读写都很频繁的问题,而且写入的次数可能和读取的次数差别不大(大多数SNS应用中,读次数远超写次数的场景居多,例如用户的状态

[......]阅读全文

分享到:

MVC框架的映射和解耦

MVC框架的映射和解耦 最近在写一个业务上用到的框架,回想起接触过的一些MVC框架,尤其是主要贡献在后端表现层上的那些,它们之间有太多的相似,在不断解耦的过程中,层数和模块数也越来越多,需要不断引入层与层之间的映射逻辑将不同层次之间关联起来,我们不妨来查看一下这个过程,能否寻找一些MVC框架的共性和启示。

MVC 1到MVC 2模型的进化

这个话题有点老。MVC 1在桌面程序中应用较多,业务逻辑当然放在Model里面,

[......]阅读全文

分享到:

DAO的演进

DAO的演进 这个思考源于最近项目中对DAO的使用和讨论。数据访问对象,在贫血模型下,要怎样去设计,框架需要完成什么,后续的开发人员需要关注什么,设计的时候到底需要把握怎样的粒度?

最早做项目的时候,是老老实实给每个必要的模型增加DAO接口和实现类的:

public interface IUserDAO{
    public long add(User user);
    public void

[......]阅读全文

分享到:

网站性能优化的三重境界

网站性能优化的三重境界

这篇文章是关于网站性能优化体验的,性能优化是一个复杂的话题,牵涉的东西非常多,我只是按照我的理解列出了性能优化整个过程中需要考虑的种种因素。点到为止,包含的内容以浅显的介绍为主,如果你有见解能告知我那再好不过了。无论如何,希望阅读它的你有所收获。

 

我眼中的网站性能问题都反映了一个网站的“Availability”(中文叫做可用性,但是这个翻译也不足够

[......]阅读全文

分享到:

大型互联网应用的技术选型和决策,10条成功与失败的记录

大型互联网应用的技术选型和决策,10条成功与失败的记录 作为以老版本为模子重做的解耦版本,这个大型互联网应用产品是从2009年中开始落地的。而我本人也是该版本的主创人员之一,到今日,团队已经发展到开发测试人数百人的大型互联网产品团队的规模,发布、割接和上线了许许多多个商用版本。

 

对架构的审视,对选型和设计的反思,不仅仅要在产品初创时期,更要在产品发展的整个过程中进行,团队做同类型产品的能力就是这样在不断总结和自我批评中成熟的。以下为个

[......]阅读全文

分享到:

设计缓存框架需要关注的要素

设计缓存框架需要关注的要素 最近关注了一些缓存框架的特性和实现,包括OSCache、JCS、Ehcache、Memcached等等,公司的两个缓存框架,以及一个标准JSR 107(JCache),发现一些诸多类同的方面。如果你不够熟悉以上,不妨先看看这两篇文章:OSCache框架源码解析》和《Ehcache详细解读》,再看下面的内容也许会有更多想法。之后再思考,如果要自己去实现一套缓存框架,需要考虑哪些东西?

1、为哪些数

[......]阅读全文

分享到:

你会怎样设计铁道部购票网站?

你会怎样设计铁道部购票网站? 最近铁道部购票已经成为了热点话题,毛病多得一塌糊涂,如果让你来设计铁道部购票网站,你会怎么做?

 

这样的网站属于实时性要求较高、并发性要求非常高、容量要求一般的类型,以下是我简单的想法:

 

1、部署是基于CDN的,对于车票查询的环节来说,这是没有问题的。

 

2、数据库表设计上面,应当有一张车次表,每行代表一趟车,至少有这样的字段:还剩多少张,已被锁定多少张。

[......]阅读全文

分享到:

Flash Scope

项目中遇到了一个潜在的问题,大致就是说,在一个流程的两个或某几个环节中,需要短暂地存储一部分对象(如果不存储,就需要在这几个环节中多次调用同一个外部接口,这被认为是不够合理的实现)。

而这部分对象的存储:

(1)如果用request,太小,毕竟一次提交以后就丢失了,如果需要往后传递,可能需要借助一些页面参数传值等丑陋或是不易控制的方法;

(2)如果用session,太大,我不需要在整个用户会话生命

[......]阅读全文

分享到:

说说JavaEye网站架构

说说JavaEye网站架构 偶然看到了Robbin的一则胶片《JavaEye网站架构解密》,说到了一些JavaEye的一些实现,那就来看看有哪些有意思的东西。

我正在参与做的一个项目,在某某地方上线,需要几十块单板集群;在某某地方上线,又需要怎样的一个集群组网。咋听起来兴许觉得能有怎样的业务逻辑处理和怎样的用户量呢?可是JavaEye让我很吃惊,我先前只知道与CSDN比起来,JavaEye确实是一个小规模一些的网站,专业

[......]阅读全文

分享到:

Preview on Feedage: