我正在尝试实现一个简单的日志库,它将用于多个项目.库的工作是将HTTP请求发送到ElasticSearch.这个库的要点是它不能等待响应.另外,我不关心任何错误/异常.它必须将请求发送到ElasticSearch,并立即返回.我不想用返回类型创建接口Task,我希望它们留下来void.
以下是我的示例代码.这是"火与忘"的正确和安全的实施吗?如果我Task.Run()在高负载库中使用它可以吗?或者我应该避免Task.Run()在我的情况下使用?另外,如果我不使用await带Task.Run(),将我阻塞线程?此代码在库中:
public enum LogLevel
{
Trace = 1,
Debug = 2,
Info = 3,
Warn = 4,
Error = 5,
Fatal = 6
}
public interface ILogger
{
void Info(string action, string message);
}
public class Logger : ILogger
{
private static readonly HttpClient _httpClient = new HttpClient(new HttpClientHandler { Proxy = null, UseProxy = false });
private static IConfigurationRoot _configuration;
public Logger(IConfigurationRoot configuration)
{
_configuration = …Run Code Online (Sandbox Code Playgroud) 我通过在 .NET Core 2.2 上使用 BackgroundService 将 Kafka 使用者实现为控制台应用程序。我使用 confluent-kafka-dotnet v1.0.1.1 作为 Apache Kafka 的客户端。我不太确定如何处理每条消息。
由于处理每条消息可能需要一些时间(最多 24 小时),因此我为每条消息启动了一个新任务,这样我就不会阻止消费者使用新消息。我认为如果我的消息太多,每次创建一个新任务并不是正确的方法。那么处理每条消息的正确方法是什么?是否可以为每条消息创建某种动态后台服务?
如果一条消息已经在处理中,但应用程序崩溃或发生重新平衡,我最终会多次使用和处理相同的消息。我应该自动提交偏移量(或在它被消耗后立即提交)并将消息(或任务)的状态存储在某个地方,比如在数据库中?
我知道有 Hangfire,但我不确定是否需要使用它。如果我目前的方法完全错误,请给我一些建议。
下面是 ConsumerService 的实现:
public class ConsumerService : BackgroundService
{
private readonly IConfiguration _config;
private readonly IElasticLogger _logger;
private readonly ConsumerConfig _consumerConfig;
private readonly string[] _topics;
private readonly double _maxNumAttempts;
private readonly double _retryIntervalInSec;
public ConsumerService(IConfiguration config, IElasticLogger logger)
{
_config = config;
_logger = logger;
_consumerConfig = new ConsumerConfig
{
BootstrapServers = _config.GetValue<string>("Kafka:BootstrapServers"),
GroupId = _config.GetValue<string>("Kafka:GroupId"),
EnableAutoCommit = _config.GetValue<bool>("Kafka:Consumer:EnableAutoCommit"), …Run Code Online (Sandbox Code Playgroud) 我使用的是.NET Framework 4.6.1.
我的web api中有一个控制器,我有静态HttpClient来处理所有的http请求.我在IIS上托管我的应用程序后,大约每月一次,对于我的应用程序的所有传入请求,我收到以下异常:
System.ArgumentNullException: Value cannot be null.
at System.Threading.Monitor.Enter(Object obj)
at System.Net.Http.Headers.HttpHeaders.ParseRawHeaderValues(String name, HeaderStoreItemInfo info, Boolean removeEmptyHeader)
at System.Net.Http.Headers.HttpHeaders.AddHeaders(HttpHeaders sourceHeaders)
at System.Net.Http.Headers.HttpRequestHeaders.AddHeaders(HttpHeaders sourceHeaders)
at System.Net.Http.HttpClient.PrepareRequestMessage(HttpRequestMessage request)
at System.Net.Http.HttpClient.SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.PutAsync(Uri requestUri, HttpContent content, CancellationToken cancellationToken)
at Attributes.Controllers.AttributesBaseController.<UpdateAttributes>d__6.MoveNext() in D:\Git\PortalSystem\Attributes\Controllers\AttributesBaseController.cs:line 42
Run Code Online (Sandbox Code Playgroud)
如果我在IIS上重新启动应用程序池,一切都会再次开始正常工作.这是我的代码:
public class AttributesBaseController : ApiController
{
[Inject]
public IPortalsRepository PortalsRepository { get; set; }
private static HttpClient Client = new HttpClient(new HttpClientHandler { Proxy = null, …Run Code Online (Sandbox Code Playgroud) c# ×3
async-await ×2
.net ×1
.net-core ×1
apache-kafka ×1
asp.net-core ×1
asynchronous ×1
iis ×1
task ×1