Esempio n. 1
0
        public async Task TestSimpleConsumerWorksOk()
        {
            var keySerializer      = new NullSerializer <object>();
            var valueSerializer    = new StringSerializer();
            var messagePartitioner = new LoadBalancedPartitioner <object>();

            using (var temporaryTopic = testCluster.CreateTemporaryTopic())
                using (var brokers = new KafkaBrokers(testCluster.CreateBrokerUris()))
                {
                    var topic    = temporaryTopic.Name;
                    var producer = KafkaProducer.Create(brokers, keySerializer, valueSerializer, messagePartitioner);
                    var consumer = KafkaConsumer.Create(defaultConsumerGroup, brokers, keySerializer, valueSerializer,
                                                        new TopicSelector {
                        Partition = 0, Topic = topic
                    });

                    await producer.SendAsync(KeyedMessage.Create(topic, "Message"), CancellationToken.None);

                    var responses = await consumer.ReceiveAsync(CancellationToken.None);

                    Assert.That(responses, Is.Not.Null);
                    Assert.That(responses, Has.Count.EqualTo(1));

                    var first = responses.First();
                    Assert.That(first.Key, Is.Null);
                    Assert.That(first.Offset, Is.EqualTo(0));
                    Assert.That(first.Partition, Is.EqualTo(0));
                    Assert.That(first.Topic, Is.EqualTo(topic));
                    Assert.That(first.Value, Is.EqualTo("Message"));
                }
        }
Esempio n. 2
0
        public async Task ProduceToMultiplePartitions(int numberOfPartitions, int numberOfKeys, int numberOfMessages)
        {
            var keySerializer      = new Int32Serializer();
            var valueSerializer    = new StringSerializer();
            var messagePartitioner = new Int32Partitioner();

            using (var temporaryTopic = testCluster.CreateTemporaryTopic(partitions: 2))
                using (var brokers = new KafkaBrokers(testCluster.CreateBrokerUris()))
                {
                    var topic = temporaryTopic.Name;
                    {
                        var producer = KafkaProducer.Create(brokers, keySerializer, valueSerializer, messagePartitioner);
                        var messages =
                            Enumerable
                            .Range(0, numberOfMessages)
                            .Select(i => KeyedMessage.Create(topic, i % numberOfKeys, i % numberOfPartitions, "Message " + i));
                        await producer.SendAsync(messages, CancellationToken.None);
                    }

                    {
                        var selectors =
                            Enumerable
                            .Range(0, numberOfPartitions)
                            .Select(partition => new TopicSelector {
                            Partition = partition, Topic = topic
                        })
                            .ToArray();
                        var consumer = KafkaConsumer.Create(defaultConsumerGroup, brokers, keySerializer, valueSerializer, selectors);

                        var responses = await consumer.ReceiveAsync(CancellationToken.None);

                        Assert.That(responses, Has.Count.EqualTo(numberOfMessages));
                        var received = new bool[numberOfMessages];
                        var offsets  = new long[numberOfPartitions];
                        foreach (var response in responses)
                        {
                            var split = response.Value.Split(' ');
                            Assert.That(split, Has.Length.EqualTo(2));
                            Assert.That(split[0], Is.EqualTo("Message"));
                            int messageNumber;
                            var parsed = Int32.TryParse(split[1], out messageNumber);
                            Assert.That(parsed, Is.True);
                            Assert.That(messageNumber, Is.InRange(0, numberOfMessages - 1));
                            var key = messageNumber % numberOfKeys;
                            Assert.That(response.Key, Is.EqualTo(key));

                            var partition = messageNumber % numberOfPartitions;
                            Assert.That(response.Partition, Is.EqualTo(partition));

                            Assert.That(received[messageNumber], Is.False);
                            received[messageNumber] = true;

                            Assert.That(response.Offset, Is.EqualTo(offsets[response.Partition]));
                            offsets[response.Partition] += 1;

                            Assert.That(response.Topic, Is.EqualTo(topic));
                        }
                    }
                }
        }
