我们的应用程序中有一个大型进程,每月运行一次.此过程通常在大约30分钟内运行,并生成342000左右的日志事件.最近我们使用WCF将日志记录更新为集中模型,现在性能有问题.以前的解决方案将在大约30分钟内完成,而新的日志记录现在需要3到4个小时.看起来问题是因为应用程序在执行继续之前实际上正在等待WCF请求完成.WCF方法已经配置为IsOneWay,我将客户端的调用包装到另一个线程中的WCF方法,以尝试防止此类问题,但它似乎没有工作.我已经考虑过使用异步WCF调用,但在我尝试其他东西之前想过我会问这里是否有更好的方法来处理它.
30 分钟内记录了 342000 个日志事件,如果我计算正确的话,每秒会记录 190 个日志事件。我认为您的问题可能与 WCF 中的默认限制设置有关。即使您的方法设置为单向,根据您是否为每个记录的事件创建新代理,在创建代理、打开通道以及如果您使用的是基于 HTTP 的绑定,它将阻塞,直到服务收到消息为止(基于 HTTP 的绑定在收到消息时会为单向方法调用发回空响应)。默认的 WCF 限制将服务端的并发实例限制为 10 个,这意味着一次只会处理 10 个请求,任何进一步的请求都将排队,因此将其与 HTTP 绑定配对,前 10 个请求之后的任何请求都会被处理。将阻塞客户端,直到它成为 10 个请求之一得到处理。在不知道您的服务如何配置(实例模式等)的情况下,很难说更多,但如果您使用每次调用实例,我建议您将MaxConcurrentCalls和设置为更高的值(默认值为 16和 10)。MaxConcurrentInstancesServiceBehavior
此外,为了构建其他人提到的聚合多个事件并一次提交所有事件的内容,我发现设置静态Logger.LogEvent(eventData)方法很有帮助。这样,在整个代码中使用起来就很简单,并且您可以在LogEvent方法中控制日志记录在整个应用程序中的行为方式,例如配置一次应提交多少个事件。