客户端/服务器上的传入/传出消息队列

时间:2015-07-15 16:02:15

标签: queue rabbitmq nservicebus

我的系统有一个服务器和两个类型的许多客户端。第一类客户端将事件发送到服务器。第二种类型在这些事件上从服务器接收通知。我目前正在测试RabbitMQ和NServiceBus以构建具有以下要求的消息队列:

  1. 第一类客户端应具有事件的传入队列(在其上物理运行),以防止服务器断开连接时数据丢失。
  2. 服务器应具有通知的传出队列(在其上物理运行),以防止第二类客户端断开连接时数据丢失。
  3. [客户类型1 +队列] - > [服务器+队列] - > [客户类型2]

    这可以通过指定组件之一(或两者)来实现吗?如果是的话怎么样?

1 个答案:

答案 0 :(得分:1)

我对兔子不太熟悉,所以我会用nservicebus(NSB)回答这个问题。

  

我的系统有一个服务器和两个类型的许多客户端

好的,首先,NSB没有客户端和服务器的等效概念。在NSB中,所有参与的应用程序都称为端点或服务。一些端点是发布者,一些是订阅者,一些是发件人,一些是接收者。有些是以上的任何组合。

  

第一种类型的客户端将事件发送到服务器。

按照惯例,NSB中有两种类型的消息,即命令和事件。发送命令,发布事件。因此,在这种情况下,类型1客户端将命令发送到服务器。在这种情况下,类型1客户端将是发送方端点。因此,服务器是接收器端点。

  

第二种类型在这些事件上接收来自服务器的通知

因此,在这种情况下,服务器是发布者端点,类型2客户端是订户端点。服务器将发布一个所有订户都会收到的事件。

  

第一类客户端应具有事件的传入队列(在其上物理运行)以防止服务器断开连接时数据丢失

我假设您的意思是类型1客户端需要从某个地方接收需要发送到服务器的数据。

好吧,在NSB中,每个端点都有一个队列,称为输入队列。这是端点接收消息的方式。

在NSB中,队列传输是抽象的,但是开箱即用的默认值是MSMQ(NSB也支持Rabbit作为队列传输)。

这提供了store-and-forward消息传递模式,可确保可靠性。这意味着如果服务器不可用,排队传输将等到它再次可用后再发送消息。

因此,您可以将消息发送到类型1客户端输入队列,然后将其转换为命令并发送到服务器。

  

服务器应具有通知的传出队列(物理上   运行它)以防止第二类客户端上的数据丢失   断开。

类似地,当服务器发布事件时(在从类型1客户端接收到命令时),排队传输将保证将事件传递给所有订阅类型2客户端。

值得注意的是:这不是基于具有“传出队列”的服务器,而是排队传输将消息传递到所有订阅端点的输入队列。

因此,使用NServiceBus作为方法的一部分,可以满足所有场景。