Esempio n. 3
0
        public async Task VerifyABrokerStoppingAndRestartingCanBeHandledByTheConsumer()
        {
            using (var cluster = new KafkaTestCluster("server.home", 1))
            {
                var topic = "test";
                cluster.CreateTopic(topic);
                using (var brokers = new KafkaBrokers(cluster.CreateBrokerUris()))
                {
                    var producer = KafkaProducer.Create(brokers, new StringSerializer());
                    await producer.SendAsync(KeyedMessage.Create(topic, "Test"), CancellationToken.None);

                    await Task.Delay(1000);

                    cluster.StopKafkaBroker(0);
                    cluster.RestartKafkaBroker(0);

                    var consumer = KafkaConsumer.Create(topic, brokers, new StringSerializer(),
                                                        new TopicSelector {
                        Topic = topic, Partition = 0, Offset = 0
                    });
                    var result = await consumer.ReceiveAsync(CancellationToken.None);

                    Assert.That(result, Has.Count.EqualTo(1));
                    var first = result[0];

                    Assert.That(first.Value, Is.EqualTo("Test"));
                    Assert.That(first.Offset, Is.EqualTo(0));
                }
                cluster.DeleteTopic(topic);
            }
        }
        public DefaultKafkaConsumerProvider(KafkaConsumerOptions kafkaConsumerOptions, Action <RecieveResult> onMessageRecieved)
        {
            this.kafkaConsumerOptions = kafkaConsumerOptions;
            this.onMessageRecieved    = onMessageRecieved;

            Consumer = KafkaConsumer.Create(kafkaConsumerOptions.GroupId, kafkaConsumerOptions);
            Consumer.EnableAutoCommit = kafkaConsumerOptions.EnableAutoCommit;
        }
Esempio n. 5
0
        public async Task ProduceToTwoPartitions()
        {
            var keySerializer      = new Int32Serializer();
            var valueSerializer    = new StringSerializer();
            var messagePartitioner = new Int32Partitioner();

            using (var temporaryTopic = testCluster.CreateTemporaryTopic(partitions: 2))
                using (var brokers = new KafkaBrokers(testCluster.CreateBrokerUris()))
                {
                    var topic     = temporaryTopic.Name;
                    var producer  = KafkaProducer.Create(brokers, keySerializer, valueSerializer, messagePartitioner);
                    var consumers = new[] {
                        KafkaConsumer.Create(defaultConsumerGroup, brokers, keySerializer, valueSerializer,
                                             new TopicSelector {
                            Partition = 0, Topic = topic
                        }),
                        KafkaConsumer.Create(defaultConsumerGroup, brokers, keySerializer, valueSerializer,
                                             new TopicSelector {
                            Partition = 1, Topic = topic
                        })
                    };


                    await producer.SendAsync(new[] {
                        KeyedMessage.Create(topic, 0, "Message to partition 0"),
                        KeyedMessage.Create(topic, 1, "Message to partition 1")
                    }, CancellationToken.None);

                    for (var i = 0; i < consumers.Length; i++)
                    {
                        var responses = await consumers[i].ReceiveAsync(CancellationToken.None);
                        Assert.That(responses, Is.Not.Null);
                        Assert.That(responses, Has.Count.EqualTo(1));

                        var first = responses.First();
                        Assert.That(first.Offset, Is.EqualTo(0));
                        Assert.That(first.Partition, Is.EqualTo(i));
                        Assert.That(first.Key, Is.EqualTo(i));
                        Assert.That(first.Topic, Is.EqualTo(topic));
                        Assert.That(first.Value, Is.EqualTo("Message to partition " + i));
                    }
                }
        }
