在扭曲的应用程序中保留数据

时间:2014-04-06 16:49:39

标签: twisted

我试图了解如何在Twisted应用程序中保留数据。让我们说我已经决定写一个Twisted服务器:

  1. 接受入站SMTP请求
  2. 将消息发送给第三方系统进行修改
  3. 将修改后的消息中继到目的地
  4. 一个典型的Twisted教程可以让你使用Deferreds和callbacks构建这个应用程序,粗略地说:

    • 工厂处理入站请求
    • 每次收到完整的电子邮件时,都会向远程消息处理器发送一个呼叫,并返回延迟的
    • 如果修改调用中出现任何问题,请添加一个替换原始邮件的错误。
    • 添加回调以将邮件发送给收件人,再次返回延迟。
    • 真实服务器会添加/包含额外的呼叫/错误以重试或通知发件人或诸如此类的东西。同样为了简单起见,假设我们认为这是一个可接受的努力量,只记录错误。

    当然,这会在发生崩溃/重启/其他事件时持续存在NO数据。我得到的解决方案涉及第三方持久性数据存储(经常提到RabbitMQ),并且可能会提出十几个随机方法来实现结果。

    但是,我想有一些方法在Twisted应用程序中效果最好。他们看起来怎么样?它们如何存储(并在发生崩溃时恢复)进程内消息?

1 个答案:

答案 0 :(得分:0)

如果您发现了这个问题,您可能已经知道Twisted是基于事件的。听起来很简单,但最难的是#34;部分答案是让持久性平台在需要时生成我们需要的事件。当然,您可以将数据保存在数据库或消息队列中,但某些平台不会自然地生成事件。例如:

  • ZeroMQ拥有(或至少拥有)no callback新数据。它的持久性也相对较差。

在其他情况下,事件很容易,但可靠性是一个问题:

  • pgSQL可以配置为使用triggers生成事件,但它们是一次性的事情,因此您无法恢复不完整的事件

隧道尽头的灯似乎像RabbitMQ。

  • RabbitMQ可以persist数据库中的消息以防止崩溃
  • 我们可以在两条腿上使用确认(传入SMTP到RabbitMQ和RabbitMQ到传出SMTP)以确保应用程序可靠。重要的是,RabbitMQ支持acknowledgements
  • 最后,一些RabbitMQ客户端提供完全异步支持(例如参见pikatxampqpuka

为了我们的目的,RabbitMQ客户端为我们提供了基于事件的界面。

然而,在更理论的层面上,情况并非必须如此。事实上,尽管有"通知"上面的问题,ZeroMQ有一个event-based client。即使我们的软件基于事件优雅,我们也会遇到不适合的系统。在这些情况下,我们别无选择,只能依靠polling。原则上,如果不在实践中,我们只是在消息提供者中查询消息。当我们耗尽当前队列时(如果没有消息则立即耗尽),我们将来使用callLater命令再次检查。它可能会感觉反模式,但它(无论如何我知道)处理这种特殊情况的正确方法。