Web开发尤其是互联网相关的基本上需求是不停在增加的,以常用的blog的CURD功能举例;早期功能使用sql简单处理一下就可以了;一段时间后希望用搜索引擎代替数据库,
CUD时需要处理搜索相关的业务了;再过一段时间希望发表博客能够推送朋友动态功能等等;随着新事物、新技术的的兴起都会有新的改变吧;如何设计才能使得主模块的变动最小?
有些功能是不能影响主方法事物,如索引不成功不能使得整个保存过程失败。
解决方法一:代码堆积
Java代码:  
public Blog save(Blog blog) {  
          
        //索引处理  
          
        //推送动态  
          
        return blog;  
}  
 解决方法二:aop
    这个完全不要更改主要代码模块。
解决方法三:监听机制
    实现相应的Lister就可以了。
解决方法四:异步调用(JMS)
目前没有研究过希望有会的可以指导下。
单个方法处理功能太多可能会影响到批量处理,如删除博客的分类,可能需求是同时删除其下所有博文,简单点可以通过sql级联一起删除;但同时还要删除索引等相关信息;总不至于查出分类下所有博文,在调用单个删除方法吧。不知各位有好的设计没,大家一起讨论一下。

解决方案 »

  1.   

    基于异步的模型一般会更适合于高并发的场合。至于是主动通知还是定期扫描,则没有定论。
    也就是说,整体模型应拆解为两个部分:1、核心业务框架;2、辅助功能框架。核心业务框架是以最小化最高性能为设计目标;辅助功能框架以高可扩展性为设计目标;两者之间借助异步机制实现松耦合。至于删除博文这种事情,技术上不应该真的执行delete这样的动作,而是标志其失效(当然你也可以理解为标志为删除),至于什么时候真的删除,也许晚上用批处理也许永远也不删除(而后者多半是更合理的)。
      

  2.   

    如果把搜索服务化后,删除博文并非仅仅只改数据库,还要及时通知索引以避免影响搜索;先update以后再删除,一个操作需要执行两步,有什么好处吗?
      

  3.   

    由于设计不完善,开发过程中需求在变化导致代码不停修改;像索引,好友动态推送,缓存增加是否需要在业务层之上加一个service层处理这些?再问一个问题,统一缓存管理,我现在也没想好怎么设计,比如论坛系统如果对板块列表做缓存处理,增加、删除帖子时可能清除缓存不止一处,希望通过一定的设计及约束;可以通知到所有缓存。由于大多成员是新人甚至都没有能称得上设计师架构的成员,很多问题都是在实践教训中总结出来的,比如统一系统内部路径符、用enum代替静态变量、在方法开始前检查参数有效性等。尤其很多处理可选方案很多导致很多时候没法敲定下来;这方面的实践有可参考的出处吗?有没有一些开源项目可借鉴的。
      

  4.   

    ◎ 像索引,好友动态推送,缓存增加是否需要在业务层之上加一个service层处理这些?
    —— 不太清楚你的业务层和service层之间的差异是什么,基本上只要有一次封装就可以了,封装太多层意义也不大,所以要不要加层的判断依据就是:能否借助该层去透明化什么东西以实现什么好处?◎ 统一缓存管理,我现在也没想好怎么设计,比如论坛系统如果对板块列表做缓存处理,增加、删除帖子时可能清除缓存不止一处,希望通过一定的设计及约束
    —— 就缓存管理而言,比较成熟的是MemCache,提供了集群和分布式计算的能力,但你这里还不是这个问题;
    —— 缓存关联性失效管理,一般没有很成熟的解决方案,毕竟更多的是应用层面的问题;但有些缓存组件是提供了支持的,比如设置缓存组,如果组内发生更新则全组失效;不过个人感觉不如自己直接控制。
    —— 另一种方案是不控制,毕竟缓存本身就有失效时间,如果这种不刷新并不会带来本质问题,那就不刷新好了,等缓存失效自己更新。◎ 尤其很多处理可选方案很多导致很多时候没法敲定下来;这方面的实践有可参考的出处吗?有没有一些开源项目可借鉴的。
    —— 开源项目没法帮你解决设计方案的问题,设计师都是摔出来的;
    —— CheckStyle和FindBug可以帮你解决一些基础性风格与逻辑问题,整合到Eclipse中用很不错;
    —— 当有很多处理方案可选的时候,一般有几个判断过程:
    1、是否之前项目用过某种,且用于本次实施没有太大问题?(继承经验是最好的)
    2、是否是广泛使用的成熟技术?(大家的成功经验容易转化为你的成功经验)
    3、是否简单易用,对使用者技能要求不高?(我们不玩高科技)
    4、对环境是否存在严格限制或要求?(轻易别选个技术是FireFox Only的)
    至于其它什么“新技术”“超高性能”“超酷”,一般不纳入考虑范围。