近期,所负责的服务在性能方面遭遇严峻挑战,难以支撑当前业务的 QPS。
为解决这一问题,我们对业务进行了深入分析,情况如下:
- 核心任务数据的查询占据整体查询的 50%,涵盖任务流程、能力调用方式等基础信息。
- 业务具体任务查询量同样占比 50%,其中近 10 天的数据占比高达 95%。
- 业务具体任务的写入占比达 99.9%,剩余部分为业务的调整更新。
设计了最初的方案,大致如下:
- 将核心的任务数据做长时间缓存,并打散更新时间,防止缓存雪崩。
- 将近10天的任务数据做短时间缓存,降低业务查询的压力,将数据库资源尽可能的让给数据库写入。
- 由于是集群部署,所以使用redis作为缓存。
方案是自信满满的提交的,被问的时候人是傻的:redis是要钱的,有没有其他方案。。。这是我想起了,项目组季度目标中一条:降本增效🤡。
所以,怎么在不使用redis的前提下提高服务性能?
最后经过项目参与人员的讨论,决定使用memcache进行优化。具体方案如下:
- 对核心任务数据用memcache进行缓存,并做每秒刷新。降低查询压力的同时,保证任务有较高的时效性,同时留出强制刷新接口用于必要时对每个实例强制刷新。
- 对于数据库的插入,改为批量操作。该优化是基于目前的任务完成所需时间远小于要求的时间,通过批量操作提高数据写入能力。
- 对任务数据进行天级分表,减缓之前因为数据备份导致时导致的主从同步延迟。同时提高表的查询效率。
经过以上优化,数据的读压力降低了45%,性能也达到了预期目标。
总结:之前在处理优化时,基本上没有考虑过成本问题,因为没有收到过来自这方面的压力,更多的时老板对于性能的不满意,而这次却体会到了什么叫综合考虑,也算是有所进步吧~