为用户在应用程序中创建的每个主题创建新队列

时间:2016-01-06 07:07:20

标签: java spring rabbitmq spring-amqp

我的应用程序使用Spring + RabbitMQ。它已经设计了两个显示用户和功能的功能。他朋友在主页上的帖子&已发生的任何事件的通知功能。

对于这两个功能,我在rabbitmq配置中预定义了绑定到交换机的队列。基础模式是发布订阅。

现在我对第三个功能的设计感到困惑。假设用户创建了一个 一个话题说"万圣节" &安培; n个用户订阅它。同样,n个用户将创建他们的n个主题&其他用户将订阅它以进行更新。这也是一个pubsub模式。

我相信每个主题都应该创建一个新队列。那么如何为用户在应用程序中创建的每个主题动态创建队列?还是有其他方法可以解决这个问题?

以下是该应用的现有队列配置。

<!-- Creates a queue for consumers to retrieve messages -->
<rabbit:queue name="UserPostpublishQueue" durable="true"/>

<!-- queue for sending notifications to users -->
<rabbit:queue name="notificationQueue" durable="true"/>

<!-- Fanout exchange for a pubsub bound to UserPostpublishQueue -->
<fanout-exchange name="broadcastPosts" durable="true" xmlns="http://www.springframework.org/schema/rabbit">
    <bindings>
        <binding queue="UserPostpublishQueue"/>
    </bindings>
</fanout-exchange>

<!-- Direct exchange for a broadcasting notifications -->
<rabbit:direct-exchange name="broadcastNotifications" durable="true" xmlns="http://www.springframework.org/schema/rabbit">
    <bindings>
        <binding queue="notificationQueue" key="notifications"/>
    </bindings>
</rabbit:direct-exchange>

1 个答案:

答案 0 :(得分:2)

  

假设用户创建了一个主题,说&#34;万圣节&#34; &安培; n个用户订阅它[...]这也是一个pubsub模式。

虽然这是&#34;发布&#34;内容,与其他人&#34;订阅&#34;对于那个内容,这不是pub-sub模式。

pub-sub模式显然是关于&#34;扔掉围栏,关心谁在听,如果有人&#34;。 pub-sub模式只是典型事件的一个奇特术语。这相当于有人说&#34;嘿! [事情]发生了!&#34;和其他人以某种方式回应,如果他们想要回应。如果一个特定的人不在那里听到事情的发生,那就太糟糕了。他们没有注意到那件事正在发生。它就像和朋友一起出去玩。如果你的一个朋友不在那里,那么他们就不会去那里了#34;后来,当他们决定。他们已经错过了这个机会。

在您的情况下,您正在描述报纸或印刷杂志。内容正在发布供其他人使用。订阅者期望在将来的某个时间点将文章和报告传递给他们。如果他们没有收到杂志或报纸承诺的信息,他们会感到不安。他们不必在那里&#39;当事件发生时亲自参与。他们在事情发生后得到报告,并保证(在一定程度上)接收报告。

  

我相信每个主题都应该创建一个新队列。

这是一个非常糟糕的主意。您将很快遇到RabbitMQ配置和实例的大小和复杂性的严重性能问题。如果它们被多次使用,您最终会得到成千上万的很少使用的队列。

但是,更糟糕的是,您最终可能会将队列视为数据库。一旦你意识到你无法查询队列,或多次阅读同一条消息,事情就会快速崩溃。

  

那么如何为用户在应用程序中创建的每个主题动态创建队列?

简短的回答是:不要。

  

还是有其他方法可以解决这个问题?

消息队列是在进程之间推送数据的好方法。为此使用消息服务。

您想要的是数据库设计,您可以跟踪谁订阅了哪些内容等。

所有这些都遵循我写的东西: