2016-06-24 1 views
5

У меня есть несколько приложений, работающих на одной машине. Один из них выполняет работу и записывает журналы на диск о том, что он сделал (я буду называть этот WorkerApp), а другой, который суммирует информацию о поддержке статуса WorkerApp вместе с некоторыми подробностями (я буду называть эту панель мониторинга).Как я могу отправить «Сообщение» другому процессу в .Net, не используя SendMessage?

С панели инструментов я хочу дать указание WorkerApp предпринять действие (скажем, «Удаленные службы Ping»), и мне бы хотелось, чтобы WorkerApp отправил Dashboard ответ «понг», когда он его получил.

Я видел примеры использования SendMessage, но это кажется довольно архаичным (нет ли в настоящее время в стандарте 2016 между стандартами связи?).

У меня очень мало опыта работы с Akka.Net, но функция Remoting выглядит как хороший подход, хотя настройка этого кажется немного переборщиной за то, что я хотел бы сделать.

Что является самым простым способом в настоящее время обмениваться данными между двумя процессами в .NET? И есть ли некоторые примеры этого, работая над localmachine?

+0

Akka.NET может, или вы можете использовать MSMQ ... любые автобусы сообщение в основном, как вы IPC –

+1

«Overkill» относительный. Если у вас есть какое-либо решение, оно, вероятно, потребует больше (например, безопасности, надежности, удаленного (как на разных компьютерах) и т. Д.). Добавление всех таких вещей в доморощенный раствор на основе примитивов (например, сырых труб и т. Д.) - это нелегкая задача. Я бы использовал существующую технологию, Akka.NET или даже WCF. –

+0

@ Christian.K Я знаю, что «overkill» был субъективным термином. Это действительно то, что я чувствую в настоящее время с Akka.net, так как у меня нет большого опыта в этом. Я, вероятно, буду экспериментировать с Akka.net Remoting, чтобы решить эту проблему, но я хотел, чтобы я почувствовал, что другие люди уже пошли по этой дороге и имели плохой опыт. – XenoPuTtSs

ответ

2

Я собрал пример Akka.Net для этого. Вот как это выглядит.

DashBoard (рассылает)

using System; 
using Akka.Actor; 
using Akka.Configuration; 

namespace DashBoard 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var config = ConfigurationFactory.ParseString(@" 
akka { 
    actor { 
     provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote"" 
    } 
    remote { 
     helios.tcp { 
      transport-class = ""Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote"" 
      applied-adapters = [] 
      transport-protocol = tcp 
      port = 0 
      hostname = localhost 
     } 
    } 
} 
"); 

      using (var system = ActorSystem.Create("Dashboard", config)) 
      { 
       var server = system.ActorSelection("akka.tcp://[email protected]:8081/user/WorkerAppActor"); 
       while (true) 
       { 
        var input = Console.ReadLine(); 
        server.Tell(input); 
       } 
      } 
     } 
    } 
} 

WorkerApp (принимает сообщения)

using System; 
using Akka.Actor; 
using Akka.Configuration; 

namespace WorkerApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var config = ConfigurationFactory.ParseString(@" 
akka { 
    actor { 
     provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote"" 
    } 
    remote { 
     helios.tcp { 
      transport-class = ""Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote"" 
      applied-adapters = [] 
      transport-protocol = tcp 
      port = 8081 
      hostname = localhost 
     } 
    } 
} 
"); 

      using (var system = ActorSystem.Create("WorkerApp", config)) 
      { 
       system.ActorOf<WorkerAppActor>("WorkerAppActor"); 

       Console.ReadLine(); 
      } 
     } 
    } 

    class WorkerAppActor : TypedActor, IHandle<string> 
    { 
     public void Handle(string message) 
     { 
      Console.WriteLine($"{DateTime.Now}: {message}"); 
     } 
    } 
} 
1

Обратите внимание на .Net remoting. Это немного более современно, чем SendMessage, но не много. Это довольно легко использовать. Я думаю, что официальный способ сделать это в наши дни, вероятно, использует WCF, но я уверен, что это точно так же под капотом.

. Удаленный доступ через сеть поддерживает различные каналы (Http, TCP), но в вашем случае я предлагаю удалять IPC. Он сидит поверх названных труб.

Наверное, проще всего, если вы google (.Net remoting), но общая идея - определить класс в вашем «серверном» приложении, полученном из MarshalByRefObject. После того, как вы это сделали, зарегистрируйте его в удаленной инфраструктуре с помощью RemotingConfiguration.RegisterWellKnownServiceType.

Ваше клиентское приложение может затем создать экземпляр класса с помощью Activator.CreateObject, и тогда вам будет хорошо идти.

Одна вещь, о которой нужно знать: похоже, вам нужен механизм обратного вызова, поэтому ваша панель мониторинга не заблокирована в ожидании вашего WorkerApp. Это поддерживается в удалении сети .Net, но вам нужно создать два канала - один для исходящих вызовов (от Dashboard to WorkerApp), а затем другой для входящих обратных вызовов.

Еще одно предложение: ваш рабочий класс (тот, который получен из MarshalByRefObject) будет легче справиться, если вы также обнаружите интерфейс. Поместите этот интерфейс в DLL, доступный для обоих приложений, и жизнь будет проще.

+2

. NET Remoting не рекомендуется для новой разработки, [указать MSDN] (https://msdn.microsoft.com/en-us/library/kwdt6w2k (v = vs.100) .aspx): «* Этот раздел [. Net Remoting] относится к унаследованной технологии, которая сохраняется для обратной совместимости с существующими приложениями и не рекомендуется для новой разработки. Распределенные приложения теперь должны быть разработаны с использованием [Windows Communication Foundation (WCF)] (http://go.microsoft .com/fwlink /? LinkID = 127777). * « –

+0

WCF так же легко настраивается, как удаленная работа .NET, вы даже можете сделать это [без файлов конфигурации] (http://weblogs.asp.net/ralfw/a -truely-простой пример к получить стартер-с-ФОС). –

+0

@ScottChamberlain спасибо за ссылки, плохо проверьте их. – XenoPuTtSs

1

Одно из предложений может заключаться в использовании базы данных или другого постоянного хранилища для создания типа «очереди», на который панель инструментов может вставлять задачи. Это может также сохранять статусы о задачах, которые могут быть обновлены рабочим процессом. Хотя это можно считать «излишним», он приносит множество преимуществ, таких как аудит, историческая отчетность и избыточность серверов/выключение питания. Вероятно, это также упростит приложение в будущем.

Смежные вопросы