业务中使用了mysql和ElasticSearch。Mysql作为主仓库,ES作为索引,实际上包含了接近全集的数据。

问题:

Mysql和Es未做事务,出现了并非场景下:

A线程从MySql读,写到ES

B线程从mysql、ES删除

结果是最终ES中出现了A线程写入的数据,出现了数据不一致的问题。

解决方案:

1。 对数据加锁,但是此场景为分布式场景,需要使用redis锁,需要考虑性能开销和公平队列问题。锁的粒度要从写线程的读开始。

2。最终一致性:发生改变时,通过消息队列发送此次改变,消费时验证数据是否一直,不一致则修改到一致,消费成功。如果消费时再发送改变,在下次消息消费中再次验证。

3。解析mysql binlog,直接同步到es,可以在中间使用消息队列削峰。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