sql-server - 如何配置 Rebus 使其具有基于处理程序类型的主题

标签 sql-server mongodb publish-subscribe rebus azure-servicebus-topics

我正在使用 Rebus,我想介绍类似 CQRS Journey 中描述的内容在“避免多次处理事件”段落,但我无法弄清楚。

我将 Rebus 配置为使用 SQL Server 进行传输,使用 MongoDB 进行订阅和 Sagas。 路由配置为TypeBased,并将所有命令处理程序的类型映射到传输中配置的队列。

 var bus = Configure.With(new SimpleInjectorContainerAdapter(container))
            .Logging(l => l.Trace())
            .Transport(t =>
            {
                t.UseSqlServer(connectionstring, "TestMessages", "messageQueueName");
            })
            .Routing(r => r.TypeBased()
                            .MapAssemblyOf<Assembly1.Commands.DoSomething>("messageQueueName")
                            .MapAssemblyOf<Assembly2.Commands.DoSomethingElse>("messageQueueName")
                             )
            .Sagas(s => s.StoreInMongoDb(db, (sagaType) =>
            {
                return sagaType.Name;
            }))
            .Subscriptions(s => s.StoreInMongoDb(db, "Subscriptions"))
            .Options(o =>
            {
                o.SetNumberOfWorkers(1);
                o.SetMaxParallelism(1);
                o.EnableSagaAuditing().StoreInMongoDb(db, "Snapshots");
            })
            .Start();

现在我应该以这样的方式配置 Rebus:当命令发布一个事件时,该事件会被复制到与现有订阅者类型一样多的单独主题(虚拟或物理队列)中。

类似于:

bus.Subscribe<Assembly1.EventHandler1>("Assembly1.EventHandler1Queue").Wait();
bus.Subscribe<Assembly1.EventHandler2>("Assembly1.EventHandler2Queue").Wait();
bus.Subscribe<Assembly2.EventHandler1>("Assembly2.EventHandler1Queue").Wait();

感谢您的帮助。

最佳答案

有一些事情似乎与您的问题令人困惑。

但我想您的基本问题是如何确保每条消息仅由每个订阅者处理一次。

答案非常简单:为每个订阅者拥有一个单独的端点 - 这意味着每个订阅者将拥有自己的输入队列,消息将从中处理,失败的消息将返回到该输入队列。

然后,您可以根据需要在每个订阅者中拥有任意数量的处理程序。将为每条传入消息执行所有兼容的处理程序。

使用 Rebus,每次调用 Configure.With(...).(...).Start() 都会为您提供一个单独的端点 - 所以在您的情况下,我建议您换行在方法中创建订阅者端点,然后您可以像这样调用:

var event1Subscriber = CreateSubscriber("subscriber_event1");
event1Subscriber.Subscribe<Event1>().Wait();

var event2Subscriber = CreateSubscriber("subscriber_event2");
event2Subscriber.Subscribe<Event2>().Wait();

var event3Subscriber = CreateSubscriber("subscriber_event3");    
event3Subscriber.Subscribe<Event3>().Wait();

// ...

其中CreateSubscriber将是这样的:

public IBus CreateSubscriber(string queueName)
{
    return Configure.With(GetContainerAdapter())
        .Transport(t => t.UseMsmq(queueName))
        .Start();        
}

关于sql-server - 如何配置 Rebus 使其具有基于处理程序类型的主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36014172/

相关文章:

javascript - 如何使用 Mongoose 计算每个国家/地区的重复项数量?

sql-server - Crystal 报告 - 按国家对城镇进行分组

sql-server - 如何grep SQL Server存储过程?

sql-server - SQL Server 中存储 IP 地址的数据类型

json - mongoimport 错误处理

meteorjs Iron-router waitOn 并用作渲染数据

.net - 根据 SQL 表时间戳安排 .exe 执行

mongodb - mongodb 更新如何在内部工作?

javascript - Redis 自动发布新条目

python - 如何在 Python 中使用套接字创建 channel