【问题标题】:RabbitMQ queue messages before writing to MongoDbRabbitMQ 在写入 MongoDb 之前将消息排队
【发布时间】:2015-06-17 00:28:52
【问题描述】:

应用程序正在将日志从许多机器发送到 Amazon Cloud 并将它们存储在某个数据库中。

> Lets assume: one machine log size: 1kB every 10 seconds, num of machines from
1000 to 5000

我的第一种方法是在rabbitmq中对日志进行排队,然后rabbitmq消费者将它们存储在sql数据库中。

  1. 当消费者只做一些基本的存储操作时,我真的需要rabbitmq吗?

第二种方法是在rabbitmq中对日志进行排队,但将它们存储在mongodb中

  1. 在写入 mongodb 之前对消息进行排队是否有意义?

【问题讨论】:

    标签: mongodb rabbitmq message-queue messaging


    【解决方案1】:

    由于您已经拥有多个创建日志的生产者系统,因此您已经拥有了分布式架构。

    将实用程序/横切关注点解耦有很多好处,例如从每个系统进行日志记录,而是使用队列:

    • 通过使用异步方法,您将能够缓冲 Rabbit 中大量消息的峰值,而不会影响生产者系统的吞吐量。此外,集中式日志写入系统可能能够批量插入日志 - 批量日志消息写入将需要更少的数据库连接,并且可以优化 IO,超过大量服务器每个直接写入少量日志可能实现的效果。
    • 它集中了日志写入的关注。这样,您无需维护代码以在每个生产者上写入日志,例如如果日志格式或日志存储发生变化(您似乎已经怀疑是否将日志存储在 NoSql 中,如 Mongo 或 Sql)。如果生产者机器使用不同的技术堆栈(例如 Java、Node、.Net)或不同版本的 JVM 等,这将特别有用。(但您确实需要从每个系统写入队列)
    • 它将生产系统的可用性与日志服务分离(例如,如果将日志数据写入 MongoDb 的服务关闭,日志可以在 Rabbit 中排队,直到系统再次可用)。但是,请记住在原始服务器上标记消息创建时间。
    • 它可以释放生产者系统上的 IO 和 CPU 资源。
    • Rabbit 可以构成总线架构的基础。这将允许您扩展日志消息的消费者数量,例如用于冗余,或例如实施指标,完全不影响现有实施。

    【讨论】:

    • 也就是说,许多记录器允许在生产者系统中使用多个sinksLogging to the file system 除了或之前将日志发送到集中式数据库是一个好主意,以防在通过网络发送日志数据时出现问题 - 即像航空业中的黑匣子,如果文件系统在严重的硬件故障等情况下幸存下来,您仍然有一些数据可以帮助进行验尸。
    【解决方案2】:

    正如 StuartLC 所说,您需要缓冲并且需要 decouples the availability of the producing system from the logging service

    这是针对 RabbitMQ 的缺点:

    • RabbitMQ 将成为另一个难以管理的故障点。如果您的日志很重要和/或具有高吞吐量,您将不得不创建一个 RabbitMQ 集群。
    • 您将不得不管理本地缓冲,因为 RabbitMQ 可能不可用或者因为您的生产者在 flow control 下。
    • RabbitMQ 进行缓冲,但健康的 RabbitMQ 是空的。

    您没有定义您在“日志”下放置的内容。正如您所说的1kB every 10 seconds,它似乎是指标。如果我错了,请纠正我。

    关于日志处理,我倾向于使用专用于日志处理的堆栈进行本地缓冲:syslog、flumelogstash... 由具有高吞吐量的数据存储支持。 MongoDB 应该满足需要,我对 RDBMS 有点怀疑。

    您可以使用本地 RabbitMQ 和 federated queues 实现本地缓冲。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 2013-07-15
      • 2013-08-09
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多