Я создал тему в Kafka с 9 разделами, назвав ее «test», и собрал два простых приложения в C # (.NET Core), используя клиентскую библиотеку Confluent.Kafka
: производителя и потребителя.Я сделал чуть больше, чем просто примеры из документации .
Я запускаю два экземпляра приложения-потребителя и один экземпляр производителя.Я не вижу особого смысла вставлять здесь потребительский код, это тривиальное приложение «получить сообщение, напечатать его на экране», однако оно также печатает номер раздела, с которого пришло сообщение.
Это приложение производителя:
static async Task Main(string[] args)
{
var random = new Random();
var config = new ProducerConfig {
BootstrapServers = "10.0.0.5:9092",
Partitioner = Partitioner.ConsistentRandom
};
int counter = 0;
while (true)
{
using (var p = new ProducerBuilder<string, string>(config).Build())
{
try
{
p.BeginProduce(
"test",
new Message<string, string>
{
//Key = random.Next().ToString(),
Value = $"test {++counter}"
});
if (counter % 10 == 0)
p.Flush();
}
catch (ProduceException<Null, string> e)
{
Console.WriteLine($"Delivery failed: {e.Error.Reason}");
}
}
}
}
Проблема: Если свойство сообщения Key
не установлено, все сообщения отправляются на номер раздела 7, что означает, что одиниз моих потребительских экземпляров простаивает.Мне пришлось вручную рандомизировать ключ, чтобы распределить их по разделам (см. Закомментированную строку).(Исходный код, скопированный из документации, использовал Null
в качестве типа ключа, и это также отправляло все сообщения в 7-й раздел.)
Почему это так?Согласно документации свойства ProducerConfig.Partitioner
, опция consistent_random
должна обеспечивать случайное распределение, если ключ не указан.Я попытался использовать опцию Partioner.Random
, которая должна использовать случайное распределение независимо от ключа, но это не помогло.
Является ли это ожидаемым поведением, я делаю что-то неправильно или я столкнулся с ошибкой?
Я использую Confluent.Kafka NuGet версии 1.0.0-RC2.
Полная документация конфигурации Partitioner:
// Summary:
// Partitioner: `random` - random distribution, `consistent` - CRC32 hash of key
// (Empty and NULL keys are mapped to single partition), `consistent_random` - CRC32
// hash of key (Empty and NULL keys are randomly partitioned), `murmur2` - Java
// Producer compatible Murmur2 hash of key (NULL keys are mapped to single partition),
// `murmur2_random` - Java Producer compatible Murmur2 hash of key (NULL keys are
// randomly partitioned. This is functionally equivalent to the default partitioner
// in the Java Producer.). default: consistent_random importance: high