이 개발자는 레거시 기술을 길들이고 통신 속도를 높이기위한 사용자 정의 프레임 워크를 구축했습니다.

이 개발자는 레거시 기술을 길들이고 통신 속도를 높이기위한 사용자 정의 프레임 워크를 구축했습니다.

레거시 구성 요소와 관련된 엔지니어링 시스템에서 작업하면서 오래된 요소를 최신 플랫폼과 통합하는 데 어려움을 겪습니다. 예를 들어, 32 비트 구성 요소에서만 열 수있는 쓸모없는 파일 형식에 대한 지원이 필요한 시나리오가 발생할 수 있습니다. 이 제한은 딜레마를 제시합니다. 구식 플랫폼에 남아 64 비트 주소 지정과 같은 현대적인 프레임 워크 장점을 앞두거나 기존 구성 요소의 논리를 기본 응용 프로그램이 통신하는 별도의 프로세스로 분리합니다.

동일한 컴퓨터에서 프로세스 간 통신 (IPC)을위한 다양한 시나리오가 있습니다.

  • 기본 시스템과는 다른 플랫폼을 위해 구축 된 구성 요소를 지원합니다.
  • 시스템 제한을 극복하기 위해 여러 병렬 독립 프로세스를 실행합니다.
  • 동시에 실행되는 여러 응용 프로그램간에 데이터 교환을 활성화합니다. 다른 많은 사람들.

왜 Witcom?

수년 동안 저는 유연성, 특히 로컬 상호 작용을위한 파이프와 같은 최적화 된 전송을 선택하는 데 대한 지원에 대한 WCF에 의존했습니다. 그러나 .NET 코어로 마이그레이션 할 때 WCF는 더 이상 완전히 사용할 수 없었습니다. 최근 .NET 버전은 WCF에 대한 지원을 다시 도입했지만 현재 상태는 확실하지 않습니다.

WCF의 눈에 띄는 기능 중 하나는 서비스 인터페이스를 정의 할 수있는 ServiceContract였습니다. 이 접근법은 개발을 단순화합니다. WCF 서비스를 통합하는 클라이언트는 필요한 래퍼 코드를 자동으로 생성하여 기능 이름 또는 매개 변수에 대한 추측을 제거합니다. 불행히도 SignalR과 GRPC는 모두 일반 텍스트 메소드 이름을 사용하여 메소드 호출을 요구하여 코드 유지 보수를 복잡하게합니다.

Witcom을 입력하십시오

몇 년 전, 나는 인터페이스를 사용하여 서비스를 정의하고 반사를 활용하여 서비스 측면에서 메소드를 포장하고 호출하는 IPCServiceFramework를 발견했습니다. 유망한 반면, 프로젝트는 더 이상 유지되지 않았습니다. 핵심 개념에서 영감을 얻은 저는 Witcom으로 진화 한 자체 구현을 개발했습니다.

Witcom은 .NET 용으로 설계된 WCF와 같은 통신 프레임 워크입니다. 이를 통해 개발자는 서비스 인터페이스를 정의하고 전송을 선택하며 최소한의 노력으로 전이중 커뮤니케이션을 설정할 수 있습니다. 지원되는 전송에는 명명 된 파이프, TCP 및 WebSocket과 같은 일반적인 옵션과 메모리 매핑 파일에 대한 고유 한 지원이 포함됩니다. 이를 통해 로컬 컴퓨터에서 초고속, 저도 이중 이중 통신을 가능하게하여 대량의 데이터를 최대한의 효율로 전송하는 데 이상적입니다.

예 : Witcom과의 프로세스 간 통신

Witcom Github 저장소에서 예제 구현을 찾을 수 있습니다.

1 단계 : 서비스 계약을 정의합니다

public interface IExampleService
{
    event ExampleServiceEventHandler ProcessingStarted;
    event ExampleServiceProgressEventHandler ProgressChanged;
    event ExampleServiceProcessingEventHandler ProcessingCompleted;

    bool StartProcessing();
    void StopProcessing();
}

public delegate void ExampleServiceEventHandler();
public delegate void ExampleServiceProgressEventHandler(double progress);
public delegate void ExampleServiceProcessingEventHandler(ProcessingStatus status);

Witcom은 모든 대의원 유형 (예 :, PropertyChangedEventHandler) 지원.

2 단계 : 에이전트에서 서비스를 구현하십시오

에이전트 프로세스는 서비스를 호스팅합니다.

public class ExampleService : IExampleService
{
    public event ExampleServiceEventHandler ProcessingStarted = delegate { };
    public event ExampleServiceProgressEventHandler ProgressChanged = delegate { };
    public event ExampleServiceProcessingEventHandler ProcessingCompleted = delegate { };

    private CancellationTokenSource? CancellationTokenSource { get; set; }

    public bool StartProcessing()
    {
        if (CancellationTokenSource != null) return false;

        CancellationTokenSource = new CancellationTokenSource();
        Task.Run(Process);

        ProcessingStarted();
        return true;
    }

    public void StopProcessing()
    {
        CancellationTokenSource?.Cancel();
    }

    private void Process()
    {
        ProcessingStatus status = ProcessingStatus.Success;
        for (int i = 1; i 

3 단계 : 에이전트 프로세스를 시작하십시오

호스트 프로세스는 에이전트를 별도의 프로세스로 시작하여 명령 줄 인수를 통해 통신 주소를 전달합니다. 예를 들어:

var process = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = "Agent.exe",
        Arguments = "--address=ExampleMemoryMap",
        UseShellExecute = false,
    }
};
process.Start();

4 단계 : 에이전트에서 서버를 시작합니다

에이전트는 서버를 시작하고 수신 된 주소를 사용하여 연결을 청소합니다.

var server = WitComServerBuilder.Build(options =>
{
    options.WithService(new ExampleService());
    options.WithMemoryMappedFile("ExampleMemoryMap");
    options.WithEncryption();
    options.WithJson();
    options.WithAccessToken("SecureAccessToken");
    options.WithTimeout(TimeSpan.FromSeconds(1));
});
server.StartWaitingForConnection();

5 단계 : 호스트에서 클라이언트를 만듭니다

호스트 프로세스는 에이전트에 연결됩니다.

var client = WitComClientBuilder.Build(options =>
{
    options.WithMemoryMappedFile("ExampleMemoryMap");
    options.WithEncryption();
    options.WithJson();
    options.WithAccessToken("SecureAccessToken");
    options.WithTimeout(TimeSpan.FromSeconds(1));
});

if (!await client.ConnectAsync(TimeSpan.FromSeconds(5), CancellationToken.None))
{
    Console.WriteLine("Failed to connect.");
    return;
}

var service = client.GetService();
service.ProcessingStarted += () => Console.WriteLine("Processing started!");
service.ProgressChanged += progress => Console.WriteLine($"Progress: {progress}%");
service.ProcessingCompleted += status => Console.WriteLine($"Processing completed: {status}");

Witcom의 주요 장점

  • 서비스 계약 : 깨끗하고 유지 관리 가능한 API의 서비스 인터페이스를 정의합니다.
  • 다중 전송 : 명명 된 파이프, TCP, WebSocket 또는 메모리 매핑 파일 중에서 선택하십시오.
  • 전이중 커뮤니케이션 : 이벤트 및 콜백은 기본적으로 지원됩니다.
  • 암호화 : AES/RSA 기반 암호화와의 보안 커뮤니케이션.
  • 승인 : 토큰 기반 인증은 승인 된 클라이언트 만 연결할 수 있도록합니다.
  • 고성능 : 메모리 매핑 된 파일을 사용하여 로컬 컴퓨터의 IPC를 최적화하십시오.
  • 쉬운 오류 처리 : WitcomeXceptionFault를 사용하여 통신 오류를 처리합니다.

결론

Witcom은 .NET에서 프로세스 간 통신을위한 강력하고 현대적인 대안으로 WCF의 최고의 기능을 현대적인 교통 옵션과 결합합니다. 자세한 내용은 Witcom의 문서를 방문하여 Github의 예제를 탐색하십시오.

출처 참조

Post Comment

당신은 놓쳤을 수도 있습니다