簡體   English   中英

合並鎖會降低性能嗎?

[英]Could incorporating locks degrade performance?

我必須為事件數據編寫一個ETL程序,將事件加載到Kafka中,因此在加載程序調用中,我得到了一個事件數組。 在加載程序內部,我需要查看每個事件,並基於某些參數,我需要確定其類別,該類別與應在何處編寫的一些Kafka主題具有一對一的映射。 它們是不超過20個要寫的Kafka主題。

因此,我的疑問是我是否應該緩存在地圖中看到的主題,如下所示:(假設我已經啟動了一些線程來在其中划分事件,然后嘗試並行加載到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個主題,則應將其本地緩存到每個線程中,以避免每個線程針對正在處理的每個事件競爭同一個鎖。

一個基本模型是通過一些並發隊列將消費者和生產者分開。 讓使用者在自己的線程中運行,但不與其他使用者共享任何狀態。 消費者可以根據需要在本地緩存映射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM