将数据库与消息队列解耦的最佳实践

Posted

技术标签:

【中文标题】将数据库与消息队列解耦的最佳实践【英文标题】:Best practice for decoupling a database from a message queue 【发布时间】:2011-10-18 04:41:08 【问题描述】:

我正在构建一个允许用户上传图像的 Web 应用程序。图片上传的时候需要resize到一个或者多个size,每个size都需要发送到Amazon s3进行存储。每种尺寸图像的元数据和 url 存储在 Web 服务器上的单个数据库记录中。我正在使用消息队列来异步执行调整大小和上传(因为每个请求可能会出现大图像和多次调整大小)。调整大小/上传任务完成后,需要使用 url 更新数据库记录。

我的问题是执行任务的工作人员将无权访问数据库。我正在考虑在任务完成后使用适当的信息来更新数据库记录,然后从工作人员返回到 Web 应用程序的 http 回调。还有其他选择或理由我应该以另一种方式这样做吗?

我在 web 后端使用 python/pylons,数据库使用 mysql,消息传递使用 celery/amqp。

谢谢!

【问题讨论】:

"...执行任务的工作人员将无权访问数据库。"有什么特别的原因吗? 在大多数情况下,工作人员将在不同的机器上运行,并且不能直接访问数据库(出于安全原因)。 【参考方案1】:

看来您的目标不是将数据库与 MQ 分离,而是与工作人员分离。因此,您可以创建另一个接收完成通知的队列,并让另一个工作人员接收通知并适当地更新数据库。

【讨论】:

正确,标题可能有点误导。我曾考虑将其拆分为两个单独的任务,但没有考虑过另一个队列。这实际上很有意义,因为我可以将需要数据库访问权限的任务路由到特权机器。谢谢。

以上是关于将数据库与消息队列解耦的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

微服务架构的两大解耦利器与最佳实践

微服务架构的两大解耦利器与最佳实践

JMS 队列上多线程消息处理的最佳实践

基于消息队列 RocketMQ 的大型分布式应用上云最佳实践

基于消息队列 RocketMQ 的大型分布式应用上云最佳实践

消息队列实现复制的最佳实践