
设计与架构
工程师WWW
R
展开
-
最全面透彻的RabbitMQ指南
本文大纲RabbitMQ 历史 RabbitMQ 应用场景 RabbitMQ 系统架构 RabbitMQ 基本概念 RabbitMQ 细节阐明历史-从开始到现在RabbitMQ是一个Erlang开发的AMQP(Advanced Message Queuing Protocol )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(...原创 2019-12-23 10:36:15 · 653 阅读 · 0 评论 -
秒杀系统架构分析与实战
1 秒杀业务分析2 秒杀技术挑战3 秒杀架构原则4 秒杀架构设计5 大并发带来的挑战6 作弊的手段:进攻与防守7 高并发下的数据安全8 总结1 秒杀业务分析 正常电子商务流程(1)查询商品;(2)创建订单;(3)扣减库存;(4)更新订单;(5)付款;(6)卖家发货 秒杀业务的特性(1)低廉价格;(2)大幅推广;(3)瞬时售空;(4)一般是定时上架;(5)时间短、瞬时并...原创 2019-12-22 21:28:31 · 464 阅读 · 0 评论 -
关于IoC控制反转的设计原则
静态类的使用是一个有争议的话题,有人甚至提倡不要在类的名称上使用作用域限定符。关于静态特性争论的焦点在于一个被称为IoC控制反转的设计原则。IoC这个设计原则试图在面向对象编程中去掉所有相互依赖的现象。这个原则对于复杂的系统来说是很重要的。它使得对象具有更好的多态性和封装性。相互依赖的现象越少,就越容易单独测试某个组件。静态类与IoC之间的问题在于静态访问特性,这个特性从本质上来说原创 2012-07-18 14:52:40 · 1694 阅读 · 0 评论 -
设计模式----Singleton(单例)
作用:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 UML结构图: 解析: Singleton模式其实是对全局静态变量的一个取代策略,上面提到的Singleton模式的两个作用在C++中是通过如下的机制实现的:1)仅有一个实例,提供一个类的静态成员变量,大家知道类的静态成员变量对于一个类的所有对象而言是惟一的 2)提供一个访问它的全局访问点,也就是提供对应的原创 2010-02-07 11:06:00 · 1545 阅读 · 2 评论 -
设计模式----Strategy(策略)
作用: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 解析: 简而言之一句话,Strategy模式是对算法的封装.处理一个问题的时候可能有多种算法,这些算法的接口(输入参数,输出参数等)都是一致的,那么可以考虑采用Strategy模式对这些算法进行封装,在基类中定义一个函数接口就可以了. #includ原创 2010-02-06 01:02:00 · 967 阅读 · 0 评论 -
设计模式----Adapter(适配器)
作用: 将一个类的接口转换成客户希望的另外一个接口。Adapt 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 UML示意图 1)采用继承原有接口类的方式 2)采用组合原有接口类的方式 解析: Adapt模式其实就是把完成同样的一个功能但是接口不能兼容的类桥接在一起使之可以在一起工作,这个模式使得复用旧的接口成为可能. 实现:原创 2010-02-07 13:51:00 · 1762 阅读 · 0 评论 -
设计模式之-----Bridge
抽象基类: 1)Abstraction:某个抽象类,它的实现方式由Implementor完成. 2)Implementor:实现类的抽象基类,定义了实现Abastraction的基本操作,而它的派生类实现这些接口. 接口函数: 1)Implementor::OperationImpl:定义了为实现Abstraction需要的基本操作,由Implementor的派生类实现之,原创 2010-02-04 16:56:00 · 1105 阅读 · 0 评论 -
策略模式VS桥模式
这对冤家终于碰头了,策略模式与桥模式是如此相似,简直就是孪生兄弟,要把它们两个分开需要花费大量智力,我们来看看两者的通用类图,如下所示。 什么?你没有看出两者之间很相似?如果把策略模式的Context变更为一个抽象类加一个实现类,或者桥模式的抽象角色未实现,只有抽象角色,想想看,这两个类图有什么地方不一样?一样,完全一样! 正是由于类似场景存在才导致了两者在实际应用中经常混淆的情原创 2012-08-21 16:26:26 · 1684 阅读 · 0 评论 -
设计模式----Command模式
命令模式(Command)的目标是将一个请求封装成一个对象,因此可以参数化多个客户的不同请求,将请求排除,记录请求日志,并支持撤消操作。 结构图如下:其实现思想是将一个请求封装到一个类中(Command),再提供接收对象(Receiver),最后Command命令由Invoker调用。 以一个电灯开关为例,命令的执行、不执行相对于开关的打开、关闭操作,由开关发出命令,电灯接收命原创 2010-02-04 23:35:00 · 1151 阅读 · 0 评论 -
设计模式----State(状态)
作用: 允许一个对象在其内部状态改变时改变它的行为. UML结构图:解析: State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译.State模式采用了对这些不同的状态进行封装的方式处理这类问题原创 2010-02-06 23:08:00 · 1026 阅读 · 0 评论 -
设计模式----Proxy模式
作用: 为其他对象提供一种代理以控制对这个对象的访问。UML结构图: 抽象基类:1)Subject:定义了Proxy和RealSubject的公有接口,这样就可以在任何需要使用到RealSubject的地方都使用Proxy. 解析: Proxy其实是基于这样一种时常使用到的技术-某个对象直到它真正被使用到的时候才被初始化,在没有使用到的时候就暂时原创 2010-02-04 23:03:00 · 1333 阅读 · 0 评论 -
设计模式----Prototype
#include using namespace std;// 虚拟基类,所有原型的基类,提供Clone接口函数class Prototype{public: Prototype(){} virtual ~Prototype(){} virtual Prototype* Clone() = 0;};// 派生自Prototype,实现Clone方法class Concr原创 2010-02-07 11:11:00 · 1063 阅读 · 0 评论 -
23模式之外的模式——规格模式Specification Pattern
规格模式是组合模式的一种扩展,在框架性开发中使用较多(项目级开发很少使用),这里做一个简单的介绍。 这里假设了一个这样一个场景,有一堆的User对象,UserProvider提供查询服务。们来看组合规格书(CompositeSpecification),它是一个抽象类,实现了与或非的操作,如下所示。public abstract class Com原创 2012-08-21 17:21:05 · 4965 阅读 · 0 评论 -
设计模式----Builder(生成器)
UML结构图:适用于以下情况:1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 2)当构造过程必须允许被构造的对象有不同的表示时。抽象基类:1)Builder:这个基类是全部创建对象过程的抽象,提供构建不同组成部分的接口函数接口:1)Builder::BuildPartA,Builder::BuildPartB:是对一个对象不同部分的原创 2010-02-05 23:24:00 · 1182 阅读 · 0 评论 -
论软件开发中的宏观与微观
宏观,即系统设计与架构;微观,即算法精确实现,两条路,选一条坚定地走下去,可有所成。夹在中间的则是添砖加瓦的码农,如果不脱离这个层次,则只能面临淘汰。我,似乎适合宏观,天赋所致。框架先这么定,具体以后再详述。C/S架构要点:C要炫,S要海量吞吐量,稳定性预备话题:项目API,类API的独立性,好代码特征:搜索结果最小化C API的设计广泛采用前缀法.原创 2011-12-24 17:07:02 · 1982 阅读 · 6 评论 -
架构设计:生产者/消费者模式
概述今天打算来介绍一下“生产者/消费者模式”,这玩意儿在很多开发领域都能派上用场。由于该模式很重要,打算分几个帖子来介绍。今天这个帖子先来扫盲一把。如果你对这个模式已经比较了解,请跳过本扫盲帖,直接看下一个帖子(关于该模式的具体应用)。看到这里,可能有同学心中犯嘀咕了:在四人帮(GOF)的23种模式里面似乎没听说过这种嘛!其实GOF那经典的23种模式主要是基于OO的(从书名《Des原创 2012-08-06 23:46:46 · 1986 阅读 · 0 评论 -
Anti-pattern
原文:http://en.wikipedia.org/wiki/Anti-pattern译文:http://www.yeeyan.com/articles/view/27472/7244[前言]design pattern是设计模式,通常是前人在软件开发过程中积累出来的解决一些问题的现成套路,按它们来做可获益无穷。anti-pattern也是一些现成的套路,但它们是现成的原创 2012-05-19 00:18:42 · 3546 阅读 · 1 评论 -
JDK里的设计模式
下面是JDK中有关23个经典设计模式的示例,在stakeoverflow也有相应的讨论:http://stackoverflow.com/questions/1673841/examples-of-gof-design-patternsStructural(结构模式)Adapter:把一个接口或是类变成另外一种。java.util.Arrays#asLi原创 2012-07-22 14:56:44 · 1405 阅读 · 0 评论 -
C++类设计者的核查表
1. 类需要构造函数么? 2. 数据是否需要保持私有的? 方案一 public: int length; 方案二 public: const int& length;//在构造函数中length = true_length;这样由于是const变量,只能读,不能修改。 private: int true_length;方案三 public: int length() const;/原创 2012-07-25 23:34:11 · 1201 阅读 · 0 评论 -
软件工程中的内聚与耦合
简单地说,对象之间的耦合度就是对象之间的依赖性。指导使用和维护对象的主要问题是对象之间的多重依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。 有软硬件之间的耦合,还有软件各模块之间的耦合。 耦合性是程序结构中各个模块之间相互关联的度量.它取决于各个模块之间的接口的复杂程度、调用模块的方式以及哪些信息通过接口.一般模块之间可能的连接方式有七种,耦合原创 2012-07-27 15:14:42 · 7175 阅读 · 0 评论 -
大型网站的负载均衡器、db proxy和db
本文主要分析网站后台架构中的负载均衡器,企业常用的硬件负载均衡器软件负载均衡器、数据库代理服务器和数据库。1.1 负载均衡在大型网站部署中,负载均衡至少有三层部署。第一层为web server或者缓存代理之上的负载均衡,第二层为数据库之上的负载均衡,第三层为存储设备之上的负载均衡。在第一层部署中,最常使用的是硬件负载均衡器有F5 BIG-IP、Citrix NetScale原创 2012-07-27 20:12:08 · 1798 阅读 · 1 评论 -
用C++进行函数式编程
或许本文的每位读者都听说过,当初“函数式编程”(Functional Programming)肩负着为软件开发带来福祉的期望来到这个世界,大家可能还听说过有人将它奉为软件开发的银弹。然而,上维基百科查看更多信息却让人大倒胃口,一上来就引用λ演算和形式系统。很难一眼看出这跟编写更好的软件有什么关系。我的实效性总结:软件开发中的大部分问题都缘于程序员没有完全理解程序执行中所有可能的状态。在多线程环原创 2012-07-27 00:23:05 · 2450 阅读 · 0 评论 -
一个高效的内存池实现
在高效C++编程中看到一个不错的内存池实现方案,这里共享下,大家看看有什么不足。代码很简单,如下:templateclass CMemoryPool{ public: enum { EXPANSION_SIZE = 32}; CMemoryPool(unsigned int nItemCount = EXPANSION_SI原创 2011-12-14 22:37:02 · 1824 阅读 · 1 评论 -
23种经典设计模式概览
创建型模式: Abstract Factory(抽象工厂):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 Builder(生成器):将一个复杂对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表述。 Factory Method(工厂方法):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一原创 2010-02-04 10:00:00 · 2098 阅读 · 0 评论 -
UML关系 图示
UML把类之间的关系分为以下5种. ● 关联:类A与类B的实例之间存在特定的对应关系 ● 依赖:类A访问类B提供的服务 ● 聚集:类A为整体类,类B为局部类,类A的对象由类B的对象组合而成 ● 泛化:类A继承类B ● 实现:类A实现了B接口 关联(Association) 关联指的是类之间的特定对应关系,在UML中用带实线的箭头表示。按照类原创 2010-02-05 16:30:00 · 3749 阅读 · 1 评论 -
设计模式----Memento(备忘录)
作用: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. UML结构图: 解析: Memento模式中封装的是需要保存的状态,当需要恢复的时候才取出来进行恢复.原理很简单,实现的时候需要注意一个地方:窄接口和宽接口.所谓的宽接口就是一般意义上的接口,把对外的接口作为public成员;而窄接口反之,原创 2010-02-07 00:12:00 · 1165 阅读 · 0 评论 -
内存管理与检测
今天开始重构一个DEMO工程,在整理代码时发现之前写过的一个内存管理与内存检测代码,再此梳理一番加深下印象。一.内存检测模块的作用:在做项目时经常出现内存泄漏内存访问越界等情况,当工程比较大时排查起来会相对比较困难。这个内存管理模块的作用就是管理内存分配和使用并在DEBUG环境下统计内存使用违规情况。原创 2014-02-09 15:11:02 · 1371 阅读 · 0 评论 -
如何写出无法维护的代码
酷壳里有很多我觉得很不错的文章,但是访问量最大的却是那篇《6个变态的Hello World》,和它能在本站右边栏“全站热门”中出现的还有“如何加密源代码”,以及编程真难啊等这样的文章。可见本站的读者们的偏好,我也相信你们都是“身怀绝技”的程序员。所以,今天给大家推荐这篇文章,相信一定能触动大家的兴奋点。这篇文章的原文在这里(http://mindprod.com/jgloss/unma原创 2014-11-25 22:24:05 · 1505 阅读 · 0 评论 -
分布式存储概述
分布式存储是相对于单机存储而言,之所以要分布自然是因为互联网时代信息数据大爆炸,单机已经难以满足大型应用的数据存储需求。存储系统的关注点关于存储系统,一般我们关注下面几个方面:数据分布与负载均衡数据存储的可靠性与一致性数据访问性能系统容错能力系统扩展能力在单机存储系统中有一种独立磁盘冗余阵列(RAID,redundant array of independent d原创 2016-01-27 19:25:23 · 1393 阅读 · 0 评论 -
灰度发布系统的实现
灰度发布,已经不是一个很新的概念了.一个产品,如果需要快速迭代开发上线,又要保证质量,保证刚上线的系统,一旦出现问题那么可以很快的控制影响面,就需要设计一套灰度发布系统.灰度发布系统的作用在于,可以根据自己的配置,来将用户的流量导到新上线的系统上,来快速验证新的功能修改,而一旦出问题,也可以马上的恢复,简单的说,就是一套A/BTest系统.它大抵的架构,应该是类似这样的:原创 2016-09-19 21:38:27 · 46067 阅读 · 4 评论 -
值得推荐的C/C++框架和库
值得学习的C语言开源项目- 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。下载链接:http://home.tiscali.原创 2016-09-26 23:44:08 · 2281 阅读 · 0 评论 -
C++ 的API 设计指导
http://qt-project.org/wiki/API-Design-Principles摘要: 此文为Qt 官网上的API设计(for C++)指导准则,其中有不少原则具有普遍适用性,整个篇幅中有很多示例,是Qt在API设计上的实践。 正文: Qt 一致、易掌握、强大的API是它的众多著名的优点之一。此文总结了我们在设计Qt风格的API所积累的做法。其中许多准则...原创 2018-04-10 16:51:46 · 2144 阅读 · 0 评论 -
OAuth与SSO、REST有哪些区别与联系
谈到OAuth,很多人自然而然的就会想起SSO,还有些人会想起REST。其实,OAuth与SSO和REST并没有太深的关系,它们分别有其不同的适用场景。接下来,我们就看看它们之间的区别与联系是什么? OAuth与SSO的区别? OAuth是一种授权协议,只是为用户资源的授权提供了一个安全的、开放而又简易的标准。OAuth 2.0为客户端开发者开发Web应用,桌面端应用程序,移动应...原创 2018-04-19 10:39:31 · 976 阅读 · 2 评论 -
软件接口设计中的版本兼容问题处理
最近在项目中经常遇到软件版本升级后不兼容旧版本的问题,本文根据以往经验,从软件接口设计、实现等方面整理了一些兼容性设计思路。1. 优化设计1)接口返回值的定义有的人喜欢用0、1等较小的数字标记返回码或其他一些常量含义,比如我接触过几个项目,使用整型常量0作为成功的返回码,在以后的使用中,可能遇到的问题是整型的缺省值为0,这种情况下逻辑上无法区分没有返回值还是返回了0,如果某天出现了此类问题,也很...原创 2018-06-18 15:31:17 · 7920 阅读 · 0 评论 -
编写你的第一个垃圾收集器
本文由 伯乐在线 - deathmonkey 翻译自 stuffwithstuff。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。每当我倍感压力以及有很多事情要做的时候,我总是有这样一种反常的反应,那就是希望做一些其他的事情来摆脱这种状况。通常情况下,这些事情都是些我能够编写并实现的独立的小程序。一天早上,我几乎要被一堆事情给整疯了——我得看一本书、处理一些工作上的事情、还原创 2013-12-20 22:45:42 · 1268 阅读 · 0 评论 -
设计只能在堆或者栈上创建的类
1,设计只能在堆上分配的类方法:将类的构造函数或者析构函数设置为protected(private会限制继承),迫使类对象在栈的构造时编译出错,并提供destroy接口#include using namespace std; class OnlyHeap { public: OnlyHeap() {原创 2012-02-27 15:53:02 · 1358 阅读 · 2 评论 -
半同步半异步模式 -------一个架构模式,清晰的结构,高效并发的I/O
译者: cuichaox@gmail.com英文原文: http://www.cs.wustl.edu/~schmidt/PDF/HS-HA.pdfhttp://www.cs.wustl.edu/~Schmidt/PDF/PLoP-95.pdf摘要这篇文字介绍了半同步半异步模式,这个模式运用在复杂的并行系统中,把同步和异步I/O模型集成在一起,既保持了编程简单又保证了执原创 2011-10-16 19:06:02 · 3953 阅读 · 0 评论 -
Applied Long-Running Active Object Pattern
Download source - 462.66 KBIntroductionOnce I came across the problem of uploading a file from a client’s application to the application server. File sizes can vary and the situation where the原创 2012-09-24 23:34:55 · 2391 阅读 · 0 评论 -
Active object Design Pattern
This article is about a multi-threading technique. For the lockstep protocol variant, see Active objects.The active object design pattern decouples method execution from method invocation for原创 2012-09-24 23:52:02 · 1905 阅读 · 0 评论 -
Cpp Singleton
There appear to be 1001 different ways to implement the SingletonPattern in CeePlusPlus. Here are a few of my least (see SingletonsAreEvil) favourite:Using static methods/data: class Wib原创 2012-12-07 19:52:21 · 1457 阅读 · 0 评论