Pub/Sub 使用 RabbitMQ
Pub/Sub using RabbitMQ
我正在尝试弄清楚如何使用 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)
{
//..
}
}
}
现在,如果我创建一个类似的应用程序充当第二个订阅者,这两个订阅者将共享同一个队列,因此 pub/sub 不会出现竞争条件。
换句话说,为每个订阅者实现注册需要做什么?我希望所有订阅者都能收到发布的 Hello 请求,而不只是根据竞争条件接收其中的一个。
ServiceStack 的 Messaging API 遵循服务请求/回复模式(即本质上使用 MQ 而不是 HTTP 传输)并且不支持 Pub/Sub 本身。
对于 RabbitMQ Pub/Sub 你必须在 IMessaging
API 抽象之外实现它,例如从您的服务实现中将其发布到 Rabbit MQ 主题。
相关的 ServiceStack 确实包含一个 Pub/Sub library using Redis. Also depending on your use-case you may be able to make use of notifying multiple subscribers with Server Events .
我正在尝试弄清楚如何使用 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)
{
//..
}
}
}
现在,如果我创建一个类似的应用程序充当第二个订阅者,这两个订阅者将共享同一个队列,因此 pub/sub 不会出现竞争条件。 换句话说,为每个订阅者实现注册需要做什么?我希望所有订阅者都能收到发布的 Hello 请求,而不只是根据竞争条件接收其中的一个。
ServiceStack 的 Messaging API 遵循服务请求/回复模式(即本质上使用 MQ 而不是 HTTP 传输)并且不支持 Pub/Sub 本身。
对于 RabbitMQ Pub/Sub 你必须在 IMessaging
API 抽象之外实现它,例如从您的服务实现中将其发布到 Rabbit MQ 主题。
相关的 ServiceStack 确实包含一个 Pub/Sub library using Redis. Also depending on your use-case you may be able to make use of notifying multiple subscribers with Server Events .