2015-01-16 4 views
0

Мне нужно написать программу 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, который является лучшим способом справиться с созданием темы и включает в себя блокировки.

+1

Сколько работы связано с созданием темы кафки? Если это требует много ресурсов, и вам нужно избегать повторного использования, но не хотите использовать блокировки, а затем сделайте хэш-карту локальной для каждого потока. Лучшее обоих миров. – Upio

+0

Не так много, я просто добавляю 3-4 свойства с полем внутри события (eventCategory), но просто думаю, может ли он быть большим, когда тысячи событий. – abhishek08aug

+0

Использование местных HashMaps - хорошая идея кстати. :) – abhishek08aug

ответ

1

Короткий ответ: наличие всех потоков для одного замка для каждого обработанного события, вероятно, будет медленнее. Не зная больше, генерация имени темы, вероятно, очень быстро.

Длинный ответ: Если возможно, попробуйте создать параллельные приложения, в которых потоки обмениваются как можно меньше. Совместное использование такого состояния во всех рабочих потоках будет создавать много споров.

Если генерация этой темы занимает много времени, то кэширование - это хорошая идея. Однако, если есть только 20 тем, вы должны кэшировать их локально для каждого потока, чтобы избежать того, чтобы каждый поток конкурировал за одну и ту же блокировку для каждого обрабатываемого события.

Базовая модель будет заключаться в том, чтобы отделить потребителей и производителей от некоторой параллельной очереди. Попросите потребителей запустить свою собственную нить, но не поделиться ими с другими потребителями. Потребители могут кэшировать сопоставления локально, если это необходимо.

Смежные вопросы