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

本文关键字:方法 是否 HttpRequestMethod 调用 等待 | 更新日期: 2023-09-27 18:07:01

我有一个工作代理代理,它每60秒运行一次检查处理表是否有新工作,如果有新工作,则每60秒运行一次。在处理过程中,代理使用静态TraceHelper类进行日志记录。在写入日志文件时,我还向外部API发送了一个WebRequest,以将日志条目发送到Logstash。

Webrequest基本上为每个Writeline发送一个json对象。显然,对于日志记录的目的,顺序是重要的,所以我的问题是,即使我只调用一个POST HttpWebRequest这是一分钟发生数百次。我应该担心同步问题吗?是否有可能在第一个Writeline有机会发送之前,第二个Writeline请求被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"之前发送?

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

我不知道你实际使用的是什么类的web请求,但我假设它是默认的异步的,并根据它回答它。如果您正在使用其他内容,则答案可能会有所不同。

是和不是。客户端将按顺序触发所有请求。但是,如果您每秒这样做数百次,则另一端服务器接受的消息可能不是以相同的顺序,因为它们可能堆积起来并超过服务器的处理能力。完全取决于连接的数量,以及所使用的服务器软件。

话虽如此,每秒进行数百次HTTP调用是一个糟糕的主意。如果您需要记录日志,请使用一个日志框架,它允许您每隔一到两秒钟缓冲并批量记录到一个请求中。这将大大节省您的带宽,增加可伸缩性,并减轻您正在登录的服务器上的CPU负载。

我可以衷心地推荐nLog或ms的语义应用日志块,我都用过,它们都非常灵活,处理负载也很好。

可以放心地假设存在这种可能性,特别是在处理同时运行的多个线程时。一个安全的选择是设置一个单独的线程,使用BlockingCollection或其他简单地从BlockingCollection中提取字符串并将它们发送到logstash。

这样你就可以这样做,任何人都可以写一些东西到BlockingCollection,他们都会被发送到远程服务器在正确的顺序