分布式分析系统数据一致性的架构设计

2023-12-21

我正在重构一个将进行大量计算的分析系统,并且我需要一些关于可能的架构设计的想法来解决我面临的数据一致性问题。

当前架构

我有一个基于队列的系统,其中不同的请求应用程序创建最终由工作人员使用的消息。

Each "请求应用程序“将大型计算分解为较小的部分,这些部分将被发送到队列并由workers.

当所有的部分都完成后,原始的“请求应用程序”将巩固成果。

另外,workers使用来自中央数据库 (SQL Server) 的信息来处理请求 (重要提示:工作人员不会更改数据库上的任何数据,只会使用它).

Problem

好的。到目前为止,一切都很好。当我们包含更新数据库信息的 Web 服务时,问题就出现了。这种情况随时可能发生,但至关重要的是,源自同一“请求应用程序”的每个“大型计算”都能在数据库中看到相同的数据。

例如:

  1. App A生成消息A1和A2,并将其发送到队列
  2. Worker W1选取消息 A1 进行处理。
  3. Web 服务器更新数据库,从状态更改S0 to S1.
  4. Worker W2获取消息A2进行处理

我只是不能让工作人员 W2 使用数据库的状态 S1。为了使整个计算保持一致,应该使用之前的 S0 状态。

Thoughts

  1. A 锁图案以防止 Web 服务器在有工作人员使用数据库中的信息时更改数据库。

    • cons:锁定可能会持续很长时间,因为不同“请求应用程序”的计算形式可能会重叠(A1、B1、A2、B2、C1、B3 等)。
  2. Create 新层数据库和工作人员之间(通过 req.app 控制数据库缓存的服务器)

    • cons:添加另一层可能会带来巨大的开销(也许?),而且这是一项繁重的工作,因为我必须重写工作人员的持久性(大量代码)。

我正在等待第二种解决方案,但对此不太有信心。

有什么绝妙的想法吗?我是否设计错误,或者遗漏了什么?

