【问题标题】:Does calling the same HttpRequestMethod wait for the existing one to finish是否调用相同的 Http 请求方法等待现有的完成
【发布时间】:2016-09-13 14:26:38
【问题描述】:

我有一个工作代理程序,它每 60 秒运行一次,检查处理表是否有新工作,如果有新工作可用,则每 60 秒检查一次。在处理过程中,代理使用静态 TraceHelper 类进行日志记录。在写入日志文件时,我还将 WebRequest 发送到外部 API 以将日志条目发送到 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);
}

是否有可能在“foo”之前发送“baa”?

【问题讨论】:

    标签: c# asynchronous httpwebrequest


    【解决方案1】:

    我不知道您实际使用哪些类来处理 Web 请求,但我会假设它是默认的异步类并据此进行回答。如果您使用其他东西,答案可能会有所不同。

    是和不是。请求将全部由客户端按顺序触发。但是,如果您每秒执行数百次此操作,则另一端服务器接受的消息可能不会以相同的顺序进行,因为它们可能会堆积并超出服务器的处理能力。完全取决于连接数和使用的服务器软件。

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

    我衷心推荐 MS 的 nLog 或 Semantic Application Logging Block。两者都用过,而且它们都非常灵活并且可以很好地处理负载。

    【讨论】:

    • 感谢您的回复。我想我没有足够的空间或愿望来完成整个项目。最终发送 WebRequest 的方法会在发送之前对其进行批处理。每个周期大约 100 个批次。我想我想说的一点是,即使我确实将它批量化了..我想知道请求将发送给他们的顺序,我现在有答案了。我现在将研究 .net 4.5 中的异步 webreqeust 框架
    【解决方案2】:

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

    这样您就可以让任何人都可以向BlockingCollection 写一些东西,并且它们都会以正确的顺序发送到远程服务器。

    【讨论】:

    • 没有提到线程,只有异步,这是不一样的。并且日志记录应该始终成批进行,尤其是在远程记录时。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 2019-05-19
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多