场景一:全文关键词检索
我想这个需求,绝大多数应用都会有,如果使用传统的数据库技术,大部分可能都会使用like这种SQL语句,高级一点可能是先分词,然后通过分词index相关的记录 。SQL语句的性能问题与全表扫描机制导致了非常严重的性能问题,现在基本上很少见到 。
这里的ES是ElasticSearch的缩写,是一种查询引擎,类似的还有Solr等,都差不多的技术,ES较Solr配置简单、使用方便,所以这里选用了它 。另外,ES支持横向扩展,理论上没有性能的瓶颈 。同时,还支持各种插件、自定义分词器等,可扩展性较强 。在这里,使用ES不仅可以替代数据库完成全文检索功能,还可以实现诸如分页、排序、分组、分面等功能 。具体的,请同学们自行学习之 。那怎么使用呢?一个一般的流程是这样的:
- 服务端把一条业务数据落库
- 服务端异步把该条数据发送到ES
- ES把该条记录按照规则、配置放入自己的索引库
- 客户端查询的时候,由服务端把这个请求发送到ES,得到数据后,根据需求拼装、组合数据,返回给客户端
场景二:大量的普通查询
这个场景是指我们的业务中的大部分辅助性的查询,如:取钱的时候先查询一下余额,根据用户的ID查询用户的记录,取得该用户最新的一条取钱记录等 。我们肯定是要天天要用的,而且用的还非常多 。同时呢,我们的写入请求也是非常多的,导致大量的写入、查询操作压向同一数据库,然后,数据库挂了,系统挂了,领导生气了,被开除了,还不起房贷了,露宿街头了,老婆跟别人跑了,......
不敢想,所以要求我们必须分散数据库的压力,一个业界较成熟的方案就是数据库的读写分离,写的时候入主库,读的时候读从库 。这样就把压力分散到不同的数据库了,如果一个读库性能不行,扛不住的话,可以一主多从,横向扩展 。可谓是一剂良药啊!那怎么使用呢?一个一般的流程是这样的:
- 服务端把一条业务数据落库
- 数据库同步或异步或半同步把该条数据复制到从库
- 服务端读数据的时候直接去从库读相应的数据
对于这个问题,各家公司解决的思路不一样,方法不尽相同 。一个普遍的解决方案是:读不到就读主库,当然这么说也是有前提条件的,但具体的方案这里就不一一展开了,我可能会在接下来的分享中详解各种方案 。
另外,关于数据库的复制模式,还请同学们自行学习,太多了,这里说不清 。该总结一下这种模式的优缺点的了,如下:
- 优点:减少数据库的压力,理论上提供无限高的读性能,间接提高业务(写)的性能,专用的查询、索引、全文(分词)解决方案 。
- 缺点:数据延迟,数据一致性的保证 。
软件系统天生的复杂性决定了,除了性能,还有其他诸如高可用、健壮性等大量问题等待我们解决,再加上各个部门间的撕逼、扯皮,更让我们码农雪上加霜,所以
继续吧......
微服务模式可以说是最近的热点,花花绿绿、大大小小、国内国外的公司都在鼓吹,实践这个模式,可是大部分都没有弄清楚为什么要这么做,也并不知道这么做有什么好处、坏处,在这里,我将以我自己的亲身实践说一下我对这个模式的看法,不喜勿喷!随着业务与人员的增加,遇到了如下的问题:
- 单机数据库写请求量大量增加,导致数据库压力变大
- 数据库一旦挂了,那么整个业务都挂了
- 业务代码越来越多,都在一个GIT里,越来越难以维护
- 代码腐化严重、臭味越来越浓
- 上线越来越频繁,经常是一个小功能的修改,就要整个大项目要重新编译
- 部门越来越多,该哪个部门改动大项目中的哪个东西,撕逼的厉害
- 其他一些外围系统直接连接数据库,导致一旦数据库结构发生变化,所有的相关系统都要通知,甚至对修改不敏感的系统也要通知
- 每个应用服务器需要开通所有的权限、网络、FTP、各种各样的,因为每个服务器部署的应用都是一样的
推荐阅读
- 看都不懂的三层架构,到底要怎么理解?
- Nginx 为什么是高效服务器,架构设计是怎样的?
- PostgreSQL的几种分布式架构对比
- 解密微博红包:架构、防刷、监控和资源调度
- 排毒食物 八种排毒食物帮你清洁身体
- 给你百万年薪,让你担任公司的架构师,你知道该做哪些事吗?
- IT架构师的职责及架构思维
- 分布式系统之Redis主从架构
- 阿里P9架构师分享:通俗易懂Redis原理,都是你没看过的
- Linux系统架构-----Apache与Nginx动静分离