我的系统有一个服务器和两个类型的许多客户端。第一类客户端将事件发送到服务器。第二种类型在这些事件上从服务器接收通知。我目前正在测试RabbitMQ和NServiceBus以构建具有以下要求的消息队列:
[客户类型1 +队列] - > [服务器+队列] - > [客户类型2]
这可以通过指定组件之一(或两者)来实现吗?如果是的话怎么样?
答案 0 :(得分:1)
我对兔子不太熟悉,所以我会用nservicebus(NSB)回答这个问题。
我的系统有一个服务器和两个类型的许多客户端
好的,首先,NSB没有客户端和服务器的等效概念。在NSB中,所有参与的应用程序都称为端点或服务。一些端点是发布者,一些是订阅者,一些是发件人,一些是接收者。有些是以上的任何组合。
第一种类型的客户端将事件发送到服务器。
按照惯例,NSB中有两种类型的消息,即命令和事件。发送命令,发布事件。因此,在这种情况下,类型1客户端将命令发送到服务器。在这种情况下,类型1客户端将是发送方端点。因此,服务器是接收器端点。
第二种类型在这些事件上接收来自服务器的通知
因此,在这种情况下,服务器是发布者端点,类型2客户端是订户端点。服务器将发布一个所有订户都会收到的事件。
第一类客户端应具有事件的传入队列(在其上物理运行)以防止服务器断开连接时数据丢失
我假设您的意思是类型1客户端需要从某个地方接收需要发送到服务器的数据。
好吧,在NSB中,每个端点都有一个队列,称为输入队列。这是端点接收消息的方式。
在NSB中,队列传输是抽象的,但是开箱即用的默认值是MSMQ(NSB也支持Rabbit作为队列传输)。
这提供了store-and-forward消息传递模式,可确保可靠性。这意味着如果服务器不可用,排队传输将等到它再次可用后再发送消息。
因此,您可以将消息发送到类型1客户端输入队列,然后将其转换为命令并发送到服务器。
服务器应具有通知的传出队列(物理上 运行它)以防止第二类客户端上的数据丢失 断开。
类似地,当服务器发布事件时(在从类型1客户端接收到命令时),排队传输将保证将事件传递给所有订阅类型2客户端。
值得注意的是:这不是基于具有“传出队列”的服务器,而是排队传输将消息传递到所有订阅端点的输入队列。
因此,使用NServiceBus作为方法的一部分,可以满足所有场景。