细谈八种架构设计模式及其优缺点概述( 二 )


场景一:全文关键词检索
我想这个需求,绝大多数应用都会有,如果使用传统的数据库技术,大部分可能都会使用like这种SQL语句,高级一点可能是先分词,然后通过分词index相关的记录 。SQL语句的性能问题与全表扫描机制导致了非常严重的性能问题,现在基本上很少见到 。
这里的ES是ElasticSearch的缩写,是一种查询引擎,类似的还有Solr等,都差不多的技术,ES较Solr配置简单、使用方便,所以这里选用了它 。另外,ES支持横向扩展,理论上没有性能的瓶颈 。同时,还支持各种插件、自定义分词器等,可扩展性较强 。在这里,使用ES不仅可以替代数据库完成全文检索功能,还可以实现诸如分页、排序、分组、分面等功能 。具体的,请同学们自行学习之 。那怎么使用呢?一个一般的流程是这样的:

  1. 服务端把一条业务数据落库
  2. 服务端异步把该条数据发送到ES
  3. ES把该条记录按照规则、配置放入自己的索引库
  4. 客户端查询的时候,由服务端把这个请求发送到ES,得到数据后,根据需求拼装、组合数据,返回给客户端
实际中怎么用,还请同学们根据实际情况做组合、取舍 。
场景二:大量的普通查询
这个场景是指我们的业务中的大部分辅助性的查询,如:取钱的时候先查询一下余额,根据用户的ID查询用户的记录,取得该用户最新的一条取钱记录等 。我们肯定是要天天要用的,而且用的还非常多 。同时呢,我们的写入请求也是非常多的,导致大量的写入、查询操作压向同一数据库,然后,数据库挂了,系统挂了,领导生气了,被开除了,还不起房贷了,露宿街头了,老婆跟别人跑了,......
不敢想,所以要求我们必须分散数据库的压力,一个业界较成熟的方案就是数据库的读写分离,写的时候入主库,读的时候读从库 。这样就把压力分散到不同的数据库了,如果一个读库性能不行,扛不住的话,可以一主多从,横向扩展 。可谓是一剂良药啊!那怎么使用呢?一个一般的流程是这样的:
  1. 服务端把一条业务数据落库
  2. 数据库同步或异步或半同步把该条数据复制到从库
  3. 服务端读数据的时候直接去从库读相应的数据
比较简单吧,一些聪明的、爱思考的、上进的同学可能发现问题了,也包括上面介绍的场景一,就是延迟问题,如:数据还没有到从库,我就马上读,那么是读不到的,会发生问题的 。
对于这个问题,各家公司解决的思路不一样,方法不尽相同 。一个普遍的解决方案是:读不到就读主库,当然这么说也是有前提条件的,但具体的方案这里就不一一展开了,我可能会在接下来的分享中详解各种方案 。
另外,关于数据库的复制模式,还请同学们自行学习,太多了,这里说不清 。该总结一下这种模式的优缺点的了,如下:
  • 优点:减少数据库的压力,理论上提供无限高的读性能,间接提高业务(写)的性能,专用的查询、索引、全文(分词)解决方案 。
  • 缺点:数据延迟,数据一致性的保证 。
六、微服务模式上面的模式看似不错,解决了性能问题,我可以不用露宿街头了、老婆还是我的,哈哈 。但是
软件系统天生的复杂性决定了,除了性能,还有其他诸如高可用、健壮性等大量问题等待我们解决,再加上各个部门间的撕逼、扯皮,更让我们码农雪上加霜,所以
继续吧......
微服务模式可以说是最近的热点,花花绿绿、大大小小、国内国外的公司都在鼓吹,实践这个模式,可是大部分都没有弄清楚为什么要这么做,也并不知道这么做有什么好处、坏处,在这里,我将以我自己的亲身实践说一下我对这个模式的看法,不喜勿喷!随着业务与人员的增加,遇到了如下的问题:
  1. 单机数据库写请求量大量增加,导致数据库压力变大
  2. 数据库一旦挂了,那么整个业务都挂了
  3. 业务代码越来越多,都在一个GIT里,越来越难以维护
  4. 代码腐化严重、臭味越来越浓
  5. 上线越来越频繁,经常是一个小功能的修改,就要整个大项目要重新编译
  6. 部门越来越多,该哪个部门改动大项目中的哪个东西,撕逼的厉害
  7. 其他一些外围系统直接连接数据库,导致一旦数据库结构发生变化,所有的相关系统都要通知,甚至对修改不敏感的系统也要通知
  8. 每个应用服务器需要开通所有的权限、网络、FTP、各种各样的,因为每个服务器部署的应用都是一样的


    推荐阅读