我们有一个Windows服务,该服务托管 WCF接口 (ServiceHost)。此服务提供一种方法AddProduct。现在,如果没有错误或其他不可预见的事情发生,则应该通过 RabbitMq (Pub / Sub)传递一条消息,告知已添加新产品。然后其他服务应使用此消息并自行处理。
我在 RabbitMq 世界中还很陌生,所以问题是,鉴于此功能应该在同一服务中运行,最好的方法是什么?
是否有任何框架? RabbitMq 是否适合此操作,还是建议使用其他Message Broker?
答案 0 :(得分:1)
RabbitMQ有一个引人入胜的.net包装器,称为EasyNetQ,适用于服务之间的通知和其他通信,请参阅Jeffrey Richter视频-1,2,3 。通过消息队列进行通信可以使服务保持独立,并且彼此之间不了解情况。为此,请参见带有EasyNetQ的quickstart和publish \ subscribe模式。它应该适合您上面的任务。这是一个如何通过简单的类型化的发布-订阅方法来通知有关新项目的服务的示例:
// somewhere in your WCF service
if (isProductAddedSuccessfully)
{
using (var bus = RabbitHutch.CreateBus("host=your-rabbitmq-node"))
{
bus.Publish(new NewProductMessage
{
Id = product.Id,
Amount = 1,
Added = DateTime.Now
});
}
}
以及您的一些服务:
public class Service : IDisposable
{
private IBus _bus;
public void Initialize()
{
_bus = RabbitHutch.CreateBus("host=your-rabbitmq-node");
_bus.Subscribe<NewProductMessage>("test", HandleNewProduct);
}
void HandleNewProduct(NewProductMessage newProduct)
{
SendUserNotifiaction(newProduct);
ProcessProductOrder(newProduct);
}
// Some service logic here...
// SendUserNotifiaction
// ProcessProductOrder
public void Dispose()
{
_bus?.Dispose();
}
}
您看到,所有订阅了NewProductMessage
类型消息的服务在WCF服务中发布后都将收到相同的消息。相应的命名队列将自动出现在RabbitMq中。注意,RabbitMQ上的EasyNetQ支持还发送\接收和请求\响应通信模式,这在服务体系结构中可能很有用。