异步提交数据库,缩短请求的响应时间。

来源:互联网 发布:户外地坪漆 知乎 编辑:程序博客网 时间:2024/06/05 11:39

我想众多项目的瓶颈应该是数据库的瓶颈。从数据库角度讲,SQL语句的优化、数据库配置优化、读写分离等此类的技巧估计并不新鲜,我只从架构角度上来给大家分享一些经验。

在如今众多高并发的项目中,缓存是不可缺少的部分。众所周知,缓存可以有效的缓解数据库的压力,所以就有了缓存数据库的概念。据我了解,目前为止市面上高效的缓存数据库软件都是收费的,例如电信的数据库就是类似于缓存数据库这种。

如何构建自己的缓存数据库?

这里有一个核心的问题就是异步提交。我们拿目前为止最流行的组合php+memcache+mysql来说,通常写的操作都是php来接收请求,然后用php来执行sql语句,向数据库写入数据,完成之后数据库向php反馈,php向客户端返回结果,当写入量很大的时候数据库的IO就会成为整个过程的瓶颈。再此我们引入一个概念“update server”,这个模块的作用就是接受一个请求,然后向数据库写入数据。由此,以上的过程就可以变为,php接收请求,然后php异步通知update server,然后php向客户端返回结果,此时update server接收到请求之后再向数据库来写入数据。这样就会大大减轻php端处理请求的时间。

到这里,我们可能又遇到一个问题,如果updateserver写入mysql时间过长,而此时php又要执行查询操作,最后就会出现脏读的问题。这时缓存服务器就可以轻松解决这个问题,首先我们把数据先写入memcache,然后再去通知update server来提交到数据库,而php执行查询的之后会先去读memcache里面的数据,如果没有,再去数据库查询,这样就解决了脏读的问题。

总结以上几点,我们得出一个部署方案,php直接读写memcache,updateserver负责向mysql写入数据。关于update server上运行什么脚本,这个可以随意,php或者c++等都可以,当然c++要好一些。这个方案虽然增加了服务器内存的成本,但是大大缩短了了请求的响应时间,提生了用户的体验。