使用IPC,Twisted或ZeroMQ的架构方法?

时间:2013-02-07 15:46:58

标签: python architecture ipc twisted zeromq

我正在使用twisted来从互联网连接的传感器获取消息,以便将其存储到数据库。
我想检查这些消息而不会干扰这些过程,因为我需要将每条消息与一些基本值进行比较db,如果有些匹配,我需要触发一个警报,这个想法不会阻止任何进程......

我的想法是创建一个新的流程来检查和提醒,但我需要在第一个流程存储消息之后,它会将消息发送到新流程,以便检查并提醒是否需要。
<登记/> 我需要IPC,我想使用ZeroMQ,但也有扭曲的方法与IPC合作,我想如果我使用ZeroMQ,但也许它会弄巧成拙......

你怎么看待我的做法?也许我完全错了?

欢迎任何建议.. 由于

PD:此进程将在专用服务器上运行,预期负载为6000 msg /小时,每个1Kb

2 个答案:

答案 0 :(得分:3)

所有这些方法都是可能的。我只能抽象地说话,因为我不知道你的申请的精确轮廓。

如果您已经有一个正在运行的应用程序,但它的速度不够快,无法处理您投入的消息数量,那么就找出瓶颈。您持有的两个可能原因是数据库访问或警报触发,因为其中任何一个都可能是同步IO操作。

你如何处理这个问题取决于你的工作量:

  1. 如果您的消息率很高并且不变,那么您需要确保您的数据库可以处理此费率。如果您的数据库无法处理它,那么没有任何非阻塞消息传递将帮助您!按此顺序:
    1. 尝试调整数据库。
    2. 尝试将数据库放在更大的内存上。
    3. 尝试在多台计算机上分片数据库以分配工作负载。 一旦您知道您的数据库可以处理消息速率,您就可以使用其他形式的并行处理其他瓶颈。
  2. 如果您的消息速率是突发性的,那么您可以使用排队来处理突发。按此顺序:
    1. 将负载均衡器放在消息处理器集群的前面。所有这些平衡器应该做的是将传感器消息重新分配到不同的机器以进行检查和警报处理。这种方法的优点是您可能不需要更改现有应用程序,只需在更多计算机上运行它。如果您的负载均衡器不需要等待响应,则最有效,只需转发消息。
    2. 如果您的通信需求更复杂或是双向的,您可以使用消息总线(如ZeroMQ)作为消息处理器,警报发送器和数据库检查器之间的通信层。这个想法是通过总线进行非阻塞通信并使总线上的每个节点只做一件事来增加并行性。然后,您可以根据每个消息处理阶段所需的时间来更改节点类型的比率。 (即,在整个消息处理过程中使队列深度相等。)

答案 1 :(得分:1)

当您收到消息时,请执行以下两项操作:

  • 检查是否应触发警报(并在必要时发送警报,大概是)
  • 将其插入数据库

您不需要消息队列,多个进程,IPC或任何这些东西。例如:

def messageReceived(self, message):
    self.checkForAlerts(message).addCallbacks(self.maybeAlert, log.err)
    self.saveMessageToDatabase(message).addErrback(log.err)