Ejemplo n.º 1
0
        /// <summary>
        /// Specify a concurrency limit for tasks executing through the filter. No more than the specified
        /// number of tasks will be allowed to execute concurrently.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="configurator"></param>
        /// <param name="partitioner">An existing partitioner that is shared</param>
        /// <param name="keyProvider">Provides the key from the message</param>
        /// <param name="encoding"></param>
        public static void UsePartitioner <T>(this IPipeConfigurator <T> configurator, IPartitioner partitioner, Func <T, string> keyProvider,
                                              Encoding encoding = null)
            where T : class, PipeContext
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }
            if (partitioner == null)
            {
                throw new ArgumentNullException(nameof(partitioner));
            }
            if (keyProvider == null)
            {
                throw new ArgumentNullException(nameof(keyProvider));
            }

            var textEncoding = encoding ?? Encoding.UTF8;

            PartitionKeyProvider <T> provider = context =>
            {
                var key = keyProvider(context) ?? "";
                return(textEncoding.GetBytes(key));
            };

            var specification = new PartitionerPipeSpecification <T>(provider, partitioner);

            configurator.AddPipeSpecification(specification);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Specify a concurrency limit for tasks executing through the filter. No more than the specified
        /// number of tasks will be allowed to execute concurrently.
        /// </summary>
        /// <typeparam name="TActivity"></typeparam>
        /// <typeparam name="TLog"></typeparam>
        /// <param name="configurator"></param>
        /// <param name="partitionCount">The number of partitions to use when distributing message delivery</param>
        /// <param name="keyProvider">Provides the key from the message</param>
        /// <param name="encoding">The text encoding to use to convert the string to byte[] (defaults to UTF8)</param>
        public static void UsePartitioner <TActivity, TLog>(this IPipeConfigurator <CompensateActivityContext <TActivity, TLog> > configurator,
                                                            int partitionCount, Func <CompensateActivityContext <TActivity, TLog>, string> keyProvider, Encoding encoding = null)
            where TActivity : class, CompensateActivity <TLog>
            where TLog : class
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }
            if (keyProvider == null)
            {
                throw new ArgumentNullException(nameof(keyProvider));
            }

            var textEncoding = encoding ?? Encoding.UTF8;

            PartitionKeyProvider <CompensateActivityContext <TActivity, TLog> > provider = context =>
            {
                var key = keyProvider(context) ?? "";
                return(textEncoding.GetBytes(key));
            };

            var specification = new PartitionerPipeSpecification <CompensateActivityContext <TActivity, TLog> >(provider, partitionCount);

            configurator.AddPipeSpecification(specification);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Specify a concurrency limit for tasks executing through the filter. No more than the specified
        /// number of tasks will be allowed to execute concurrently.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="configurator"></param>
        /// <param name="partitioner">An existing partitioner that is shared</param>
        /// <param name="keyProvider">Provides the key from the message</param>
        public static void UsePartitioner <T>(this IPipeConfigurator <T> configurator, IPartitioner partitioner, Func <T, long> keyProvider)
            where T : class, PipeContext
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }
            if (partitioner == null)
            {
                throw new ArgumentNullException(nameof(partitioner));
            }
            if (keyProvider == null)
            {
                throw new ArgumentNullException(nameof(keyProvider));
            }

            PartitionKeyProvider <T> provider = context =>
            {
                var key = keyProvider(context);
                return(BitConverter.GetBytes(key));
            };

            var specification = new PartitionerPipeSpecification <T>(provider, partitioner);

            configurator.AddPipeSpecification(specification);
        }
Ejemplo n.º 4
0
 private MessageTable GetMessage(MessageRequest message)
 {
     return(new MessageTable(PartitionKeyProvider.GetPartitionKey(DateTime.UtcNow), message.Id.ToString())
     {
         Message = message.Message
     });
 }
        static void UseConsumerPartitioner <TConsumer>(IPipeConfigurator <ConsumerConsumeContext <TConsumer> > configurator, int partitionCount,
                                                       PartitionKeyProvider <ConsumerConsumeContext <TConsumer> > keyProvider)
            where TConsumer : class
        {
            var partitioner = new Partitioner(partitionCount, new Murmur3UnsafeHashGenerator());

            var specification = new PartitionConsumerSpecification <TConsumer>(partitioner, keyProvider);

            configurator.AddPipeSpecification(specification);
        }
        static void UseSagaPartitioner <TSaga>(IPipeConfigurator <SagaConsumeContext <TSaga> > configurator, int partitionCount,
                                               PartitionKeyProvider <SagaConsumeContext <TSaga> > keyProvider)
            where TSaga : class, ISaga
        {
            var partitioner = new Partitioner(partitionCount, new Murmur3UnsafeHashGenerator());

            var specification = new PartitionSagaSpecification <TSaga>(partitioner, keyProvider);

            configurator.AddPipeSpecification(specification);
        }
        public PartitionConsumerSpecification(IPartitioner partitioner, PartitionKeyProvider <ConsumerConsumeContext <TConsumer> > keyProvider)
        {
            if (partitioner == null)
            {
                throw new ArgumentNullException(nameof(partitioner));
            }
            if (keyProvider == null)
            {
                throw new ArgumentNullException(nameof(keyProvider));
            }

            _partitioner = partitioner;
            _keyProvider = keyProvider;
        }
