在.NET Enviornment中托管RabbitMQ消费者

时间:2015-08-17 18:32:51

标签: windows-services rabbitmq

我的问题是主持RabbitMQ消费者的最佳方式是什么?目标是让这些作为独立单元运行,可以根据其用途独立扩展.Windows服务? (每个服务的消费者?),WCF绑定(似乎已弃用)? ServiceStack出价?

理想情况下,我想要的是在RabbitMQ中对Queue进行绑定,以便消费者线程中的消息很快产生并消耗消息(类似于WCF中的msq出价)以下是​​我所知道的。请指教

-

1 个答案:

答案 0 :(得分:0)

我不会说“最佳方式”,因为它是主观的,主要受经验和偏好的影响。您将直接使用RabbitMQ.Client而不是框架来获得最大的灵活性和访问功能,但如果您的需求符合其用例,框架可以提供生产力。

ServiceStack.RabbitMQ

使用ServiceStack's Rabbit MQ支持的一个好处是,您可以重用现有的ServiceStack服务并通过Rabbit MQ使用它们,除了可重用性之外,它还允许您开发和测试您的服务通过HTTP,它可以通过从URL调用服务以及访问Web Inspector和Fiddler等工具来提供更好的内省。

ServiceStack's Rabbit MQ包括高级客户端和服务器库,它们提取低级详细信息以提供允许您publish POCO messages的类型化API:

using (var mqClient = new RabbitMqMessageFactory("localhost"))
{
    mqClient.Publish(new Hello { Name = "World" });
}

以及Configure ServiceStack处理Hello请求DTO的类型化API:

public override void Configure(Container container)
{
    container.Register<IMessageService>(c => new RabbitMqServer());

    var mqServer = container.Resolve<IMessageService>();

    mqServer.RegisterHandler<Hello>(ExecuteMessage);
    mqServer.Start();
}
如果您希望将来切换到使用另一个MQ服务器而不是RabbitMQ,也可以轻松配置ServiceStack high-level MQ Server API以使用不同的MQ服务器。目前,它支持Redis MQ和内存提供程序,并支持SQS in development

可扩展性

MQ服务器是“自然可扩展的”,因为您可以通过启动更多服务器(配置为查看相同的MQ代理)自然地对服务器进行负载平衡,而无需更改现有客户端行为。

Allocating multiple threads for specific operations

默认情况下,ServiceStack使用一个长时间运行的后台线程来处理每种不同消息类型的普通和优先级MQ。您可以通过指定注册时使用的后台线程数来增加特定消息的吞吐量,例如:

mqServer.RegisterHandler<Hello>(ExecuteMessage, noOfThreads:4);

这将启动4个长时间运行的后台线程来处理Hello消息。

限制

ServiceStack的高级ServiceStack.RabbitMq包是opinionated in how it configures and handles每个消息类型的输入,输出,响应和DLQ。 MQ服务专注于使用Request/Reply messaging pattern通过Rabbit MQ代理提供另一个端点来使用ServiceStack服务。这意味着它不提供访问其他RabbitMQ功能的权限,这些功能需要直接使用Rabbit MQ Client库。除了请求/回复模式,我们目前也是evaluating how best to add support for broadcast messages