我对rabbit不是很熟悉,所以我会用nservicebus(NSB)来回答这个问题。
我的系统有一台服务器和许多两种类型的客户端
好的,首先,NSB 没有客户端和服务器的等价概念。在 NSB 中,所有参与的应用程序都称为端点或服务。一些端点是发布者,一些是订阅者,一些是发送者,一些是接收者。有些是上述的任意组合。
第一种类型的客户端向服务器发送事件。
按照惯例,NSB 中有两种类型的消息,命令和事件。发送命令,发布事件。所以在这种情况下,类型 1 的客户端会向服务器发送命令。在这种情况下,类型 1 客户端将是发送方端点。因此,服务器是接收方端点。
第二种类型从服务器接收有关这些事件的通知
所以在这种情况下,服务器是发布者端点,类型 2 客户端是订阅者端点。服务器将发布一个所有订阅者都会收到的事件。
第一种类型的客户端应该有事件的传入队列(在其上物理运行),以防止服务器断开连接时数据丢失
我假设您的意思是类型 1 客户端需要接收它需要从某个地方发送到服务器的数据。
嗯,在 NSB 中,每个端点都有一个队列,称为输入队列。这是端点接收消息的方式。
在 NSB 中,队列传输是抽象的,但开箱即用的是 MSMQ(NSB 也支持 Rabbit 作为队列传输)。
这提供了store-and-forward 消息传递模式,可保证可靠性。这意味着如果服务器不可用,排队传输将等到它再次可用后再传输消息。
因此,您可以将消息发送到类型 1 客户端输入队列,然后将其转换为命令并发送到服务器。
服务器应该有用于通知的传出队列(物理上
在其上运行)以防止在第二类客户端上丢失数据
断开连接。
类似地,当服务器发布事件时(接收到来自类型 1 客户端的命令),排队传输将保证将事件传递给所有订阅类型 2 客户端。
注意点:这不是基于具有“传出队列”的服务器,而是排队传输将消息传递到所有订阅端点的输入队列。
因此,在您的方法中使用 NServiceBus 可以满足您的所有场景。