Мне нужно написать программу ETL для данных событий, которые загружают события в Kafka, поэтому в вызове загрузчика я получаю массив событий. Внутри загрузчика мне нужно посмотреть каждое событие и на основе определенных параметров мне нужно определить свою категорию, которая имеет взаимно однозначное сопоставление с какой-то темой Кафки, где она должна быть написана. Для них не более 20 вопросов Кафки.Может ли включение замков ухудшить производительность?
Так мои сомнения, должен ли я кэш темы видела в карте, как показано ниже: (Давайте не считать, что я начал не из нитей, чтобы разделить события между ними и попытаться загрузить в Кафка параллельно.)
class Loader {
private static Map<String, String> eventCategoryVsKafkaTopic = new HashMap<String, String>();
ReadWriteLock lock = new ReentrantReadWriteLock();
public static void load(IEvent[] events) {
for(IEvent[] event) {
String eventCategory = getEventCategory(event);
lock.readLock().lock();
if(eventCategoryVsKafkaTopic.get(eventCategory) != null) {
loadToKafka(event, eventCategoryVsKafkaTopic.get(eventCategory));
}
lock.readLock().unlock();
String kafkaTopic = generateKafkaTopicFromEvent(event);
loadToKafka(event, kafkaTopic);
lock.writeLock().lock();
eventCategoryVsKafkaTopic.put(eventCategory, kafkaTopic); // Its fine, if some other thread has written it in between, as the topic will be the same so overwrite is not an issue
lock.writeLock().unlock();
}
}
}
Я чувствую, что эта блокировка будет чрезмерной и может ухудшить производительность, а если я просто создаю тему «на лету» каждый раз, как показано ниже: (Снова предположим, что я начал нет нитей и распределенных событий среди них для загрузки параллельно)
class Loader {
public static void load(IEvent[] events) {
for(IEvent[] event) {
String kafkaTopic = generateKafkaTopicFromEvent(event);
loadToKafka(event, kafkaTopic);
}
}
}
Прошу прошу gest, который является лучшим способом справиться с созданием темы и включает в себя блокировки.
Сколько работы связано с созданием темы кафки? Если это требует много ресурсов, и вам нужно избегать повторного использования, но не хотите использовать блокировки, а затем сделайте хэш-карту локальной для каждого потока. Лучшее обоих миров. – Upio
Не так много, я просто добавляю 3-4 свойства с полем внутри события (eventCategory), но просто думаю, может ли он быть большим, когда тысячи событий. – abhishek08aug
Использование местных HashMaps - хорошая идея кстати. :) – abhishek08aug