繁体   English   中英

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

[英]Architecture approach with IPC, Twisted or ZeroMQ?

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

我的想法是创建一个新的流程来检查和提醒,但我需要在第一个流程存储消息后,它会将消息发送到新流程,以便检查并提醒是否需要。

我需要IPC才能做到这一点,而我正在考虑使用ZeroMQ,但也有扭曲的方法与IPC合作,我想如果我使用ZeroMQ,但也许它会弄巧成拙......

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

欢迎任何建议..谢谢

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

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

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

您如何处理这取决于您的工作量:

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

收到消息后,请执行以下两项操作:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM