public async Task <string> OpenAsync(CancellationToken cancellationToken) { Logger.Log = m => ServiceEventSource.Current.ServiceMessage(context, m); var partitionInfo = await ServicePartitionQueryHelper .QueryServicePartitions(context.ServiceName, context.PartitionId) .ConfigureAwait(false); endpointConfiguration = new EndpointConfiguration("chocolateshipping"); #region Monitoring endpointConfiguration.SendHeartbeatTo(serviceControlQueue: "Particular.ServiceControl.RabbitMQ", frequency: TimeSpan.FromSeconds(5), timeToLive: TimeSpan.FromSeconds(15)); var hostInfo = endpointConfiguration.UniquelyIdentifyRunningInstance(); var instanceId = partitionInfo.LocalPartitionKey != null ? $"chocolateshipping-{partitionInfo.LocalPartitionKey}" : "chocolateshipping"; hostInfo.UsingCustomDisplayName(instanceId); hostInfo.UsingCustomIdentifier(DeterministicIdBuilder.ToGuid(instanceId)); var metrics = endpointConfiguration.EnableMetrics(); metrics.SendMetricDataToServiceControl(serviceControlMetricsAddress: "Particular.Monitoring.RabbitMQ", interval: TimeSpan.FromSeconds(5)); #endregion var transport = endpointConfiguration.ApplyCommonConfiguration(stateManager, servicePartitionInformation, context); ConfigureLocalPartitionsChocolateShipping(endpointConfiguration, partitionInfo); ConfigureReceiverSideDistributionShipOrder(transport, partitionInfo); return(null); }
// TODO: 3.6 - Receiver Side Distribution public async Task <string> OpenAsync(CancellationToken cancellationToken) { endpointConfiguration = new EndpointConfiguration("back-stateful"); var persistence = endpointConfiguration.UsePersistence <ServiceFabricPersistence>(); persistence.StateManager(stateManager); #region Not Important endpointConfiguration.SendFailedMessagesTo("error"); endpointConfiguration.AuditProcessedMessagesTo("audit"); endpointConfiguration.UseSerialization <JsonSerializer>(); endpointConfiguration.EnableInstallers(); var recoverability = endpointConfiguration.Recoverability(); recoverability.DisableLegacyRetriesSatellite(); // for demo purposes recoverability.Immediate(d => d.NumberOfRetries(5)); recoverability.Delayed(d => d.NumberOfRetries(0)); var connectionString = context.GetTransportConnectionString(); var transport = endpointConfiguration.UseTransport <RabbitMQTransport>(); transport.ConnectionString(connectionString); var delayedDelivery = transport.DelayedDelivery(); delayedDelivery.DisableTimeoutManager(); var routing = transport.Routing(); routing.RouteToEndpoint(typeof(UpdateOrderColdStorage), "back-cold"); endpointConfiguration.Notifications.Errors.MessageHasFailedAnImmediateRetryAttempt += (sender, args) => { args.Headers.TryGetValue(Headers.ProcessingEndpoint, out var endpointName); ServiceEventSource.Current.ServiceMessage(context, "{0} - {1}", endpointName ?? "back-stateful", args.Exception.Message); }; var assemblyScanner = endpointConfiguration.AssemblyScanner(); assemblyScanner.ExcludeAssemblies("netstandard"); #endregion var partitionInfo = await ServicePartitionQueryHelper.QueryServicePartitions(context.ServiceName, context.PartitionId); endpointConfiguration.RegisterPartitionsForThisEndpoint(partitionInfo.LocalPartitionKey?.ToString(), partitionInfo.Partitions.Select(k => k.LowKey.ToString()).ToArray()); endpointConfiguration.SendHeartbeatTo( serviceControlQueue: "Particular.ServiceControl.Rabbit", frequency: TimeSpan.FromSeconds(5), timeToLive: TimeSpan.FromSeconds(15)); var instanceId = partitionInfo.LocalPartitionKey.HasValue ? $"back-stateful-{partitionInfo.LocalPartitionKey}" : "back-stateful"; var hostInfo = endpointConfiguration.UniquelyIdentifyRunningInstance(); hostInfo.UsingCustomDisplayName(instanceId); hostInfo.UsingCustomIdentifier(DeterministicIdBuilder.ToGuid(instanceId)); var metrics = endpointConfiguration.EnableMetrics(); metrics.SendMetricDataToServiceControl( serviceControlMetricsAddress: "Particular.Monitoring.RabbitMQ", interval: TimeSpan.FromSeconds(5), instanceId: instanceId); string ConvertOrderIdToPartitionLowKey(Guid orderId) { var key = CRC64.ToCRC64(orderId.ToByteArray()); var partition = partitionInfo.Partitions.Single(p => p.LowKey <= key && p.HighKey >= key); return(partition.LowKey.ToString()); } var receiverSideDistribution = routing.EnableReceiverSideDistribution(partitionInfo.Partitions.Select(k => k.LowKey.ToString()).ToArray()); receiverSideDistribution.AddPartitionMappingForMessageType <OrderAccepted>(msg => ConvertOrderIdToPartitionLowKey(msg.OrderId)); receiverSideDistribution.AddPartitionMappingForMessageType <OrderCanceled>(msg => ConvertOrderIdToPartitionLowKey(msg.OrderId)); receiverSideDistribution.AddPartitionMappingForMessageType <OrderCreated>(msg => ConvertOrderIdToPartitionLowKey(msg.OrderId)); return(string.Empty); }
// TODO: 3.5 - Sender Side Distribution public static void AddNServiceBus(this IServiceCollection services) { var endpointConfiguration = new EndpointConfiguration("front-stateful"); #region Not Important endpointConfiguration.UseSerialization <JsonSerializer>(); endpointConfiguration.EnableInstallers(); endpointConfiguration.SendOnly(); var provider = services.BuildServiceProvider(); var context = provider.GetService <StatelessServiceContext>(); var connectionString = context.GetTransportConnectionString(); var transport = endpointConfiguration.UseTransport <RabbitMQTransport>(); transport.ConnectionString(connectionString); var delayedDelivery = transport.DelayedDelivery(); delayedDelivery.DisableTimeoutManager(); var assemblyScanner = endpointConfiguration.AssemblyScanner(); assemblyScanner.ExcludeAssemblies("netstandard"); #endregion var routing = transport.Routing(); var backStateful = "back-stateful"; routing.RouteToEndpoint(typeof(SubmitOrder), backStateful); routing.RouteToEndpoint(typeof(CancelOrder), backStateful); var uriBuilder = new ServiceUriBuilder("Back_Stateful"); var backServiceUri = uriBuilder.Build(); var partitionInfo = ServicePartitionQueryHelper.QueryServicePartitions(backServiceUri, Guid.Empty).GetAwaiter().GetResult(); endpointConfiguration.SendHeartbeatTo( serviceControlQueue: "Particular.ServiceControl.Rabbit", frequency: TimeSpan.FromSeconds(5), timeToLive: TimeSpan.FromSeconds(15)); var instanceId = partitionInfo.LocalPartitionKey.HasValue ? $"front-stateful-{partitionInfo.LocalPartitionKey}" : "front-stateful"; var hostInfo = endpointConfiguration.UniquelyIdentifyRunningInstance(); hostInfo.UsingCustomDisplayName(instanceId); hostInfo.UsingCustomIdentifier(DeterministicIdBuilder.ToGuid(instanceId)); string ConvertOrderIdToPartitionLowKey(Guid orderId) { var key = CRC64.ToCRC64(orderId.ToByteArray()); var partition = partitionInfo.Partitions.Single(p => p.LowKey <= key && p.HighKey >= key); return(partition.LowKey.ToString()); } var senderSideDistribution = routing.RegisterPartitionedDestinationEndpoint(backStateful, partitionInfo.Partitions.Select(k => k.LowKey.ToString()).ToArray()); senderSideDistribution.AddPartitionMappingForMessageType <SubmitOrder>(msg => ConvertOrderIdToPartitionLowKey(msg.OrderId)); senderSideDistribution.AddPartitionMappingForMessageType <CancelOrder>(msg => ConvertOrderIdToPartitionLowKey(msg.OrderId)); var endpointInstance = Endpoint.Start(endpointConfiguration).GetAwaiter().GetResult(); services.AddSingleton <IMessageSession>(endpointInstance); }