0

我正在 rabbitmq 消息和 Django 应用程序之间建立一个日志桥,以将后台任务状态存储在数据库中以供进一步调查/审查,也可以通过 Django 管理界面重新发布任务。我想这没什么花哨的,只是标准的生产者-消费者模式。

  1. Web 应用程序发布到消息队列并将初始任务状态插入数据库
  2. Consumer,它是一个单独的python进程,处理消息并根据任务输出更新任务状态

问题是,数据库中缺少一些任务,因此从未执行。我怀疑这是因为消费者在执行 db commit 之前收到了消息。所以基本上,从 Model.save() 返回并不意味着事务已经结束并且整个通信中断。

有什么办法可以解决这个问题吗?也许我可以使用某种 post_transaction 信号?

先感谢您。

4

2 回答 2

0

这对我来说听起来很脆弱:您有一个 Web 应用程序,它发布到队列,然后将初始状态插入数据库。如果消费者在 Web 应用提交初始状态之前处理了消息会发生什么?

如果 Web 应用程序在数据库被消费者锁定时尝试插入新状态会发生什么?

为了解决这个问题,Web 应用程序应该将初始状态添加到消息中,并且消费者应该是唯一写入数据库的人。

[编辑]而且您可能还会遇到日志记录问题。通过在不修改数据库的情况下将消息放入队列来检查 Web 应用程序和消费者之间的竞争是否在日志中产生了适当的错误。

[EDIT2] 一些想法:

只显示待处理任务的数量怎么样?为此,Web 应用程序可以写入表 1,消费者写入表 2,管理员可以显示差异。

为什么 Web 应用程序看不到消费者在队列中的待处理任务?也许你应该有两个消费者。第一个使用者只是将任务添加到数据库中,提交然后仅使用新行的主键向第二个使用者发送消息。管理员 iface 可以在第二个消费者写入表时读取该表。

最后一个想法:在将消息排入队列之前提交事务。为此,您只需将“提交”发送到数据库。这会感觉很奇怪(我当然不推荐在任何情况下使用它),但在这里,手动提交新行可能是有意义的(即在您返回处理正常事务逻辑的框架之前)。

于 2010-06-14T09:13:34.910 回答
0

Web 应用程序发布到消息队列并将初始任务状态插入数据库

不要这样做。

Web 应用程序发布到队列。完毕。通过模板呈现结果并完成网络交易。

消费者从队列中取出并做事。例如,它可能会附加到数据库的日志以呈现给用户。消费者还可以在执行操作时向数据库发布附加状态。

事实上,许多应用程序有多个队列,具有多个生产/消费者关系。每个进程都可能将内容附加到日志中。

然后演示文稿必须总结日志条目。通常,最后一个是足够的摘要,但有时您需要计数或来自较早条目的信息。

于 2010-06-14T10:16:28.503 回答