MySQL 配置了Master-Slave后, 高并发下同步数据会需要一定时间,这个时间可能是1s, 2s, 所以添加的数据不能马上在slave 上查询的到. 在此背景下要把用户发的评论实时的列出来,改怎么实现?
我的思路:
评论添加到数据库之后,让文章ID为做key, 评论数据作为value 已经数据的形式序列化后保存在缓存中。缓存里面的是一个队列,队列大小可配置。
在列出评论之前,获取缓存里面评论数据,取出评论ID, 然后查询slave 数据库 加上条件 评论ID not in (?)
因为是分页查询,把查询结果merge后 减去多余的评论返回给客户端
这个是基本思路。
首先主从延迟1-2s,这个可优化的, 也有成熟的方案, 延迟实际应该是毫秒级别的。
其次我有一个疑问, 不知道你们文章的评论量有多少? 如果高并发情况下, 评论量势必会很大, 是否进行了分库分表操作, 目前我的理解你们评论表应该有要对文章id和用户名分别建索引, 这种情形下进行分库分表就比较麻烦了。 当然这个疑问和楼主说的问题就不相关了。 针对评论这种场景, 可以考虑使用mysql + ElasticSearch 的方式存放, mysql表只对点评ID建唯一索引, 所有的查询都走ES(ES存放什么根据业务需要, 比如楼主这种业务, 可以存放文章Id, 用户名, 点评ID), 反查出点评ID然后从mysql中查询对应的点评内容。 使用这种架构mysql可按照点评ID分库分表, ElasticSearch自身支持水平扩容。
你的方法我感觉有以下问题:
insert 成功后你要想马上取得评论主键 id,用 SELECT LAST_INSERT_ID() 查询的是从库,此时可能还没同步过来
按你的场景,有这种高并发的场景,数据量必然不小, not in 无法走索引,会有性能问题
个人感觉有些简单的问题复杂化了。如果对评论的实时性要求比较高,我的建议是:
优化主从同步,同步延时无非要么是网络延迟,要么是从库更新单线程跟不上主库更新的多线程,可以用淘宝开发的 mysql 主从同步的开源解决方案 transfer
对业务进行垂直拆分,评论专门做成一个系统,独立的数据库,里面只放评论表
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。