像RabbitMQ这样的消息队列用于高容量写入SQL数据库?

时间:2016-04-14 18:41:53

标签: database rabbitmq scalability

该方案需要将大量数据(如跟踪点击或鼠标移动)从Web应用程序写入SQL数据库。数据不需要立即写入,因为对数据的分析是在一些重复的基础上发生的,例如每天或每周。

我想要一些关于解决方案的反馈:

单击和鼠标数据将发布到消息队列。这将队列项存储在内存中,因此它应该比SQL更快更快。然后在其他服务器上,一个作业会在检索下一个队列项并将数据写入SQL时插入。

有谁知道这样的实现?我没有看到什么陷阱?如果这个解决方案不是很好,还有其他选择吗?

此致

2 个答案:

答案 0 :(得分:0)

为了解决一个非常类似的问题,我正在考虑这样做。最后我们决定不采用它,因为我们确实需要非常快速地访问数据。不过我还是喜欢这个主意。

我最近也了解到,这正是微软动态CRM使用消息传递进行数据库更新的方式。

我认为你需要特别注意的事情。

  1. 确保如果您的RabbitMQ实例消失,它不会对您的客户产生任何影响。兔子死了很糟糕,你的客户错误,因为兔子瘫痪会很糟糕。
  2. 如果真的是非常高的音量(无论如何它的可靠性很好)聚类是值得关注的。
  3. 显然要注意你的死信队列是必须的。但是由于某种原因回放失败的消息的能力很棒,理论上至少你的数据最终应该总是到达你的数据库。即使它下降了一段时间。
  4. 确保您可以跟上传入的消息数量。当然,这应该可以通过向给定队列添加更多消费者来解决。这导致......
  5. 消息的幂等性。鉴于您的消息与DB写入直接相关,它们必须是幂等的。

答案 1 :(得分:0)

RabbitMQ用于实时消息交换,而不用于临时缓冲数据。如果您能够在到达队列后立即使用所有数据,那么此解决方案将适合您。否则RabbitMQ将在内存中增长并最终死亡。然后你必须配置它来抛出一些数据(有很多选项来为此选择规则)。

您可以将数据存储在Redis缓存中,您可以像将事件发布到RabbitMQ一样快。然后,您可以从远程服务器收听Redis中的新更改,并填写您使用的任何数据库存储,甚至将其用作数据存储。