Esempio n. 6
0
        public async Task TestProducing3MessagesAllowsTheConsumerToChooseTheCorrectMessage()
        {
            var valueSerializer = new StringSerializer();

            using (var temporaryTopic = testCluster.CreateTemporaryTopic())
                using (var brokers = new KafkaBrokers(testCluster.CreateBrokerUris()))
                {
                    var topic = temporaryTopic.Name;
                    {
                        var producer = KafkaProducer.Create(brokers, valueSerializer);

                        await producer.SendAsync(new[] {
                            KeyedMessage.Create(topic, "1"),
                            KeyedMessage.Create(topic, "2"),
                            KeyedMessage.Create(topic, "3"),
                        }, CancellationToken.None);
                    }

                    {
                        var earliest = KafkaConsumer.Create(defaultConsumerGroup, brokers, valueSerializer,
                                                            new TopicSelector {
                            Partition = 0, Topic = topic, DefaultOffsetSelection = OffsetSelectionStrategy.Earliest
                        });

                        var responses = await earliest.ReceiveAsync(CancellationToken.None);

                        Assert.That(responses, Is.Not.Null);
                        Assert.That(responses, Has.Count.EqualTo(3));

                        var first = responses.First();
                        Assert.That(first.Key, Is.Null);
                        Assert.That(first.Offset, Is.EqualTo(0));
                        Assert.That(first.Partition, Is.EqualTo(0));
                        Assert.That(first.Topic, Is.EqualTo(topic));
                        Assert.That(first.Value, Is.EqualTo("1"));
                    }

                    {
                        var latest = KafkaConsumer.Create(defaultConsumerGroup, brokers, valueSerializer,
                                                          new TopicSelector {
                            Partition = 0, Topic = topic, DefaultOffsetSelection = OffsetSelectionStrategy.Last
                        });

                        var responses = await latest.ReceiveAsync(CancellationToken.None);

                        Assert.That(responses, Is.Not.Null);
                        Assert.That(responses, Has.Count.EqualTo(1));

                        var first = responses.First();
                        Assert.That(first.Key, Is.Null);
                        Assert.That(first.Offset, Is.EqualTo(2));
                        Assert.That(first.Partition, Is.EqualTo(0));
                        Assert.That(first.Topic, Is.EqualTo(topic));
                        Assert.That(first.Value, Is.EqualTo("3"));
                    }

                    {
                        var latest = KafkaConsumer.Create(defaultConsumerGroup, brokers, valueSerializer,
                                                          new TopicSelector {
                            Partition = 0, Topic = topic, DefaultOffsetSelection = OffsetSelectionStrategy.Next
                        });

                        var responses = await latest.ReceiveAsync(CancellationToken.None);

                        Assert.That(responses, Is.Not.Null);
                        Assert.That(responses, Has.Count.EqualTo(0));
                    }

                    {
                        var specified = KafkaConsumer.Create(defaultConsumerGroup, brokers, valueSerializer,
                                                             new TopicSelector {
                            Partition = 0, Topic = topic, DefaultOffsetSelection = OffsetSelectionStrategy.Specified, Offset = 1
                        });

                        var responses = await specified.ReceiveAsync(CancellationToken.None);

                        Assert.That(responses, Is.Not.Null);
                        Assert.That(responses, Has.Count.EqualTo(2));

                        var first = responses.First();
                        Assert.That(first.Key, Is.Null);
                        Assert.That(first.Offset, Is.EqualTo(1));
                        Assert.That(first.Partition, Is.EqualTo(0));
                        Assert.That(first.Topic, Is.EqualTo(topic));
                        Assert.That(first.Value, Is.EqualTo("2"));
                    }
                }
        }