Ejemplo n.º 8
0
 public IEnumerable <ValidationResult> Validate()
 {
     if (GlobalTopology.Send.GetMessageTopology <T>().TryGetConvention(out ICorrelationIdMessageSendTopologyConvention <T> convention) &&
         convention.TryGetMessageCorrelationId(out IMessageCorrelationId <T> messageCorrelationId))
     {
         _keyProvider = context => messageCorrelationId.TryGetCorrelationId(context.Message, out var correlationId)
             ? correlationId.ToByteArray()
             : default(Guid).ToByteArray();
     }
     else
     {
         yield return(this.Failure("Partition", TypeMetadataCache <T> .ShortName, "A CorrelationId convention for this message type was not found."));
     }
 }
Ejemplo n.º 9
0
        public PartitionFilter(int partitionCount, PartitionKeyProvider <ConsumeContext <TMessage> > keyProvider, IHashGenerator hashGenerator)
        {
            _partitionCount = partitionCount;
            _keyProvider    = keyProvider;
            _hashGenerator  = hashGenerator;

            var mediator = new Mediator <IConcurrencyLimitFilter>();

            _partitions = Enumerable.Range(0, partitionCount)
                          .Select(index => new ConcurrencyLimitFilter <ConsumeContext <TMessage> >(1, mediator))
                          .Cast <IFilter <ConsumeContext <TMessage> > >()
                          .ToArray();

            _attemptCount = new long[partitionCount];
            _successCount = new long[partitionCount];
            _failureCount = new long[partitionCount];
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Specify a concurrency limit for tasks executing through the filter. No more than the specified
        /// number of tasks will be allowed to execute concurrently.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="configurator"></param>
        /// <param name="partitionCount">The number of partitions to use when distributing message delivery</param>
        /// <param name="keyProvider">Provides the key from the message</param>
        public static void UsePartitioner <T>(this IPipeConfigurator <T> configurator, int partitionCount, Func <T, Guid> keyProvider)
            where T : class, PipeContext
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }
            if (keyProvider == null)
            {
                throw new ArgumentNullException(nameof(keyProvider));
            }

            PartitionKeyProvider <T> provider = context => keyProvider(context).ToByteArray();

            var specification = new PartitionerPipeSpecification <T>(provider, partitionCount);

            configurator.AddPipeSpecification(specification);
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Specify a concurrency limit for tasks executing through the filter. No more than the specified
        /// number of tasks will be allowed to execute concurrently.
        /// </summary>
        /// <typeparam name="TActivity"></typeparam>
        /// <typeparam name="TLog"></typeparam>
        /// <param name="configurator"></param>
        /// <param name="partitionCount">The number of partitions to use when distributing message delivery</param>
        /// <param name="keyProvider">Provides the key from the message</param>
        public static void UsePartitioner <TActivity, TLog>(this IPipeConfigurator <CompensateActivityContext <TActivity, TLog> > configurator,
                                                            int partitionCount, Func <CompensateActivityContext <TActivity, TLog>, Guid> keyProvider)
            where TActivity : class, CompensateActivity <TLog>
            where TLog : class
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }
            if (keyProvider == null)
            {
                throw new ArgumentNullException(nameof(keyProvider));
            }

            PartitionKeyProvider <CompensateActivityContext <TActivity, TLog> > provider = context => keyProvider(context).ToByteArray();

            var specification = new PartitionerPipeSpecification <CompensateActivityContext <TActivity, TLog> >(provider, partitionCount);

            configurator.AddPipeSpecification(specification);
        }
