【问题标题】:Message queue like RabbitMQ for high volume writes to SQL database?像 RabbitMQ 这样的消息队列用于向 SQL 数据库进行大量写入?
【发布时间】:2016-08-06 11:56:49
【问题描述】:

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

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

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

有人知道这样的实现吗?我没有看到哪些陷阱?如果这个解决方案不好,还有其他选择吗?

问候

【问题讨论】:

    标签: database rabbitmq scalability


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      我最近还了解到,这正是 Microsofft Dynamics CRM 使用消息传递进行数据库更新的方式。

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

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

      【讨论】:

      • 我正在研究实施这样的事情,如果您能提供有关 MS Dynamic CRM 的声明的来源,那将非常有帮助。
      猜你喜欢
      • 2021-11-20
      • 2013-08-09
      • 2017-04-09
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 2021-08-18
      • 2019-03-01
      相关资源
      最近更新 更多