C# — Использование событий в Microsoft Network Load Balancing

    По работе постоянно сталкиваюсь с недостаточностью ресурсов MSDN.
    Т.е., даже если общее описание довольно подробно нет почти никакой возможности пользоваться классом/технологией из-за недостатка примеров. Приходится довольно долго (иногда часами) искать по разнообразным ресурсам в Интернете для того чтобы найти разумный и прозрачный способ использования.

    Одним из последних примеров у меня было использование Microsoft Network Load Balance (что это такое можно посмотреть тут) внутри C# кода. Существует множество примеров использования NLB из VB скриптов и практически нет примеров использования из managed code.

    Задача: определение статуса машины (кластера) в данный момент времени.
    Существующее решение: Polling – определение статуса путем запросов через WMI.
    Недостаток: есть большая вероятность пропустить изменение состояния в момент самого события, недостаток информации, время затрачиваемое на считывание состояния.
    Возможный подход: применение механизма «событий». Такой механизм существует, даже с примерами, но не для использования внутри кода.
    Решение:

    Объявление в главном методе:
    «
    String mePath = "\\\\localhost\\root\\MicrosoftNLB";
    ManagementEventWatcher watcher1 = new ManagementEventWatcher(mePath, "SELECT * FROM MicrosoftNLB_NodeControlEvent");
    watcher1.EventArrived += new EventArrivedEventHandler(watcher_NodeControlEventArrived);
    watcher1.Options.Timeout = new TimeSpan(0, 0, 1);
    watcher1.Start(); //need Stop!!!!!!!


    * This source code was highlighted with Source Code Highlighter.

    »

    Описание callback для получения извещения о событии:
    «
    static void watcher_NodeControlEventArrived(object sender, EventArrivedEventArgs e)
    {
    //http://msdn.microsoft.com/en-us/library/bb736304(VS.85).aspx
      ManagementEventWatcher watcher = (ManagementEventWatcher)sender;
      Console.WriteLine(watcher.Query.QueryString.ToString());
      PropertyData property;
      if ((property = e.NewEvent.Properties["Id"]) != null)
      {
        Console.WriteLine(property.Name + ": " + property.Value);
      }
      if ((property = e.NewEvent.Properties["InstanceName"]) != null)
      {
        Console.WriteLine(property.Name + ": " + property.Value);
      }
      if ((property = e.NewEvent.Properties["Active"]) != null)
      {
        Console.WriteLine(property.Name + ": " + property.Value);
      }
      if ((property = e.NewEvent.Properties["AdapterGuid"]) != null)
      {
        Console.WriteLine(property.Name + ": " + property.Value);
      }
      if ((property = e.NewEvent.Properties["ClusterIPAddress"]) != null)
      {
        Console.WriteLine(property.Name + ": " + property.Value);
      }
      if ((property = e.NewEvent.Properties["HostPriority"]) != null)
      {
        Console.WriteLine(property.Name + ": " + property.Value);
      }
    }


    * This source code was highlighted with Source Code Highlighter.

    »

    Комментарии:
    Вместо «MicrosoftNLB_NodeControlEvent» можно получать и другие события – полный список тут: «Network Load Balancing WMI Classes» и соответственно считывать property из структур событий.

    П.С. Это моя «проба пера». Надеюсь получить отзывы о полезности и оформлении или наоборот – о неуместности подобных постов на Хабре. Спасибо.
    Метки:
    Поделиться публикацией
    Комментарии 4
    • +2
      Материал уместен, проба пера удалась :) Тема Load balancing под Win вообще на хабре обойдена стороной, так что пишите.

      Небольшие замечания:
      — Хабракат не помешает
      — Исходный код, если его больше нескольких строк, лучше форматировать и расцвечивать;
      — Лучше один длинный топик, чем два коротких :)
      • +1
        спасибо! очень кстати!
        • 0
          перенесите, пожалуйста в блог .net

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.