随笔分类 - 08. 架构经验&数据库技术
系统架构设计
摘要:说这是一个完全的解决方案,其实有点夸大了,但这个方案确实可以缓解TCP服务器遭受“拒绝服务攻击”时表现出的脆弱性。 当服务器以Tcp的方式提供服务时,客户端通过tcp连接上服务器。这时,恶意的程序,也可以通过tcp连接我们的服务器,如果恶意的程序采用循环与我们的服务器建立成千上万的连接,并在每个连接上都发送恶意的数据包给服务器,慢慢就会导致服务器资源耗尽而崩溃! 为了增强Tcp服务器在遭受“拒绝服务攻击”时的稳定性,我采用的方案是这样的:(1)通信协议的消息头增加Token字段,并且它是消息头的第一个字段。当服务器接收到一段数据,如果这段数据不是以Token打头,则关闭对应的TCP连接。这样.
阅读全文
摘要:近日,做一个分布式数据库定时同步的项目,也就是说有多个物理节点上的数据库需要在每天某时来同步表中的数据,对于某个指定节点上的某个表发生的变化(增量)可以通过对该表执行的SqlCommand来记录,当同步过程发生时,需要对其它所有节点上的同名表执行相同的SqlCommand。由于,同步是定时发生的,所以增量SqlCommand就需要首先被保存起来,开始我们计划将其序列化后保存在数据库中,但是到运行时,问题来了,SqlCommand是不可序列化的!!!所有继承自IDbCommand的类都是不可序列化的,所有继承自IDbParameter的实现类都是不可序列化的。 遇到了这个问题,是我们当初没有料.
阅读全文
摘要:(本文转自梦想风暴的blog)一个朋友发了封mail问了几个问题,其中的一个是关于IoC和DI的:Inversion of Control和Dependency Injection 是什么关系,我认为两个词代表的是同一个意思,只是两种不同的表示,对吗? 下面是我对这个问题的一些理解。准确的说,IoC和DI并不相同,这一点从字面上就可以看出,否则,它们可以叫一个名字。^_^ 理解IoC,我们需要知...
阅读全文
摘要:最初Peter Deutsch从J2EE的企业开发中总结了7大谬误,后来,James Gosling在其基础上增加了一条,再后来,Ted Neward又在其上增加了两条,总共为“十大谬误”。这段时间正在看两本书:《Effective Enterprise Java》和《J2EE AntiPatterns》,恰好两本书都提到了“分布式计算的*大谬误”,...
阅读全文
摘要:一个组件与另一个组件之间的关系可以通过三种方式建立起来:事件、依赖倒置、Bridge。现在我们只考虑单向依赖的关系,即信息提供者和信息消费者。事件是一种松耦合的信息发布方式,事件发布者(信息提供者)不需要关心事件预定者(即信息消费者)的任何信息,但是事件预定者需要依赖事件发布者;依赖倒置则反转了这种关系,在依赖倒置的方式中,信息提供者依赖信息消费者(你也许对这句话觉得奇怪,后面的例子会说明...
阅读全文
摘要:事件通知服务用于解决多个应用程序之间的事件发布与预定的问题。在.NET平台上,跨应用程序的事件发布/预定通常以Remoting作为底层的通信基础,在此基础之上,事件通知服务使用中介者模式来简化跨应用程序的事件通知问题。 本文采用的解决方案中,有两个重要组件:事件服务器EventServer和事件客户端EventClient。EventServer作为中介者,并作为一个独立的系统,通常可以将其作为w...
阅读全文
摘要:类厂服务的主要功能是简化创建具体工厂任务,使工厂访问代码和工厂创建代码解藕。类厂服务是以抽象工厂模式为基础,并且在其上进行再综合。 在正式进入正题之前,为了方便后面的叙述,先要澄清一些概念,把上下文(Context)搭建起来,然后,我们再在这个上下文中进行讨论。 首先是两个基本定义:族和系列。(这两个概念是我自创的,不知道常用的术语是什么,知道的朋友请留言告诉我:))(1)族 ...
阅读全文
摘要:所谓企业开发基础设施,指的是为那些几乎所有的企业开发都会遇到的共同的基础性的问题提供服务的设施,比如事务、日志、权限等等。其中很多设施都会以AOP的方式实现,有些则可能以类库的方式提供。我也一直在积累这方面的AOP组件和类库。 曾经做过一些关于日志、权限管理的AOP实现,这几天正在研究“类厂服务”,于是就有了写这个“企业开发基础设施”系列文章的想法,把自己的一些思想拿出来和大家一起讨...
阅读全文
摘要:人们都善于用直观简单的方式来理解事物,我也坚信,所有优秀的解决方案都是直观而简单的,我喜欢直观而简单的解决方案,也许在找到直观简单的解决方案之前,我们已经尝试了用很多复杂费解的方式来解决问题。如果你不能把我们程序的解决方案用通俗易懂的方式给隔壁卖青菜的阿伯解释清楚的话,说明,这个解决方案还不够好――还不够简单和直观。宇宙够复杂了吧,可是霍金却创作《时间简史》系列的科普读物,既然是科普,它的读者就是广大的普通老百姓,不一定非要是物理学或天文学的博士。 在软件解决方案上,为了追求直观而简单的解决方案,我们发明了面向对象,之后又是N层架构、面向组件、AOP,又到现在比较热门的MDA、WebServ.
阅读全文
摘要:所有的软件技术和思想的出现都是为了解决所在的那个年代软件开发的复杂性,对象技术和组件技术也不例外。当然还有很多其它技术,像DBC(契约式编程)、AOP、MDA等,这些思想都在影响我们设计/实现程序的方式,但无可否认的是,当今最主流的编程技术是对象技术和组件技术。 面向对象技术已经成熟的发展将近20年了,关于这方面的经典书籍和论文也随处可见。为了解决更大的系统的复杂度,组件技术应运而生,在windows平台上,组件从最初的动态链接库到COM,在到现在的中间件、.NET,就是组件思想走过的轨迹。 面向对象技术的基础是封装--接口与实现分离,面向对象的核心是多态--这是接口和实现分离的更高级升华,.
阅读全文
摘要:软件架构师的主要职责是什么?是抉择、是权衡。把软件称为艺术一点都没有夸张,可以说软件是科学、工程、与艺术的结合体。软件的艺术体现在权衡上。在这一期的《程序员》杂志上看到了一篇“鱼与熊掌--完美主义架构师的梦魇”,其中关于权衡要素的论述正切合我之所想,现将主要部分转摘如下,如果想了解更详细内容,请在本期程序员阅读全文。(1)Time or Space 时间 vs. 空间 牺牲内存换取时间或牺牲时间以节省内存是我们常用的伎俩。 (2)Elegancy or Efficiency 优雅 vs. 效率 比如,多态很优雅,却是以效率为代价,而丑陋的函数指针却正好相反。(3)Fashion or Fam.
阅读全文
摘要:1.异常处理相对于返回错误代码的一个最大优点在于,异常可以被自动传递,这样,在编程时异常更加难以被忽视。2.通常,只在最上层(一般是UI层)捕捉异常。如果要在其它层捕捉异常,除非是下列情况之一:(1)能够处理该异常,或者(2)能够忽略该异常,或者(3)需要转换该异常为其它特定异常后抛出新异常3.UI...
阅读全文
摘要:很久以前我就考虑这样一个问题:有这样一个函数,它的功能是从一个整数集合中返回最大的那个数,如何设计这个函数的签名了?当时没有得出令自己满意的答案,所以就搁浅了。今天重新思考,终于有所悟!现在把我思索的整个过程展现于此。最直观的函数签名设计如下:intGetMaxElement(ArrayListeleList);乍看之下,很好,很直接的反映了意图。稍微深入一点就发现,如果eleList为null或者其中元素个数为0,GetMaxElement返回什么了?第一反应,修改签名为下面的形式:boolGetMaxElement(ArrayListeleList,outintresult); 我问了很多
阅读全文