2016-01-06 31 views
1

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

回答

2

假设一个用户创建的话题说:“万圣节” & n个用户订阅了[...]这也是一个发布订阅模式。

虽然这是“发布”内容,但其他人“订阅”该内容,这不是pub-sub模式。

pub-sub模式明确地指出“如果有人在篱笆上抛谁,谁在乎谁在聆听”。 pub-sub模式只是典型事件的一个奇特术语。这就等于有人说“嘿![东西]发生了!”和其他人以某种方式回应,如果他们觉得有回应。如果一个特定的人不在那里听到事情发生,那么太糟糕了。他们没有得到有关事情的通知。这就像是和朋友一起出去玩。如果你的一个朋友不在那里,那么当他们决定时,他们不会“待在那里”。他们已经错过了机会。

在您的情况下,您正在描述报纸或印刷杂志。内容正在发布供其他人使用。订户希望将来的文章和报告将在某个时间点发送给他们。如果他们没有收到他们从杂志或报纸上承诺的信息,他们会很不高兴。当事件发生时,他们不必“亲临现场”。他们在事情发生后得到报告,并且保证(在某种程度上)接收报告。

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

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

不过,更糟糕的是,你可能最终会把队列视为数据库。一旦你意识到你无法查询一个队列,或者多次阅读同一条消息,事情就会很快分崩离析。

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

简短的回答是:不要。

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

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

你想要的是数据库的设计,让您跟踪谁订阅了什么内容,等

这一切沿着我写的东西线以下:

+0

所以,德里克如果我们只保存在数据库中的一切就不是穿上分贝额外负载,而不是轮询队列应用程序将轮询数据库添加任何新的数据。我明白队列不是数据库。如何将数据存入数据库并为最新数据设置一个通用队列或集中队列,如果有新帖子,它肯定会推送给用户,而无需轮询数据库。我们可以随时清除队列中的旧数据。 – underdog

相关问题