我正在试图弄清楚如何使用ServiceStack MQ抽象实现pub / sub
假设我有一个发布商应用程序发布一个Hello请求,该请求将包含n个订阅者(不同的应用程序)
// Publisher
namespace Publisher
{
public class RabbitPublisherAppHost : AppHostHttpListenerBase
{
public RabbitPublisherAppHost() : base("Rabbit Publisher Server", typeof(MainClass).Assembly) { }
public override void Configure(Container container)
{
Routes
.Add<Publish>("/publish/{Text}");
container.Register<IMessageService>(c => new RabbitMqServer());
var mqServer = container.Resolve<IMessageService>();
mqServer.Start();
}
}
}
namespace Publisher
{
public class PublishService : Service
{
public IMessageService MessageService { get; set; }
public void Any(Publish request)
{
PublishMessage(new Hello{Id=request.Text});
}
}
}
比我创建第一个订阅者
// Sub1
public class RabbitSubscriberAppHost : AppHostHttpListenerBase
{
public RabbitSubscriberAppHost() : base("Rabbit Subscriber 1", typeof(MainClass).Assembly) { }
public override void Configure(Container container)
{
container.Register<RabbitMqServer>(c => new RabbitMqServer());
var mqServer = container.Resolve<RabbitMqServer>();
mqServer.RegisterHandler<Hello>(ServiceController.ExecuteMessage, noOfThreads: 3);
mqServer.Start();
}
}
namespace Subscriber1
{
public class HelloService : Service
{
public object Any(Hello req)
{
//..
}
}
}
现在,如果我创建一个类似于第二个订阅者的应用程序,则2个订阅者共享同一个队列,因此不会发布pub / sub,而是发生竞争条件。 换句话说,为每个订户实施注册需要做些什么?我希望所有订阅者都能收到发布的Hello请求,而不仅仅是竞争条件中的其中一个。
答案 0 :(得分:2)
ServiceStack的Messaging API遵循服务请求/回复模式(即基本上使用MQ而不是HTTP传输),并且不支持Pub / Sub本身。
对于RabbitMQ Pub / Sub,您必须在IMessaging
API抽象之外实现它,例如从Service实现中将其发布到Rabbit MQ主题。
相关ServiceStack包含Pub/Sub library using Redis。另外,根据您的使用情况,您可以使用通知multiple subscribers with Server Events。