我有一个每60秒运行一次的工作代理程序检查新工作的处理表,如果有新工作,则每60秒运行一次。在处理过程中,代理使用静态TraceHelper类进行日志记录。在写入日志文件时,我还将WebRequest发送到外部API,以将日志条目发送到Logstash。
Webrequest实质上是为每个Writeline发送一个json对象。很明显,对于日志记录而言,顺序很重要,所以我的问题是,即使我只调用一个POST HttpWebRequest,这也是每分钟发生几百次。我应该担心同步问题吗?在第一个Writeline有机会发送之前,HttpWebRequest是否可能会调用和处理第二个Writeline请求?还是我错了?
注意:下面是半伪代码
说我有以下
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);
}
是否有可能在“foo”之前发送“baa”?
答案 0 :(得分:0)
我不知道你实际使用的是什么类的Web请求,但我会假设它是默认的异步,并根据它来回答它。如果你使用其他东西,答案可能会有所不同。
是和否。请求将全部由客户端按顺序解雇。但是,如果您每秒数百次这样做,您可能会让服务器在另一端接受的消息顺序不同,因为它们可能会叠加并超出服务器的处理能力。完全取决于连接数和使用的服务器软件。
所有这一切,说一秒钟发出数百个HTTP呼叫是一个糟糕的主意。如果需要记录,请使用日志框架,该框架允许您每隔一两个时间缓冲并批量记录一次请求。这将极大地节省您的带宽,增加可扩展性并减轻您登录的服务器上的CPU负载。
我可以衷心地推荐来自MS的nLog或语义应用程序记录块。使用过两者,它们都非常灵活,可以很好地处理负载。
答案 1 :(得分:-1)
可以安全地假设存在这种可能性,特别是如果您正在处理多个线程同时运行。一个安全的选择是设置一个单独的线程,其中包含BlockingCollection
或者只是将字符串从BlockingCollection
中拉出来并将它们发送到logstash。
这样你可以拥有它,任何人都可以写一些东西到BlockingCollection
,它们都会以正确的顺序发送到远程服务器。