2017-08-24 22 views
0

我們目前使用Cassandra作爲NoSQL數據庫和GemFire作爲內存數據庫。我們一直使用GemFire CacheWriter在Cassandra中插入記錄。我希望得到您的反饋意見,說明在CacheWriter中使用Concurrent線程來插入/更新記錄是否是一個好的工程實踐。您對此的反饋將不勝感激。GemFire CacheWriter中的並行線程

public class GenericWriter<K, V> extends CacheWriterAdapter<K, V> implements Declarable { 

    private static Logger log = LoggerFactory.getLogger(GenericWriter.class); 

    @Autowired 
    private CassandraOperations cassandraOperations; 

    ExecutorService executor = null; 

    @Override 
    public void beforeCreate(EntryEvent<K, V> e) { 

    executor = Executors.newSingleThreadExecutor(); 

     executor.submit(() -> { 
      if (eventOperation.equals("CREATE") || eventOperation.equalsIgnoreCase("PUTALL_CREATE")) { 
       try { 
        cassandraOperations.insert(e.getNewValue()); 
       } catch (CassandraConnectionFailureException | CassandraWriteTimeoutException 
         | CassandraInternalException cassException) { 
       } catch (Exception ex) { 
        log.error("Exception in GenericCacheWriter->" + ExceptionUtils.getStackTrace(ex)); 
        throw ex; 
       } 
      } 
     }); 
     executor.shutdown(); 
    } 

    @Override 
    public void init(Properties arg0) { 
     // TODO Auto-generated method stub 

    } 
} 
+0

兩個答案都是正確的。任何人都可以告訴我接受這兩種方式 – Vigneshwaran

回答

1

是的,這是一個很好的模式,但刪除執行程序並對數據進行分區,以使GemFire的所有更新都進入一個並且只有一個節點。以同樣的方式分區Cassandra。在Cassandra更新周圍寫入鎖定。僅在吞吐量較低時才使用此功能。

如果您需要高吞吐量,請使用AsyncEventListener並保證最終一致性。如果您必須在AEL中使用Executors,請以某種方式使用它們,以便在主線程中引發異常。如果更新在多次嘗試後失敗,則將失敗的條目寫入其他區域,過期時間爲幾秒或一分鐘。當到期時,重試該操作。繼續這樣做直到成功,然後才能刪除過期條目。

如果更新順序對您很重要,您將需要跟蹤版本號和正在更新的舊值/新值。

3

CacheWriter處理程序同步調用,因此應用程序無法繼續,直到處理程序返回。因此,不建議在此偵聽器中執行長時間運行的操作。如果需要長時間運行,請考慮通過AsyncEventListener異步處理操作。

使用ExecutorService將執行委託給其他線程是可能的,但它是反模式,因爲它不再實現fail-fast屬性,並且事件的處理不再同步,所以它的計時相對於應用程序完成該事件而言,不能得到保證。

您可以在Geode Wiki中詳細瞭解該主題,特別是在CacheWrite and CacheListener Best Practices

希望這會有所幫助。

此致敬禮。

+0

同意這種方法;使用AEQ + AsyncEventListener是更合適的解決方案。這就是所謂的「後寫」。詳情請參閱文檔... http://gemfire.docs.pivotal.io/geode/developing/events/implementing_write_behind_event_handler.html –