gpt4 book ai didi

java - 合并锁会降低性能吗?

转载 作者:行者123 更新时间:2023-12-01 12:00:47 25 4
gpt4 key购买 nike

我必须为事件数据编写一个 ETL 程序,将事件加载到 Kafka 中,因此在加载器调用中我得到了一组事件。在加载器内部,我需要查看每个事件,并根据某些参数,我需要确定其类别,该类别与一些 Kafka 主题具有一对一的映射,应该将其写入何处。它们不超过 20 个 Kafka 主题可供写入。

所以我的疑问是我是否应该缓存在 map 中看到的主题,如下所示:(假设我已经启动了一些线程来划分它们之间的事件并尝试并行加载到 Kafka)

    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);
}
}
}

请建议哪种方法是处理主题生成的更好方法,并且在这里涉及锁是一个好主意。

最佳答案

简短的回答:让所有线程为每个处理的事件竞争一个锁可能会更慢。在不了解更多信息的情况下,生成主题名称可能非常快。

长答案:如果可能,尝试构建并发应用程序,其中线程通信尽可能少。在所有工作线程之间共享这样的状态将会产生很多争用。

如果生成该主题需要花费大量时间,那么缓存它是一个好主意。但是,如果只有 20 个主题,那么您应该将其缓存到每个线程本地,以避免每个线程为正在处理的每个事件争夺相同的锁。

基本模型是通过一些并发队列将消费者和生产者分开。让消费者在自己的线程中运行,但不与其他消费者共享状态。如果需要,消费者可以在本地缓存映射。

关于java - 合并锁会降低性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27992610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com