我有一个workagent代理,它每隔60秒运行一次,检查新工作的处理表,如果有新工作,则每隔60秒运行一次。在处理过程中,代理使用静态TraceHelper类进行日志记录。在写入日志文件时,我还向外部应用程序接口发送WebRequest,以便将日志条目发送到Logstash。
Webrequest实质上是为每个Writeline发送一个json对象。显然,为了日志记录的目的,顺序很重要,所以我的问题是,即使我只调用了一个帖子HttpWebRequest,但这种情况每分钟都会发生数百次。我应该担心同步问题吗?是否有可能在第一个写入线有机会发送之前,第二个写入线请求被HttpWebRequest调用和处理?还是我调查错了?
注意:下面是半伪码
假设我有以下内容
Tracehelper.Writeline("foo")
Tracehelper.Writeline("baa");
static Tracehelper(){}
public static void Writeline(string msg)
{
File.WriteToFile(msg);
WebProcessHelper.SendLog(msg);
}
static WebProcessHelper() {}
public static void SendLog(string msg)
{
SendHttpRequest(msg);
}
有没有可能"baa“在"foo”之前发送?
发布于 2016-09-13 22:40:42
我不知道你实际使用的web请求是什么类,但我会假设它是默认的异步类,并根据你使用的其他东西的that.If来回答它,答案可能会有所不同。
是也不是。所有请求都将按顺序由客户端触发。但是,如果您每秒执行数百次此操作,则另一端的服务器可能会以不同的顺序接受消息,因为它们可能会堆叠在一起,超出服务器的处理能力。完全取决于连接的数量和使用的服务器软件。
尽管如此,每秒进行数百次HTTP调用是一个糟糕的想法。如果您需要记录日志,请使用日志记录框架,该框架允许您每隔一两秒钟将日志记录缓冲并批处理到请求中。这将大大节省您的带宽,增加可伸缩性,并减轻您要登录到的服务器上的CPU负载。
我可以由衷地推荐MS.的nLog或语义应用程序日志记录块,它们都使用了这两种方法,而且它们都非常灵活,并且能够很好地处理负载。
发布于 2016-09-13 22:36:30
可以放心地假设存在这种可能性,特别是当您正在处理同时运行的多个线程时。一个安全的选择是设置一个单独的线程,使用一个BlockingCollection
或其他东西从BlockingCollection
中提取字符串并将它们发送到logstash。
这样,任何人都可以向BlockingCollection
写入内容,这些内容将按正确的顺序发送到远程服务器。
https://stackoverflow.com/questions/39472488
复制相似问题