让我们假设一种设置,其中移动应用程序通过API与后端进行通信,并将这种通信所产生的数据(例如,基于JSON的事务写操作)写入MongoDB实例并从中读取。
现在,由于我想对存储在mongo中的数据进行大量分析,所以我宁愿:
在我写Mongo的同时将数据直接保存到RDBMS(因此后端服务调用Mongo,成功写入后也调用RDBMS)
以一定的间隔从Mongo中读取数据,并将新数据加载到RDBMS中
恐怕这两个解决方案都需要重新设计理论上没有模式的Mongo,以便与RDBMS中的关系和模式保持一致。真的需要对Mongo中的任何文档结构更改进行更多规划吗?我凭直觉说是,但我会寻找真实的例子。我希望我的观点很清楚。
答案 0 :(得分:1)
也许CQRS模式对您有好处。 参见:https://martinfowler.com/bliki/CQRS.html
您可以将RDBMS用于写入模型。 Mongo-用于读取模型。 在对RDBMS的每次写操作之后,您应该基于Write Model中的数据来更新ReadModel(MongoDB文档)。
答案 1 :(得分:1)
我认为,花最少的精力就可以为MongoDB使用Kafka连接器,以便该连接器将近乎实时地从操作日志中读取MongoDB的更改并将事件写入Kafka。然后,可以从Kafka使用流处理将数据写入关系数据库。
从UI进行双重写入不是一个好的选择,因为它会引入延迟,复杂性和操作开销。如果对一个数据库的写入失败怎么办?
答案 2 :(得分:1)
在这里着手解决方案之前,需要理解一些限制。其中最相关的是延迟。您的数据有多过期?
您几乎可以肯定在这里正在寻找某种后写解决方案,将数据从MongoDB中取出,并将其写入数据仓库。问题是,数据仓库可以落后MongoDB多远?许多基于提取-转换-负载模型(ETL)的解决方案每夜工作,以最大程度地减少对在线系统的影响。有些可以每小时进行一次,但是会对实时系统产生更大的潜在影响。
分析系统可能不需要逐事务支持。如果可能的话,您真的想避免这种情况,因为这给两个系统带来的负担远远超过通常需要的负担。
要回答第二个问题,是的,一旦您开始依赖于模式,它就必须稳定。它不一定必须与您的目标架构同步,但是您的ETL流程必须同时了解两者,并且无论何时任何一个实质性的更改都必须对其进行修改。 “无模式”并不意味着不存在任何模式,仅意味着该模式不是由软件强制实施的,而是由系统上的依赖项强制实施的。