Esempio n. 7
0
        public async Task TestProducing3MessagesAllowsTheConsumerToCommitAndRestart()
        {
            var valueSerializer = new StringSerializer();

            using (var temporaryTopic = testCluster.CreateTemporaryTopic())
                using (var brokers = new KafkaBrokers(testCluster.CreateBrokerUris()))
                {
                    var topic = temporaryTopic.Name;
                    {
                        var producer = KafkaProducer.Create(brokers, valueSerializer);

                        await producer.SendAsync(new[] {
                            KeyedMessage.Create(topic, "1"),
                            KeyedMessage.Create(topic, "2"),
                            KeyedMessage.Create(topic, "3"),
                        }, CancellationToken.None);
                    }

                    {
                        var noPreviousCommits = KafkaConsumer.Create(defaultConsumerGroup, brokers, valueSerializer,
                                                                     new TopicSelector {
                            Partition = 0, Topic = topic,
                            DefaultOffsetSelection = OffsetSelectionStrategy.NextUncommitted,
                            FailureOffsetSelection = OffsetSelectionStrategy.Earliest
                        });

                        var responses = await noPreviousCommits.ReceiveAsync(CancellationToken.None);

                        Assert.That(responses, Is.Not.Null);
                        Assert.That(responses, Has.Count.EqualTo(3));

                        var first = responses.First();
                        Assert.That(first.Key, Is.Null);
                        Assert.That(first.Offset, Is.EqualTo(0));
                        Assert.That(first.Partition, Is.EqualTo(0));
                        Assert.That(first.Topic, Is.EqualTo(topic));
                        Assert.That(first.Value, Is.EqualTo("1"));

                        await noPreviousCommits.CommitAsync(new[] {
                            new TopicPartitionOffset {
                                Topic = topic, Partition = 0, Offset = 0
                            }
                        }, CancellationToken.None);;
                    }

                    {
                        var previousCommit = KafkaConsumer.Create(defaultConsumerGroup, brokers, valueSerializer,
                                                                  new TopicSelector
                        {
                            Partition = 0,
                            Topic     = topic,
                            DefaultOffsetSelection = OffsetSelectionStrategy.NextUncommitted,
                            FailureOffsetSelection = OffsetSelectionStrategy.Earliest
                        });

                        var responses = await previousCommit.ReceiveAsync(CancellationToken.None);

                        Assert.That(responses, Is.Not.Null);
                        Assert.That(responses, Has.Count.EqualTo(2));

                        var first = responses.First();
                        Assert.That(first.Key, Is.Null);
                        Assert.That(first.Offset, Is.EqualTo(1));
                        Assert.That(first.Partition, Is.EqualTo(0));
                        Assert.That(first.Topic, Is.EqualTo(topic));
                        Assert.That(first.Value, Is.EqualTo("2"));
                    }

                    {
                        var previousCommitAgain = KafkaConsumer.Create(defaultConsumerGroup, brokers, valueSerializer,
                                                                       new TopicSelector
                        {
                            Partition = 0,
                            Topic     = topic,
                            DefaultOffsetSelection = OffsetSelectionStrategy.NextUncommitted,
                            FailureOffsetSelection = OffsetSelectionStrategy.Earliest
                        });

                        var responses = await previousCommitAgain.ReceiveAsync(CancellationToken.None);

                        Assert.That(responses, Is.Not.Null);
                        Assert.That(responses, Has.Count.EqualTo(2));

                        var first = responses.First();
                        Assert.That(first.Key, Is.Null);
                        Assert.That(first.Offset, Is.EqualTo(1));
                        Assert.That(first.Partition, Is.EqualTo(0));
                        Assert.That(first.Topic, Is.EqualTo(topic));
                        Assert.That(first.Value, Is.EqualTo("2"));

                        await previousCommitAgain.CommitAsync(new[] {
                            new TopicPartitionOffset {
                                Topic = topic, Partition = 0, Offset = 1
                            }
                        }, CancellationToken.None);;
                    }

                    {
                        var secondCommit = KafkaConsumer.Create(defaultConsumerGroup, brokers, valueSerializer,
                                                                new TopicSelector
                        {
                            Partition = 0,
                            Topic     = topic,
                            DefaultOffsetSelection = OffsetSelectionStrategy.NextUncommitted,
                            FailureOffsetSelection = OffsetSelectionStrategy.Earliest
                        });

                        var responses = await secondCommit.ReceiveAsync(CancellationToken.None);

                        Assert.That(responses, Is.Not.Null);
                        Assert.That(responses, Has.Count.EqualTo(1));

                        var first = responses.First();
                        Assert.That(first.Key, Is.Null);
                        Assert.That(first.Offset, Is.EqualTo(2));
                        Assert.That(first.Partition, Is.EqualTo(0));
                        Assert.That(first.Topic, Is.EqualTo(topic));
                        Assert.That(first.Value, Is.EqualTo("3"));

                        await secondCommit.CommitAsync(new[] {
                            new TopicPartitionOffset {
                                Topic = topic, Partition = 0, Offset = 2
                            }
                        }, CancellationToken.None);;
                    }

                    {
                        var thirdCommit = KafkaConsumer.Create(defaultConsumerGroup, brokers, valueSerializer,
                                                               new TopicSelector
                        {
                            Partition = 0,
                            Topic     = topic,
                            DefaultOffsetSelection = OffsetSelectionStrategy.NextUncommitted,
                            FailureOffsetSelection = OffsetSelectionStrategy.Earliest
                        });

                        var responses = await thirdCommit.ReceiveAsync(CancellationToken.None);

                        Assert.That(responses, Is.Not.Null);
                        Assert.That(responses, Has.Count.EqualTo(0));
                    }
                }
        }