UdpClient在用于记录时应该是单身吗?

时间:2013-06-18 03:17:00

标签: udpclient graphite statsd

我正在使用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");

1 个答案:

答案 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和端口。