当您将消息存储在队列中时,是否更多的是元数据信息,以便从队列中提取的人知道如何处理数据?队列中的实际信息并不总是包含所有信息。

假设您有一个像 Twitter 这样的应用程序,每当有人发布消息时,您仍然需要将实际消息文本存储在数据库中,对吗?

该队列将更多地用于向其他订户广播新消息已到达,然后这些服务可以采取进一步的措施。

或者你真的可以将推文文本也存储在队列中吗? (或者您可以,但是那会很愚蠢吗?)

队列消息是否可以有状态字段,订阅者在处理他们的工作流程部分时可以更改哪些字段? ( 或者你会在数据库中这样做吗? )

只是想澄清一下何时使用队列与数据库。

最佳答案

当一个进程想要将数据进行农场处理并将该数据的处理输出到另一个进程(可能在不同的主机上)时,有两种策略:

  • 将您的所有数据填充到队列项中,让接收应用程序担心将其存储在数据库中,以及进行其他任何处理。
  • 更新您的数据库,然后将一条小消息排队发送到另一个进程,以通知它有新数据要处理。

  • 有许多因素可用于决定采用哪种策略:
  • 如果您的数据库是完全 ACID(希望如此)但您的排队系统 (QS) 不是,那么您的数据在 DB 中会更安全。即使队列消息在服务器崩溃中丢失,您也可以运行脚本来处理在数据库中找到的未处理数据。这将是选项 2 的情况。
  • 如果您的数据非常大(比如 1 MB 或更多),那么用它来加重您的 QS 可能是残酷的。如果它是持久的,您最终将写入数据两次,首先写入 QS 的持久化程序,然后写入数据库。这可能会拖累性能并影响您选择选项 1。
  • 如果您的数据库很慢,或者您的应用程序前端甚至无法访问,那么选项 1 就是。
  • 如果您的第二个进程要对数据执行某些操作但不将其存储在数据库中,那么选项 1 可能是可行的方法。

  • 想不出更多了,但我希望你能明白。

    10-06 12:53
    查看更多