kidlj

kidlj

V2EX 第 48786 号会员,加入于 2013-11-05 20:28:04 +08:00
今日活跃度排名 16623
根据 kidlj 的设置,主题列表被隐藏
二手交易 相关的信息,包括已关闭的交易,不会被隐藏
kidlj 最近回复了
不会。下次再提 PR 的时候接着用。
Zabbix
Apple Music: 正在同步云端资料库 — forever
23 天前
回复了 wloverine 创建的主题 macOS mac 有好用的终端管理工具吗
/etc/hosts + ~/.ssh/config
41 天前
回复了 mitu9527 创建的主题 程序员 数据库与缓存的一致性问题的两个疑问
如果你指的“灾难性”是指 Kafka 挂掉以后缓存过期的实效性的话,可以适当缩短缓存的存活时间,让它自动快速过期。
41 天前
回复了 mitu9527 创建的主题 程序员 数据库与缓存的一致性问题的两个疑问
@mitu9527 多立即删除这一次就像是心理安慰,没大用处。Kafka 集群挂了,未消费并 commit 的消息是持久化的,集群恢复以后消息还在,有什么好怕的。
41 天前
回复了 mitu9527 创建的主题 程序员 数据库与缓存的一致性问题的两个疑问
@mitu9527 不需要立即删除,可以完全避免掉双写的。异步消息几乎是实时的,而且是可重试的,采用 kafka consumer group 还可以多重订阅一个消息。

当然,采用这种方案会带来架构的改变和额外的维护成本。不过我个人的实践来看,这种架构非常灵活,省去了一些传统上需要用分布式事务或者双写带来的复杂性,维护一套 Kafka + connector 还是值得的。
41 天前
回复了 mitu9527 创建的主题 程序员 数据库与缓存的一致性问题的两个疑问
Friends don't let friends do dual writes.

更新完数据库紧接着更新缓存或者写入消息队列,这就是双写或者多写,总会有第一步成功了下一步失败的概率(比如网络抖动等原因),这时候就会造成数据不一致。

我个人的项目实践了一种事件驱动的异步架构,也就是 CDC ( change data capture )架构,选型上使用的是 Debezium + Kafka connector ,当然 Java 生态的也可以用 Canal 替换 Debezium 。简单来说 Debezium 的工作就是监听数据库的写入变更( pg 的 wal log 或 mysql 的 bin log ),为每条变更记录生成一条 Kafka message (包含变更记录的主键 id 等其他字段信息),通过 Kafka connector 自动写入到一个数据库表对应的 Kafka Topic 。采用这种架构处理缓存过期就很简单了。业务端只要更新数据库就可以,(避免了双写的问题),更新缓存的逻辑起一个线程或 goroutine 监听这个表对应的 Kafka topic ,拿到消息以后解析出主键 id ,然后 purge 掉对应记录的缓存。如果消费了这条消息以后 purge 缓存失败怎么办?有这种可能的。Kafka 的 message 有 commit 机制,purge 失败可以一直重试,当成功了以后再 commit 消息。虽然这种架构是异步的,不过得益于 Kafka 的良好吞吐性能,几乎可以做到 real-time 的使用体验。
44 天前
回复了 ulyc 创建的主题 分享发现 分享一个代码托管平台, sourcehut
真棒!感谢分享。
关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2644 人在线   最高记录 5497   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 18ms · UTC 14:57 · PVG 22:57 · LAX 07:57 · JFK 10:57
Developed with CodeLauncher
♥ Do have faith in what you're doing.