Pub / Sub使用RabbitMQ

时间:2015-01-15 11:05:41

标签: servicestack

我正在试图弄清楚如何使用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请求,而不仅仅是竞争条件中的其中一个。

1 个答案:

答案 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