我们有一个托管WCF接口(ServiceHost)的Windows服务。该服务提供例如方法AddProduct。现在,如果没有错误或其他不可预见的事情发生,应该通过RabbitMq(Pub / Sub)传递一条消息,即添加了新产品。然后,其他服务应该使用此消息并为其自己处理它。
我在RabbitMq世界中是一个新手,所以问题是,最好的方法是什么,以便这应该在同一个服务中运行。
这有什么框架吗? RabbitMq适合这个还是建议使用另一个Message Broker?
RabbitMQ有一个名为EasyNetQ的迷人.net包装器,它适用于服务之间的通知和其他通信,请参阅Jeffrey Richter视频 - 1,2,3。通过消息队列进行的通信允许保持服务独立并且彼此不知情。所以去吧,看看带有EasyNetQ的quickstart并发布\ 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支持还发送\ receive和request \响应通信模式,这在服务体系结构中很有用。