主奴隶暴露技术债务

时间:2017-11-19 06:14:49

标签: ruby-on-rails postgresql

使用rails和postgresql。

我编写了我的应用程序而没有考虑使用主从配置。

现在,我已经在应用程序中设置了主奴,现在我遇到了一些技术债务。我的应用程序中的相同进程写入数据库,然后立即从数据库中读取。读取数据库上没有进行读取,但数据不存在。之前,这不是有效的,但它没有引起任何问题,因为两个dbs是相同的。现在,这在我脸上爆炸了。

对我来说问题是很难找到存在此问题的代码中的所有位置。有人可以向我建议一种技术,让我的测试以这样的方式运行,其中读取和写入使用不更新的dbs,以便我可以找出问题所在吗?

其他解决方案也将受到欢迎!

2 个答案:

答案 0 :(得分:2)

我强烈建议您重新考虑主/从配置或主/从是否适合您的应用程序。

构建一个假设写入持久存储的数据的系统可以立即回读,这不是“技术债务”。这是正常和正确的。虽然你可以合理地避免这种模式

write A, ..., look up A.key

使用各种简单的缓存方案,尝试编写例如

write A, ..., complex query that *might* fetch A 

要求您保留A的副本,并确定它是否在单独的代码中满足查询的WHERE子句,只是因为您不能依赖查询结果。除非你的系统非常小而且简单,否则尝试在系统范围内执行此操作将产生一个超级复杂,脆弱,昂贵且难看的代码库。我强烈建议你不要尝试。

主/从持久存储组织的通常目的是离线 读取与写入时间无关的流量 。例如,如果您的系统挖掘数据以生成用户可访问的摘要,则您将使度量计算脱机并使其挖掘从属。这可以防止挖掘查询从用户请求处理中提取资源。写入主机和复制到从机之间的小延迟没有问题。

如果你的应用程序正在挣扎,因为持久存储上的负载过多,你可能需要分区数据(有时称为分片),而不是主/从。分区可能会使您遇到另一种类型的问题:没有跨分区事务。但这通常比你正在尝试的更容易。

答案 1 :(得分:0)

在研究了这个区域之后,我同意Gene,主从属应该只用于在读取之前写入很长时间的读取。

我的原始概念是,它更好地利用函数式编程风格,其中该过程保留参数中的所有信息,然后不依赖于数据库。这种方法的缺点是人类思维在功能编程方面很难,而在大型计算机程序中,不要坚持这种额外的复杂性是有意义的。

如果你想编写一个功能性方法或过程,那么这个方法或过程非常有效,但是代码中不应该有任何内容。