.NET channel messaging 공개 인터페이스¶
1. Node direct와 ChannelName¶
Node direct와 ChannelName은 서로 다른 handler family를 사용한다. Node direct context는 source RID를, ChannelName context는 logical membership을 제공한다.
public interface IZLinkMessageContext
{
string? MeshName { get; }
string? ChannelName { get; }
string PacketName { get; }
string? ContentType { get; }
ZLinkMessageMetadata Metadata { get; }
string? CorrelationId { get; }
}
public sealed class ZLinkRouteMessageContext : IZLinkMessageContext
{
public string? MeshName { get; }
public string? ChannelName { get; }
public string PacketName { get; }
public string? ContentType { get; }
public ZLinkMessageMetadata Metadata { get; }
public string? CorrelationId { get; }
public RoutingId SourceNodeRid { get; }
}
public sealed class ZLinkPublishMessageContext : IZLinkMessageContext
{
public string? MeshName { get; }
public string? ChannelName { get; }
public string PacketName { get; }
public string? ContentType { get; }
public ZLinkMessageMetadata Metadata { get; }
public string? CorrelationId { get; }
public string Topic { get; }
public string? Source { get; }
}
public interface IZLinkSendHandler<in TMessage>
{
ValueTask HandleAsync(
TMessage message,
IZLinkMessageContext context,
CancellationToken cancellationToken);
}
public interface IZLinkRequestHandler<in TRequest, TResponse>
{
ValueTask<TResponse> HandleAsync(
TRequest request,
IZLinkMessageContext context,
CancellationToken cancellationToken);
}
public interface IZLinkRouteSendHandler<in TMessage>
{
ValueTask HandleAsync(
TMessage message,
ZLinkRouteMessageContext context,
CancellationToken cancellationToken);
}
public interface IZLinkRouteRequestHandler<in TRequest, TReply>
{
ValueTask<TReply> HandleAsync(
TRequest request,
ZLinkRouteMessageContext context,
CancellationToken cancellationToken);
}
IZLinkSendHandler와 IZLinkRequestHandler는 Channel(channelName).Server() 또는
AddClientServerChannel(channelName).Server() builder에 등록한다.
IZLinkRouteSendHandler와 IZLinkRouteRequestHandler는 MeshNode builder에 등록한다. 같은 packet name을
두 family에 등록할 수 있으며 각 family 안의 중복 key는 startup 오류다.
Global DI client의 Node direct operation은 MeshName을 명시한다. Channel operation은 ChannelName 하나로 process-local RouteMesh 또는 ClientServer 송신 경로를 선택한다.
public interface IZLinkRouteClient
{
IZLinkSendCall SendToNode<TMessage>(
string meshName,
RoutingId targetNodeRid,
TMessage message);
IZLinkRequestCall RequestToNode<TRequest>(
string meshName,
RoutingId targetNodeRid,
TRequest request);
IZLinkSendCall SendToChannel<TMessage>(
string channelName,
TMessage message);
IZLinkRequestCall RequestToChannel<TRequest>(
string channelName,
TRequest request);
}
Channel target 선택과 local Server 처리는 Channel messaging과 ClientServer channel이 정한다.
Object Client에는 application Node direct handler를 등록할 수 없으며 해당 RID는 Node direct target이
아니다. Caller가 Object Client RID를 지정하면 다른 target으로 바꾸지 않고
ZLinkFrameworkErrorKind.NotFound로 끝낸다. Node direct 호출 자체는 두 Object Client 사이의
connection intent를 만들지 않는다. 다만 어느 한쪽에 RouteMesh Channel Server membership이 있으면
Channel traffic을 위해 peer connection을 유지한다.
IZLinkMessageContext는 nullable MeshName과 ChannelName을 제공한다. RouteMesh·Spot·Actor handler의
MeshName은 non-null이고 ClientServer·STREAM handler에서는 null이다. Channel handler의 ChannelName은
non-null이며 Node direct 전용 context만 MeshName과 source RID를 추가로 제공한다.
Logical Multicast subscription은 topic과 nullable source를 추가한 ZLinkPublishMessageContext를 사용한다.
Correlation ID는 request에서 non-null이고 send에서 null이며 Framework가 reply route와 함께 보존한다.
Classic fanout handler는 독립 fanout channel에서 받은 typed event만 처리한다.
public interface IZLinkFanoutClient
{
IZLinkFanoutPublishCall Publish<TEvent>(
string channelName,
TEvent message);
IZLinkFanoutPublishCall Publish<TEvent>(
string channelName,
string topic,
TEvent message);
}
public interface IZLinkFanoutHandler<in TEvent>
{
ValueTask HandleAsync(
TEvent message,
ZLinkPublishMessageContext context,
CancellationToken cancellationToken);
}
IZLinkFanoutClient.Publish(...)는 topic overload를 제공한다. Classic fanout의 publish 완료는 Submit과 completion §6이 정한다. 금지 topic은 Channel messaging §7에 따라 ArgumentException으로 표현한다.