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

Java 为用户在应用程序中创建的每个主题创建新队列,java,spring,rabbitmq,spring-amqp,Java,Spring,Rabbitmq,Spring Amqp,我的应用程序使用Spring+RabbitMQ。它已经设计了两个功能,在主页上显示用户及其朋友的帖子,并为发生的任何事件提供通知功能 对于这两个特性,我在绑定到交换机的rabbitmq配置中预定义了队列。底层模式是发布-订阅 现在我对第三个功能的设计感到困惑。假设用户创建了一个 主题为“万圣节”&n用户订阅。同样,n个用户将创建他们的n个主题,其他用户将订阅该主题以进行更新。这也是一个pubsub模式 我相信每个主题都应该创建一个新的队列。那么,如何为应用程序中用户创建的每个主题动态创建一个队列

我的应用程序使用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>

假设一个用户创建了一个主题,比如说“万圣节”&n用户订阅它[…]这也是一个pubsub模式

虽然这是“发布”内容,而其他人“订阅”该内容,但这不是发布子模式

酒吧-酒吧模式明确地说是“把它扔到篱笆上,谁在乎谁在听,如果有人的话”。酒吧-酒吧模式只是对典型事件的一个花哨术语。这相当于有人说“嘿![事情]发生了!”而其他人则以某种方式回应,如果他们想回应的话。如果某个特定的人没有听到事情发生了,那就太糟糕了。他们没有得到发生那件事的通知。就像和朋友出去一样。如果你的一个朋友不在那里,那么当他们决定去的时候,他们就不能去“那里”。他们已经错过了机会

在你的情况下,你描述的是一份报纸或印刷杂志。正在发布内容供其他人使用。订阅者希望文章和报告在将来的某个时候交付给他们。如果他们没有收到杂志或报纸向他们承诺的信息,他们会感到不安。事件发生时,他们不必亲自“在场”。事情发生后,他们会收到一份报告,并保证(在一定程度上)收到报告

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

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

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

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

简单的回答是:不要

还是有其他方法来解决这个问题

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

您需要的是数据库设计,您可以跟踪谁订阅了什么内容,等等

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


因此,如果我们只在数据库中保存所有内容,Derick不会给数据库增加额外的负载,而不是轮询队列,应用程序将轮询数据库以获取添加的任何新数据。我知道队列不是数据库。我将数据持久保存在数据库中如何?对于最新的数据,我还有一个公共或集中的队列,如果有任何新的帖子,它肯定会推送到用户,而不需要轮询数据库。我们总是可以从队列中清除旧数据。