21 марта 2010 в 17:10

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

.NET*
По работе постоянно сталкиваюсь с недостаточностью ресурсов 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 из структур событий.

П.С. Это моя «проба пера». Надеюсь получить отзывы о полезности и оформлении или наоборот – о неуместности подобных постов на Хабре. Спасибо.
Борис Иомдин @iblesq
карма
36,2
рейтинг 0,0
Самое читаемое Разработка

Комментарии (4)

  • +2
    Материал уместен, проба пера удалась :) Тема Load balancing под Win вообще на хабре обойдена стороной, так что пишите.

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

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