Ejemplo n.º 12
0
 public CosmosDbCollection(ICosmosDb cosmosDb, ICosmosDbCollectionConfig config, PartitionKeyProvider <TModel> partitionKeyProvider = null)
 {
     if (cosmosDb == null)
     {
         throw new ArgumentNullException(nameof(cosmosDb));
     }
     if (config == null)
     {
         throw new ArgumentNullException(nameof(config));
     }
     if (config.DatabaseId == null)
     {
         throw new ArgumentNullException($"Missing configuration for DatabaseId: {this.GetType().Name} ");
     }
     if (config.ContainerId == null)
     {
         throw new ArgumentNullException($"Missing configuration for ContainerId: {this.GetType().Name} ");
     }
     this.cosmosDb             = cosmosDb;
     this.config               = config;
     this.partitionKeyProvider = partitionKeyProvider;
 }
Ejemplo n.º 13
0
        /// <summary>
        /// Specify a concurrency limit for tasks executing through the filter. No more than the specified
        /// number of tasks will be allowed to execute concurrently.
        /// </summary>
        /// <typeparam name="TActivity"></typeparam>
        /// <typeparam name="TArguments"></typeparam>
        /// <param name="configurator"></param>
        /// <param name="partitioner">An existing partitioner to share</param>
        /// <param name="keyProvider">Provides the key from the message</param>
        public static void UsePartitioner <TActivity, TArguments>(this IPipeConfigurator <ExecuteActivityContext <TActivity, TArguments> > configurator,
                                                                  IPartitioner partitioner, Func <ExecuteActivityContext <TActivity, TArguments>, Guid> keyProvider)
            where TActivity : class, ExecuteActivity <TArguments>
            where TArguments : class
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }
            if (partitioner == null)
            {
                throw new ArgumentNullException(nameof(partitioner));
            }
            if (keyProvider == null)
            {
                throw new ArgumentNullException(nameof(keyProvider));
            }

            PartitionKeyProvider <ExecuteActivityContext <TActivity, TArguments> > provider = context => keyProvider(context).ToByteArray();

            var specification = new PartitionerPipeSpecification <ExecuteActivityContext <TActivity, TArguments> >(provider, partitioner);

            configurator.AddPipeSpecification(specification);
        }
Ejemplo n.º 14
0
 public PartitionFilter(PartitionKeyProvider <ConsumeContext <TMessage> > keyProvider, IPartitioner partitioner)
 {
     _partitioner = partitioner.GetPartitioner(keyProvider);
 }
Ejemplo n.º 15
0
 public async Task MessageCleanupAsync([TimerTrigger("%TimerScheduleExpression%")] TimerInfo myTimer, ILogger log)
 {
     log.LogInformation($"Timer trigger function executed at: {DateTime.Now}");
     await this.messageService.CleanupAsync("Messages", PartitionKeyProvider.GetPartitionKey(DateTime.UtcNow.AddDays(-1)));
 }
Ejemplo n.º 16
0
 public ContextPartitioner(Partitioner partitioner, PartitionKeyProvider <T> keyProvider)
 {
     _partitioner = partitioner;
     _keyProvider = keyProvider;
 }
Ejemplo n.º 17
0
 IPartitioner <T> IPartitioner.GetPartitioner <T>(PartitionKeyProvider <T> keyProvider)
 {
     return(new ContextPartitioner <T>(this, keyProvider));
 }
Ejemplo n.º 18
0
 IPartitioner <T> IPartitioner.GetPartitioner <T>(PartitionKeyProvider <T> keyProvider)
 => new ContextPartitioner <T>(this, keyProvider);
Ejemplo n.º 19
0
        public PartitionerPipeSpecification(PartitionKeyProvider <ConsumeContext <TMessage> > keyProvider, IPartitioner partitioner)
        {
            _keyProvider = keyProvider;

            _partitioner = partitioner;
        }
Ejemplo n.º 20
0
        public PartitionerPipeSpecification(PartitionKeyProvider <ConsumeContext <TMessage> > keyProvider, int partitionCount)
        {
            _keyProvider = keyProvider;

            _partitionCount = partitionCount;
        }
        public PartitionerPipeSpecification(PartitionKeyProvider <T> keyProvider, int partitionCount)
        {
            _keyProvider = keyProvider;

            _partitionCount = partitionCount;
        }
        public PartitionerPipeSpecification(PartitionKeyProvider <T> keyProvider, IPartitioner partitioner)
        {
            _keyProvider = keyProvider;

            _partitioner = partitioner;
        }
Ejemplo n.º 23
0
 public PartitionFilter(PartitionKeyProvider <TContext> keyProvider, IPartitioner partitioner)
 {
     _partitioner = partitioner.GetPartitioner(keyProvider);
 }