我的应用程序使用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>
答案 0 :(得分:2)
假设用户创建了一个主题,说&#34;万圣节&#34; &安培; n个用户订阅它[...]这也是一个pubsub模式。
虽然这是&#34;发布&#34;内容,与其他人&#34;订阅&#34;对于那个内容,这不是pub-sub模式。
pub-sub模式显然是关于&#34;扔掉围栏,关心谁在听,如果有人&#34;。 pub-sub模式只是典型事件的一个奇特术语。这相当于有人说&#34;嘿! [事情]发生了!&#34;和其他人以某种方式回应,如果他们想要回应。如果一个特定的人不在那里听到事情的发生,那就太糟糕了。他们没有注意到那件事正在发生。它就像和朋友一起出去玩。如果你的一个朋友不在那里,那么他们就不会去那里了#34;后来,当他们决定。他们已经错过了这个机会。
在您的情况下,您正在描述报纸或印刷杂志。内容正在发布供其他人使用。订阅者期望在将来的某个时间点将文章和报告传递给他们。如果他们没有收到杂志或报纸承诺的信息,他们会感到不安。他们不必在那里&#39;当事件发生时亲自参与。他们在事情发生后得到报告,并保证(在一定程度上)接收报告。我相信每个主题都应该创建一个新队列。
这是一个非常糟糕的主意。您将很快遇到RabbitMQ配置和实例的大小和复杂性的严重性能问题。如果它们被多次使用,您最终会得到成千上万的很少使用的队列。
但是,更糟糕的是,您最终可能会将队列视为数据库。一旦你意识到你无法查询队列,或多次阅读同一条消息,事情就会快速崩溃。那么如何为用户在应用程序中创建的每个主题动态创建队列?
简短的回答是:不要。
还是有其他方法可以解决这个问题?
消息队列是在进程之间推送数据的好方法。为此使用消息服务。
您想要的是数据库设计,您可以跟踪谁订阅了哪些内容等。
所有这些都遵循我写的东西: