我不会谈论“最佳方式”,因为它是主观的,主要受经验和偏好的影响。通过直接使用 RabbitMQ.Client 而不是使用框架,您将获得最大的灵活性和对功能的访问权限,但如果您的要求符合其用例,框架可以提供生产力。
ServiceStack.RabbitMQ
使用ServiceStack's Rabbit MQ 支持的一个好处是,您可以重用现有的 ServiceStack 服务并通过 Rabbit MQ 使用它们,除了可重用性优势外,您还可以通过 HTTP 开发和测试您的服务它通过能够从 url 调用服务以及访问 Web Inspector 和 Fiddler 等工具来提供更好的内省。
ServiceStack's Rabbit MQ 包括高级客户端和服务器库,它们抽象了低级细节以提供类型化 API,让您可以publish POCO messages:
using (var mqClient = new RabbitMqMessageFactory("localhost"))
{
mqClient.Publish(new Hello { Name = "World" });
}
以及Configure ServiceStack 的 Typed API 来处理 Hello 请求 DTO:
public override void Configure(Container container)
{
container.Register<IMessageService>(c => new RabbitMqServer());
var mqServer = container.Resolve<IMessageService>();
mqServer.RegisterHandler<Hello>(ExecuteMessage);
mqServer.Start();
}
ServiceStack high-level MQ Server API 也可以轻松配置为使用不同的 MQ 服务器,如果您将来希望切换到使用另一个 MQ 服务器而不是 RabbitMQ。目前它支持 Redis MQ 和内存提供程序,支持 SQS in development。
可扩展性
MQ 服务器是“自然可扩展的”,因为您可以通过启动更多服务器(配置为查看相同的 MQ 代理)自然地负载平衡服务器,而无需更改现有客户端行为。
默认情况下,ServiceStack 使用一个长时间运行的后台线程来处理每种不同消息类型的正常和优先级 MQ。您可以通过指定注册时使用的后台线程数来增加特定消息的吞吐量,例如:
mqServer.RegisterHandler<Hello>(ExecuteMessage, noOfThreads:4);
这将启动 4 个长时间运行的后台线程来处理 Hello 消息。
限制
ServiceStack 的高级ServiceStack.RabbitMq 包是opinionated in how it configures and handles 每个消息类型的In、Out、Response 和DLQ。 MQ 服务专注于提供另一个端点,用于通过 Rabbit MQ 代理使用您的 ServiceStack 服务,使用 Request/Reply messaging pattern。这意味着它不提供访问其他需要直接使用 Rabbit MQ 客户端库的 RabbitMQ 功能。除了请求/回复模式,我们目前也是evaluating how best to add support for broadcast messages。