【问题标题】:Message Queue or DataBase insert and select消息队列或数据库插入和选择
【发布时间】:2011-08-23 21:58:10
【问题描述】:

我正在设计一个应用程序,我有两个想法(如下)。我有一个收集数据 appx 的过程。 30 KB,此数据将每 5 分钟收集一次,需要在客户端更新(网页端——任何给定时间 100 个用户)。收集的信息不需要存储以供将来使用。

选项:

  1. 我可以每 5 分钟获取数据并插入数据库。然后客户端将调用数据库并检索数据并更新 UI。

  2. 收集数据并将其放入主题或队列。现在多个客户端(消费者)可以去Queue获取数据了。

我正在寻找选项 2 作为更好的解决方案,因为它更快(没有数据库调用)并且没有存储冗余。

谁能建议哪个是理想的解决方案?为什么?

【问题讨论】:

    标签: database real-time message-queue


    【解决方案1】:

    我真的不明白其中的区别。数据必须暂时存储在某个地方,直到下一次更新,对吧。

    但所有用户都可以看到它,而不仅仅是第一个到达那里的人,对吧?因此,从我对您系统的解释来看,队列并不是真正合适的数据结构。

    数据是写入数据库等持久性对象还是写入 Web 服务器或应用程序服务器等非持久性对象可能与此相关。

    此外,您已将其标记为实时,但我看不出网络客户端如何在没有某种推送/长拉或其他方式的情况下实时获取更新。

    【讨论】:

      【解决方案2】:

      在我看来,您需要使用 queue 和发布者/订阅者模式。 这是一篇关于RabitMQ and Publish/Subscribe pattern的文章。

      我可以每 5 分钟获取数据并插入数据库。然后客户端将调用数据库并检索数据并更新 UI。

      您可以将应用程序编程为面向事件。例如,引发域事件并为您的订阅者发布您的消息。

      当您使用队列时,订阅者会将发送给他的消息从队列中取出,并且遵守顺序 (FIFO)。此外,将有交付保证,这与可以删除记录但并非每个“订阅者”都收到消息的数据库不同。

      使用数据库来实现这一点的缺陷是:

      • 创建索引使查询更快,但插入更慢;
      • 必须控制每个订阅者的交付保证;
      • 您需要 TTL(生存时间)策略来清除记录(考虑到交付保证);

      【讨论】:

        猜你喜欢
        • 2013-03-22
        • 1970-01-01
        • 2011-09-09
        • 1970-01-01
        • 2011-02-20
        • 2020-03-07
        • 2011-02-11
        • 2020-12-01
        • 2013-12-25
        相关资源
        最近更新 更多