如何解耦并行ping处理系统

时间:2018-07-25 18:19:41

标签: database-design architecture

我有一个系统,它每秒接收一千个GPS ping,它们存储在RDBMS表中,我们称之为pingsTable。然后从数据库中读取这些ping,并在多个处理器中分别进行处理,以提取最终用户的宝贵信息。 到目前为止,我们的系统在pingsTable本身中维护一列,即named_state,它基本上指定ping是否已通过特定处理器进行处理。例如,处理状态3表示ping是由前3个处理器处理的。每个处理器都配置为读取已处理状态小于其自身状态的ping,并在处理ping后将其状态更新为已处理状态。 问题是,即使这些处理器彼此不依赖,我仍然被迫按定义的顺序处理ping。

我的意图是使这些处理器彼此分离,以便可以并行运行这些处理器。另外,我需要维护每个ping的处理状态,因为在分析这些ping时可能需要查询已处理的ping。

我可以考虑为每个处理器维护一个单独的表,并进行联接以检查是否处理了ping。我正在寻找一种更高效,可扩展的设计。

1 个答案:

答案 0 :(得分:1)

据我了解,您需要并行处理ping。处理必须通过所有独立的处理器(服务)进行。在数据库中维护已完成处理的处理器

最简单的方法是

将ID分配给处理器。 ID应该基于按位运算符(即1,2,4,8,16等)。

  1. 向所有处理器ping

  2. 服务器完成处理带有(处理器ID +任何现有值)的更新DB 在SQL查询中使用按位运算

例如1个ping需要由5个处理器处理

  • 处理器5处理ping更新DB值16处理器2处理ping
  • 更新DB值16 + 2 = 18处理器3处理ping更新DB值
  • 18 + 4 = 22

现在,您要查询处理器4处理了ping。在您的SQL的where子句中,对运算符8使用“按位和”

这样,您不需要单独的表等。没有连接的事情可以使其更快。不利的一面是,如果两个处理器试图更新相同的值,则必须注意数据库更新和行锁定。