我们有一个“小”的NServiceBus应用程序,它使用十几个EF映射表和RabbitMQ作为通信媒介。使用NServiceBus.Host.Exe启动应用程序需要大约26秒(调试和发布版本,无论是否附带调试器)。
添加EndpointConfigurationType应用程序后,将加载时间减少2秒。
所以我一直在研究这个问题,并且在第一个查询中花费了大约8-10秒的EF,这是各种生成例程。 NGen也可以增强EF加载性能。
然而,经过NGen:启动库并启动NServiceBus.Host.exe后,默认appdomain会加载Native图像,但也会使用额外的appdomain(使用IL dll)加载,因此看起来它使用的是 LoadFrom 加载依赖项。
有解决方法吗?我们想使用NSB.Host.exe来实现它的Windows服务功能(我们对重新实现不感兴趣)。其他“IWantTo ...”功能也很不错,因为我们已经有几个(16?)端点使用它们。
修改 http://blogs.msdn.com/b/abhinaba/archive/2014/02/18/net-ngen-explicit-loads-and-load-context-promotion.aspx 我的所有dll都与NServiceBus.Host.exe位于同一目录中,所以基于此,Fusion也应该加载本机dll。
edit2:这是“最小”的repro,没有nservicebus.host.exe的所有b& w,但它似乎在调试情况下工作。它起始于2s,而不是Nservicebus.host.exe
的26susing NServiceBus;
using BABAR.Configuration;
using System;
using System.Collections.Generic;
using System.Reflection;
namespace BABAR.NGENHelper
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Starting: {0}", DateTime.Now.ToLongTimeString());
StartNSB();
Console.WriteLine("NSB started: {0}", DateTime.Now.ToLongTimeString());
}
private static void StartNSB()
{
// this ends up loading EF, in this case unnoticeable
NServiceBus.Unicast.Transport.TransportConnectionString.Override(
GetRabbitMQConnectionString);
NServiceBus.SetLoggingLibrary.Log4Net(() => log4net.Config.XmlConfigurator.Configure());
var semibus = Configure.With(GetNSBAssemblies())
.DefaultBuilder()
.DefineEndpointName("NGENHelper")
.UseTransport<NServiceBus.RabbitMQ>()
.PurgeOnStartup(false)
.UnicastBus()
.ImpersonateSender(false)
.RunHandlersUnderIncomingPrincipal(false)
.CustomConfigurationSource(new DefaultNServiceBusConfigurationSource())
.MessageForwardingInCaseOfFault()
.DisableTimeoutManager();
var bus = semibus.CreateBus()
.Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>()
.Install());
}
public static string GetRabbitMQConnectionString()
{
var nc = new Access().GetNode<NodeConfiguration>();
return nc.RabbitConnectionString;
}
internal static IEnumerable<Assembly> GetNSBAssemblies()
{
return new[] {
typeof(NServiceBus.RabbitMQ).Assembly, // IConfigureTransport for NSB
typeof(BABAR.Bootstrapper).Assembly,
};
}
}
}
答案 0 :(得分:1)
我认为只需自我托管https://github.com/SimonCropp/NServiceBus.SelfHost#self-host
查看
下面的自我主持人的示例代码&#34;服务功能&#34;可以通过调用sc.exe来替换NSB主机 https://github.com/SimonCropp/NServiceBus.SelfHost#install--uninstall
class ProgramService : ServiceBase
{
IStartableBus bus;
static void Main()
{
using (var service = new ProgramService())
{
// so we can run interactive from Visual Studio or as a service
if (Environment.UserInteractive)
{
service.OnStart(null);
Console.WriteLine("\r\nPress any key to stop program\r\n");
Console.Read();
service.OnStop();
}
else
{
Run(service);
}
}
}
protected override void OnStart(string[] args)
{
Configure.GetEndpointNameAction = () => "SelfHostSample";
bus = Configure.With()
.DefaultBuilder()
.UnicastBus()
.CreateBus();
bus.Start(Startup);
}
static void Startup()
{
//Only create queues when a user is debugging
if (Environment.UserInteractive && Debugger.IsAttached)
{
Configure.Instance.ForInstallationOn<Windows>().Install();
}
}
protected override void OnStop()
{
if (bus != null)
{
bus.Shutdown();
}
}
}