Files
natsnet/dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.JetStreamClusterConsumers.cs

91 lines
2.8 KiB
C#

using System.Text;
namespace ZB.MOM.NatsNet.Server;
public sealed partial class NatsServer
{
internal void SendDomainLeaderElectAdvisory()
{
var (_, cluster) = GetJetStreamCluster();
var meta = cluster?.Meta;
if (meta == null)
return;
Noticef(
"JetStream domain leader elected advisory for leader {0} in cluster {1}",
meta.GroupLeader(),
CachedClusterName());
}
internal void SendConsumerLostQuorumAdvisory(NatsConsumer? consumer)
{
if (consumer == null || !consumer.ShouldSendLostQuorum())
return;
Noticef("JetStream consumer lost quorum advisory for consumer {0} on stream {1}", consumer.Name, consumer.Stream);
}
internal void SendConsumerLeaderElectAdvisory(NatsConsumer? consumer)
{
if (consumer == null)
return;
Noticef("JetStream consumer leader elected advisory for consumer {0} on stream {1}", consumer.Name, consumer.Stream);
}
internal void JsClusteredStreamRequest(
ClientInfo clientInfo,
Account account,
string subject,
string reply,
byte[] rawMessage,
StreamConfigRequest configRequest)
{
var (js, cluster) = GetJetStreamCluster();
if (js == null || cluster == null)
return;
var cfg = configRequest.Config;
var engine = new JetStreamEngine(js);
var limitsError = engine.JsClusteredStreamLimitsCheck(account, cfg);
if (limitsError != null)
{
var response = new ApiResponse
{
Type = JsApiSubjects.JsApiStreamCreateResponseType,
Error = limitsError,
};
SendAPIErrResponse(clientInfo, account, subject, reply, string.Empty, JsonResponse(response));
return;
}
var (group, createError) = engine.CreateGroupForStream(clientInfo, cfg);
if (group == null || createError != null)
{
var response = new ApiResponse
{
Type = JsApiSubjects.JsApiStreamCreateResponseType,
Error = JsApiErrors.NewJSClusterNoPeersError(createError ?? new SelectPeerError { Misc = true }),
};
SendAPIErrResponse(clientInfo, account, subject, reply, string.Empty, JsonResponse(response));
return;
}
var assignment = new StreamAssignment
{
Group = group,
Config = cfg,
Subject = subject,
Reply = reply,
Client = clientInfo,
Created = DateTime.UtcNow,
};
if (cluster.Meta != null)
{
cluster.Meta.Propose(Encoding.UTF8.GetBytes($"create-stream:{account.Name}:{cfg.Name}"));
cluster.TrackInflightStreamProposal(account.Name, assignment, deleted: false);
}
}
}