昨天,在经销商进行了一些非常有希望的测试后,我要求额外预算购买NSB(36-80芯)的许可证。
应该提到的是,我们目前正在使用经销商来解决管道问题而尚未用于真正的商务活动,但这是后来的事。
今天,我非常熟练的同事也开始使用公共汽车,由于他的项目性质,他的性能要求比我的高很多。因此,他的测试需要比经销商目前给我的平均30-50 msg pr平均值更多。
无论我们试图做什么:
这非常糟糕,因为我已经申请了更多的预算资金,如果我们不能很快获得更好的表现,我们就不得不放弃这个项目,我们将面临一些严重的麻烦:S。
问题:
我们当前使用的开发人员许可证是否存在限制,导致此限制或MSMQ存在严重的性能问题,例如此处所述:http://ayende.com/blog/4251/what-am-i-missing-msmq-perf-issue。
我已经在nservicebus自己的网站上阅读了很多关于许可证的内容,但没有明确描述开发者许可证的限制。
希望有人可以帮助我:)。
[UPDATE]
我回到基础并尝试用NSB自己的代码示例 ScaleOut 重现问题,只需发送10000条消息,看看工人/经销商会如何反应。所以我开始了经销商和2名工人(工人每人有100个线程)并猜测重新出现的问题。
然后我想知道这是否真的如此,并开始运行一些简单的线程数,调整与Distributor和Workers的测试。经过一些尝试,我的样品中的吞吐量高达400-500 msg pr sec。这是我发现的:
观测/解决方案:
后续问题:
我现在正在做一些分布式测试,看看是否在同一台机器上启动多个工作人员,但与分发服务器不同的机器。我希望不必为每个工作人员设置单独的队列,这是可能的,因为我们已经为工作人员订购了额外的服务器而且没有更多的预算。
到目前为止,我有点失望的是,我不能简单地调出一个工作线程的线程数,只从一个工作开始,然后扩展到更多的机器,每个机器有1个工人。现在我被迫在一台机器上安装了多个工作人员:/。
如果关于经销商/工作人员遗失的任何小问题,请分享,因为这让我发疯:/。
[更新2]
如果我使用NServiceBus.Integration NServiceBus.Distributor / Worker和只有1名工作人员在visual studio外部运行ScaleOut示例,我可以获得4-500 msg / sec的吞吐量。
这很好,但它没有解释我在自己的设置中做错了什么我们自己托管。看看我们的配置,告诉我是否有些可疑:
发行者:
var queuePrefix = ConvertFriendlyNameTo.QueueName(AppDomain.CurrentDomain.FriendlyName);
return NServiceBus.Configure.With()
.DefineEndpointName(queuePrefix)
.Log4Net(ObjectFactory.GetInstance<IServiceBusLog>().Build())
.StructureMapBuilder()
.JsonSerializer()
.AsMasterNode()
.RunDistributorWithNoWorkerOnItsEndpoint()
.MsmqTransport()
.IsTransactional(true)
.DisableTimeoutManager()
.DisableSecondLevelRetries()
.UnicastBus()
.CreateBus()
.Start(() => NServiceBus.Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());
工人:
var queuePrefix = ConvertFriendlyNameTo.QueueName(AppDomain.CurrentDomain.FriendlyName);
return NServiceBus.Configure.With()
.DefineEndpointName(queuePrefix)
.Log4Net(ObjectFactory.GetInstance<IServiceBusLog>().Build())
.StructureMapBuilder()
.JsonSerializer()
.EnlistWithDistributor()
.MsmqTransport()
.IsTransactional(true)
.DisableTimeoutManager()
.DisableSecondLevelRetries()
.UnicastBus()
.CreateBus()
.Start(() => NServiceBus.Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());
我们在这里做错了什么可能导致性能差异?
亲切的问候。