OBS:

  • 这是一个巨大的 2 层遗留系统(C# 语言),我们正在尝试 以最少的努力演变成一个更具可扩展性的解决方案 可能的。
  • 每个工作人员可能在不同的服务器上运行。

你可以版本化你的数据库吗?

假设请求应用程序用 ct1 标记计算的开始。现在,此计算生成的每条消息都带有相同的时间戳。

而且每个数据库更新都会用更新时间标记数据库状态。因此,状态 S0 在时间 t0 上,状态 S1 在时间 t1 上,等等。

现在,当工作人员收到消息时,它需要获取更新时间小于或等于消息时间的最大值的数据库状态。在您的示例中,如果 A1 和 A2 都带有 ct1 标记,并且 t1 > ct1,则两个工作人员都将检索 S0 而不是 S1。

这当然意味着您需要在数据库中保存多个版本。如果您知道计算必须在某个时间窗口后完成,您可以在一段时间后清理这些版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式分析系统数据一致性的架构设计 的相关文章

随机推荐

  • 如何检查 Twig/Symfony2 中是否存在翻译项?

    这是我用于打印侧边栏项目的宏 每个title属性正在构建寻找 tip route项目在messages it yml 即使反式物品不存在Twig 总是返回传递给的字符串trans筛选 例如 tip dashboard Dashboard 模
  • 如何访问 app/assets/* 文件中控制器的变量

    我使用 Rails 3 1 In my app controllers locations controller rb我声明一个 location变量 location Location find params id 我有一个文件 app
  • 枚举类

    我偶然发现了以下模式 想知道它是否有一个名字 An enum定义具体类 enum Fruits eApple eBanana 还有一个模板化的struct提供接口 template lt Fruit T gt struct SomeFrui
  • spring security注销导致NullPointerException

    一段时间以来我一直在尝试了解 spring security 除了logout方面 在查看有关 SO 的其他问题时 我觉得他们中的大多数人都面临着与会话未终止相关的问题 另一方面 我面临着完全不同的麻烦 我的安全 XML 文件配置如下
  • 无法在开发模式下使用 Facebook 应用创建 Facebook 广告素材

    我正在开发一个用于创建 Facebook 广告的 FB 应用程序 过去 我能够在开发模式下调试整个 FB 广告创建过程 但突然我开始收到此错误 但我无法找到相关文档 Request https graph facebook com v2 2
  • 布尔实例对象是否为真?

    我一直在业余时间学习 Java 有一个我似乎无法弄清楚的快速问题 此代码返回 true Boolean testBool true Boolean test testBool instanceof Object System out pri
  • WP 管理速度极慢

    我正在处理的站点 这是一个多站点 的 WP 后端需要大约 25 秒才能加载 直到昨天一切都工作正常 前端仍然工作得很好 同一服务器上的所有其他站点都运行得同样好 因此这一定是 WP 后端问题 我不记得到底是什么变化导致它如此缓慢 我记得最近
  • Python CSV - 需要对按另一列中的值分组的列中的值进行求和

    我的 csv 中有数据需要解析 看起来像 Date Name Subject SId Mark 2 2 2013 Andy Cole History 216351 98 2 2 2013 Andy Cole Maths 216351 87
  • 在C语言中如何读取scanf直到EOF?

    我有这个 但是一旦它到达假定的 EOF 它就会再次重复循环和 scanf int main void char words 16 while scanf 15s words 1 printf s n words return 0 Try w
  • 在 MVC Web 应用程序上实施 FCM(Firebase 云消息传递)

    我正在开发一个 MVC Web 应用程序 该应用程序将为人们提供一个销售产品的平台 并允许人们搜索查看这些产品 我不知道 Firebase FCM 可以提供哪些功能 所以我的两个问题是 是否可以将 FCM 添加到 MVC 应用程序 以便在事
  • Android应用程序实时录制声音并识别频率

    我需要开发一个应用程序来使用手机麦克风实时记录频率 然后显示它们 以文本形式 我在这里发布我的代码 FFT 和复数类已从http introcs cs princeton edu java 97data FFT java html http
  • 为什么使用archiver.file模块压缩文件时出现“队列关闭错误”

    我正在尝试使用 archiver 在 Node js 中以 zip 形式下载多个文件 这是我的代码 exports downloadAllFiles function req res var archive archiver zip gzi
  • 使用 ADO.NET 时如何最好地显示进度信息?

    我想在执行可能很长的数据库操作时向用户显示详细的进度信息 具体来说 当插入 更新可能约为数百 KB 或 MB 的数据时 目前 我使用内存中的 DataTables 和 DataRows 然后通过 TableAdapter Update 调用
  • Unix 上的文件修改时间(秒)

    在Unix上 有没有命令可以显示文件的修改时间 精确到秒 在 Linux 上 这可以通过 stat c y 轻松完成 它返回类似的内容2009 11 27 11 36 06 000000000 0100 我在 Unix 上没有找到类似的东西
  • 为什么 Perl 在释放大数组时不进行垃圾回收内存?

    我知道 Perl 使用基于引用计数的垃圾收集 当变量超出范围时 引用计数会递减 如果 REFcount 变为 0 则会取消分配内存 但是 当我跟踪如下所示的一个小示例时 我无法发现取消分配的情况 print start sub func m
  • startIntentSenderForResult 已弃用 Android

    代码片段 private fun requestHint val hintRequest HintRequest Builder setPhoneNumberIdentifierSupported true build val creden
  • 从 Google 服务帐户模拟 Azure 服务主体

    我想使用 Google 服务帐户 JWT 令牌获取 Azure 服务主体 SP 的临时凭据 这是从 GKE 工作负载调用 Azure API 所必需的 而无需在 GKE 中存储长期 SP 凭据 这种联合对于 GCP gt Azure 是否可
  • 调用 CLR 存储过程

    简而言之 在哪里可以找到 C VB 客户端示例代码 该代码使用一些 argumnet 如 sqlxml 数据 调用 CLR 存储过程并接收数据读取器或其他形式的结果 另外 如何定期接收通过 SQlContext Pipe Send 方法发送
  • 为什么 Seq.newBuilder 返回 ListBuffer?

    看着 val sb Seq newBuilder Int println sb getClass getName sb 1 sb 2 val s sb result println s getClass getName 输出是 scala
  • 分布式分析系统数据一致性的架构设计

    我正在重构一个将进行大量计算的分析系统 并且我需要一些关于可能的架构设计的想法来解决我面临的数据一致性问题 当前架构 我有一个基于队列的系统 其中不同的请求应用程序创建最终由工作人员使用的消息 Each 请求应用程序 将大型计算分解为较小的