我正在使用Graphite.NET记录到statsD。在引擎盖下,它使用UdpClient写入statD服务器。 Source。我认为将它创建为单例是有意义的,因为我将经常进行日志记录,并且似乎每次我想要记录时创建此客户端和连接都会有很多开销。这样做有什么缺点吗?如果连接中断会发生什么:是否会抛出异常?下次我尝试使用记录器时,我的记录器是否会被StuctureMap重新创建?这是我的SM配置的样子:
x.For<IStatsDClientAdapter>()
.Singleton()
.Use<StatsDClientAdapter>()
.Ctor<string>("hostname").EqualToAppSetting("GraphiteHostname")
.Ctor<int>("port").EqualToAppSetting("GraphitePort")
.Ctor<string>("keyPrefix").EqualToAppSetting("GraphiteKeyPrefix");
答案 0 :(得分:2)
因为Graphite.NET StatsDClient在其构造函数中实例化并调用UdpClient上的Connect,所以如果您只进行一次此调用(例如,在应用程序启动时通过依赖性,则您从初始连接异常恢复的能力)是有限的注入单身 - 你已经完成了)。
使用带有此StatsDClient的Singleton意味着如果发生连接问题,您需要捕获并重新实例化StatsDClient,以确保您的应用程序已正确初始化(即使用有效的StatsDClient)...因为,再次,Connect在构造函数中运行。
也就是说,如果StatsDClient成功初始化(即Connect不会抛出异常),那么即使服务器因为UDP无连接而且StatsDClient处理/捕获Send上发生的任何异常,您也应该没问题。 )。客户端应该保持正确触发默认连接中建立的Ip和端口的发送,而不知道服务器是好还是坏。
太糟糕了,Graphite.NET StatsDClient
没有将ip和端口传递给UdpClient.Send()
- http://msdn.microsoft.com/en-us/library/acf44a1a.aspx)而不是通过构造函数使用默认连接......因为这样会使用静态成员(因为您可以在任何条件下构建可用的StatsDClients)。
长话短说,为了避免让你的应用程序进入糟糕状态,我会在使用时实例化。如下:
using(var statsdclient = new StatsDClient("my.statsd.host", 8125, "whatever.blah"))
{
statsdclient.Increment("asdf");
}
或者,也可以fork StatsDClient并修改它以传递Send()上的IP和端口。