在写入 MongoDb 之前,RabbitMQ 队列消息

RabbitMQ queue messages before writing to MongoDb

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

> 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 之前对消息进行排队是否有意义?

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

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

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

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

这是针对 RabbitMQ 的缺点:

  • RabbitMQ 将是另一个需要管理的故障点。如果你的日志很重要 and/or 具有高吞吐量,你将不得不建立一个 RabbitMQ 集群。
  • 您将不得不管理本地缓冲,因为 RabbitMQ 可能不可用或者因为您的生产者在 flow control.
  • RabbitMQ 会缓冲,但健康的 RabbitMQ 是空的。

您没有定义放在 "log" 下的内容。正如您所说 1kB every 10 seconds,它似乎是指标。如有错误请指正

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

无论您可以使用本地 RabbitMQ 和 federated queues.

实现本地缓冲