调用相同的HttpRequestMethod是否等待现有的HttpRequestMethod完成

时间:2016-09-13 14:26:38

标签: c# asynchronous httpwebrequest

我有一个每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”?

2 个答案:

答案 0 :(得分:0)

我不知道你实际使用的是什么类的Web请求,但我会假设它是默认的异步,并根据它来回答它。如果你使用其他东西,答案可能会有所不同。

是和否。请求将全部由客户端按顺序解雇。但是,如果您每秒数百次这样做,您可能会让服务器在另一端接受的消息顺序不同,因为它们可能会叠加并超出服务器的处理能力。完全取决于连接数和使用的服务器软件。

所有这一切,说一秒钟发出数百个HTTP呼叫是一个糟糕的主意。如果需要记录,请使用日志框架,该框架允许您每隔一两个时间缓冲并批量记录一次请求。这将极大地节省您的带宽,增加可扩展性并减轻您登录的服务器上的CPU负载。

我可以衷心地推荐来自MS的nLog或语义应用程序记录块。使用过两者,它们都非常灵活,可以很好地处理负载。

答案 1 :(得分:-1)

可以安全地假设存在这种可能性,特别是如果您正在处理多个线程同时运行。一个安全的选择是设置一个单独的线程,其中包含BlockingCollection或者只是将字符串从BlockingCollection中拉出来并将它们发送到logstash。

这样你可以拥有它,任何人都可以写一些东西到BlockingCollection,它们都会以正确的顺序发送到远程服务器。