我正在重构一个分析系统,该系统将进行大量计算,并且我需要关于可能的体系结构设计的一些想法来解决我面临的数据一致性问题。分布式分析系统上数据一致性的体系结构设计
当前的架构
我有一个队列为基础的系统,在不同的请求应用程序创建最终由工人使用的消息。
每个“请求应用”分解大的计算成小块将由工人被发送到队列和处理。
当所有作品完成时,原始“请求应用程序”将合并结果。
此外,工人为了处理请求消耗从集中式数据库(SQL Server)的信息(重要:工人不改变数据库的任何数据,只有使用它)。
问题
确定。到现在为止还挺好。当我们包含更新数据库信息的Web服务时,会出现问题。这可能随时发生,但每个来自同一个“请求应用程序”的“大型计算”在数据库中看到相同的数据是至关重要的。
例如:
- 应用甲生成消息A1和A2,将其发送到队列
- 工人W1用于处理拾取消息A1。
- Web服务器更新数据库,从状态S0更改为S1。
- 工人W2拿起消息A2进行处理
我只是不容使用数据库的状态S1有工人W2。为了使整个计算一致,它应该使用先前的S0状态。
思考
一个锁模式防止Web服务器更改数据库,同时还有与它有工人消费的信息。
- 缺点:锁可能在很长一段时间,由于在计算形式不同的 “请求的应用” 可能会重叠(A1,B1,A2,B2,C1,B3,等)。
创建数据库和工作人员(即控制由REQ数据库缓存应用程序服务器)之间新层
- 利弊:添加另一层可能会强加显著开销(也许? ),而且这是很多工作,因为我将不得不重写工人的持久性(很多代码)。
我未决的第二个解决方案,但它不是很有信心。
任何精彩的想法?我设计错了,还是错过了一些东西?
OBS:
- 这是一个巨大的2层遗留系统(在C#),我们试图 演变成与作为最小的努力更具扩展性的解决方案 可能。
- 每个工作人员可能在不同的服务器上运行。
听起来非常像地图/减少我。你为什么要自己写这样的东西?我只是使用Hadoop。 – duffymo
我忘了提及这是一个巨大的2层遗留系统(使用C#),我们试图用尽可能少的努力发展成为一个更具扩展性的解决方案。我相信把一切都变成哈多普将是一项艰巨的任务。 –
比编写,调试和维护Hadoop已经做的更多的工作?我承诺在提交之前。 – duffymo