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 .