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

Creating a new queue for every topic created by the user in the app

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

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

现在我对第三个功能的设计感到困惑。假设用户创建了一个 一个主题说 "Halloween" & 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>

Say a user creates a a topic say "Halloween" & n users subscribe to it [...] This too is a pubsub pattern.

虽然这是 "publishing" 的内容,但其他人 "subscribing" 的内容,这不是 pub-sub 的模式。

pub-sub 模式明确地与 "toss it over the fence, who cares who is listening, if anyone" 相关。 pub-sub 模式只是典型事件的一个奇特术语。这相当于有人说 "Hey! [thing] happened!" 并且其他人以某种方式回应,如果他们想回应的话。如果没有特定的人在那里听到事情发生,那就太糟糕了。他们没有注意到正在发生的事情。就像和朋友出去一样。如果您的一位朋友不在,那么他们以后就不会到达 "be there",当他们决定到达时。他们已经错过了机会。

在您的情况下,您描述的是报纸或印刷杂志。正在发布内容以供其他人使用。订阅者希望文章和报告在将来的某个时间交付给他们。如果他们没有收到杂志或报纸承诺的信息,他们会很沮丧。当事件发生时,他们不必亲自 'be there'。他们在事情发生后得到报告,并保证(在一定程度上)收到报告。

I believe for every individual topic a new queue should be created.

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

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

So how do I dynamically create a queue for every topic created by the user in the application?

简短的回答是:不要。

Or there is some other way to deal with this?

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

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

所有这些都是按照我写的内容进行的: