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);
        }