Как я могу проверить, есть ли у меня inte rnet подключение перед входом в Cosmos DB? - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть этот код, который я использую для регистрации активности в базе данных Cosmos.

protected override async void OnStart()
{
   await Helper.LogActivity("OnStart");

public static partial class Helper
{
    public static async Task LogActivity(string activity)
    {
        var logItem = new LogItem()
        {
            Activity = activity,
        };
        await CosmosDBService.InsertLogItem(logItem);
    }
}

public class CosmosDBService
{
    static DocumentClient docClient = null;

    static readonly string databaseName = "Test";
    static readonly string collectionName = "Logs";

    static async Task<bool> Initialize()
    {
        if (docClient != null)
            return true;
        try
        {
            docClient = new DocumentClient(new Uri(APIKeys.CosmosEndpointUrl), APIKeys.CosmosAuthKey);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
            docClient = null;
            return false;
        }
        return true;
    }

    public async static Task InsertLogItem(LogItem item)
    {
        if (!await Initialize())
            return;
        await docClient.CreateDocumentAsync(
            UriFactory.CreateDocumentCollectionUri(databaseName, collectionName),
            item);
    }

}

Что меня беспокоит, так это отсутствие целой rnet связи. Было бы хорошей идеей сначала как-то протестировать это, или мне следует добавить исключение try catch в код для ведения журнала?

Буду признателен за любые предложения о том, как сделать этот код пуленепробиваемым, чтобы даже если нет соединения, то в OnStart не возникает исключение.

Если регистрация не удалась, для меня это не проблема, но я хочу быть уверенным, что код не потерпит неудачу, если нет соединения inte rnet или если произойдет сбой вызова cosmos db.

1 Ответ

1 голос
/ 18 февраля 2020

Возможно, составьте контрольный список соответствующих случаев:

1) Нет Интернета 2) Inte rnet, но база данных отключена 3) et c ..

Затем проверьте свой код и посмотрите, как он себя ведет, и убедитесь, что вы рассматриваете дела. Тогда вы можете быть (несколько) уверены, как ваш код ведет себя в этих условиях. Он также покажет вам, где происходит исключение, поэтому вы можете добавить блок try..catch для предотвращения других сбоев.

ОБНОВЛЕНИЕ - Относительно обработки ошибок:

Так что, если ваша программа не может инициализировать docClient, это будет означать, что он не сможет записывать какие-либо журналы.

Так что может быть несколько способов справиться с этим,

1) вы могли бы иметь «резервный» метод ведения журнала, то есть, если docClient == null войти в консоль. (Так что позже вы сможете исследовать на сервере, что пошло не так). Это позволит вам сохранить важные журналы, сохраненные, если сервер хранит эти журналы.

2) Другим резервным методом будет буферизация событий в списке памяти. и повторите попытку подключения каждые 10 минут к базе данных. Если соединение прошло успешно, вы опустошите свой буфер в базу данных.

3) Вы можете внедрить счетчик повторов, например, повторить попытку подключения X раз при запуске, в случае неудачи вы можете вернуться к другому методу или комбинации приведенных выше идей. , Кроме того, у вас может быть система, которая предупреждает вас по электронной почте или через SMS, в зависимости от того, насколько важна эта услуга.

Эти идеи связаны с проблемами подключения к базе данных. Это, тем не менее, не очень поможет вам с фактической вставкой, например, если ваше соединение с БД прервется на полпути.

Так что вам все равно может понадобиться попытка перехвата в методе InsertLogItem вокруг фактического кода вставки. Так что это скрыло бы попытку try вокруг каждого оператора await Helper.LogActivity("OnStart");, поскольку он интегрирован. и если этот журнал завершится неудачно, вы можете снова рассмотреть резервные методы или действия

UPDATE2) Глядя на CreateDocumentAsync возвращаемый объект здесь: https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.documents.client.resourceresponse-1?view=azure-dotnet

ResourceResponse<Document> response = await client.CreateDocumentAsync(collectionLink, document);
Console.WriteLine(response.RequestCharge);
Console.WriteLine(response.ActivityId); 
Console.WriteLine(response.StatusCode); // HttpStatusCode.Created or 201

Кажется Вы можете получить код состояния, указывающий результат, я попытался бы закрыть сервер на полпути и наблюдать, возвращается ли ответ asyn c с соответствующим кодом ошибки или если он выдает. Если это не произойдет, вам может не понадобиться попытка перехвата, просто проверьте код возврата и затем выполните действия.

...